Blitz3D+ Command Reference

SetWorldEditorViewProjection view,projection[,span#][,active]

Parameters

view - live World Editor view handle

projection - projection kind:
1: perspective
2: orthographic

span# (optional) - horizontal orthographic extent in world units, 0.002 to 200000; 24 (default)

active (optional) - whether this view draws pointer/marquee overlays; True (default)

Description

Sets the projection used by live rendering and picking.

Requires the host capability view.orthographic.v1; simultaneous views require view.multiple.v1. Each view keeps its own camera and projection. FreeWorldEditorView releases only that view's presentation target. Selection highlights remain visible in all views; active controls only the pointer overlay.

Handles are context-owned and reject stale or wrong-kind values.

For the full story, see the Debug World Editor guide.

Requires Extended mode.

See also: SetWorldEditorViewCamera, CreateWorldEditorView, WorldEditorSessionCapabilities.

Example

; OpenWorldEditorSession Example
; ------------------------------
; Requires Extended mode.

; A minimal custom World Editor client. DebugWorld launches this program
; with a --session descriptor; it opens the session, shows a live view,
; and demonstrates the whole session/view/request family.

Const EVENT_MOUSE_DOWN=$201
Const EVENT_GADGET_ACTION=$401
Const EVENT_WINDOW_CLOSE=$803

descriptor$=SessionArgument()
If descriptor="" Then RuntimeError "This custom editor must be launched by DebugWorld"

; The short-lived descriptor is consumed and authenticated exactly once
session=OpenWorldEditorSession(descriptor)
If session=0 Then RuntimeError WorldEditorSessionError()

; The negotiated capability object tells the client what the host supports
capabilities=WorldEditorSessionCapabilities(session)
capability_count=JsonCount(capabilities)
FreeJson capabilities

window=CreateWindow("Custom World Editor",100,100,800,560,0,15)
canvas=CreateCanvas(0,64,ClientWidth(window),ClientHeight(window)-64,window)
SetGadgetLayout canvas,1,1,1,1
pause_button=CreateButton("Pause",8,6,90,24,window)
continue_button=CreateButton("Continue",106,6,90,24,window)
projection_button=CreateButton("Orthographic",204,6,120,24,window)
follow_button=CreateButton("Look through pick",332,6,140,24,window)
status_label=CreateLabel("Session opened; capabilities: "+capability_count,8,36,780,20,window)

; Bind a live host-rendered view to the canvas and place its free camera
view=CreateWorldEditorView(session,canvas)
SetWorldEditorViewCamera view,0,3,-8,0.2,0,5
projection=1
SetWorldEditorViewProjection view,projection,24,True

running=True
request=0
request_kind$=""
last_pick$=""
following=False
status$="Click the view to pick an entity"

While running

    event=WaitEvent(16)

    If event=EVENT_WINDOW_CLOSE Then running=False

    If event=EVENT_GADGET_ACTION And EventSource()=projection_button
        ; Toggle between perspective (1) and orthographic (2) projection
        projection=3-projection
        SetWorldEditorViewProjection view,projection,24,True
        If projection=1 Then SetGadgetText projection_button,"Orthographic" Else SetGadgetText projection_button,"Perspective"
    EndIf

    ; Render through the last picked entity (pick a camera first), or back
    ; through the detached editor camera
    If event=EVENT_GADGET_ACTION And EventSource()=follow_button
        following=Not following
        If following And last_pick<>""
            SetWorldEditorViewEntity view,Long(last_pick)
            SetGadgetText follow_button,"Editor camera"
        Else
            following=False
            SetWorldEditorViewEntity view,0
            SetGadgetText follow_button,"Look through pick"
        EndIf
    EndIf

    If event=EVENT_GADGET_ACTION And request=0
        ; Pause/Continue are asynchronous value-only requests to the host
        If EventSource()=pause_button Or EventSource()=continue_button
            payload=CreateJsonObject()
            If EventSource()=pause_button Then request=SendWorldEditorRequest(session,"pause",payload)
            If EventSource()=continue_button Then request=SendWorldEditorRequest(session,"continue",payload)
            FreeJson payload
            request_kind="action"
        EndIf
    EndIf

    If event=EVENT_MOUSE_DOWN And EventSource()=canvas And request=0
        ; Queue an engine-camera pick at the clicked canvas pixel
        request=PickWorldEditorView(view,EventX(),EventY())
        request_kind="pick"
    EndIf

    ; Service the outstanding request without blocking
    If request<>0 And WorldEditorRequestState(request)>=WORLD_EDITOR_REQUEST_SUCCEEDED
        result=WorldEditorRequestResult(request)
        If result=0
            status=request_kind+" request: "+WorldEditorRequestError(request)
            FreeWorldEditorRequest request
            request=0
        Else
            picked_id$=MemberText(result,"id")
            FreeJson result
            FreeWorldEditorRequest request
            request=0
            If request_kind="pick" And picked_id<>""
                ; Highlight the picked entity and ask for its framing bounds
                SetWorldEditorViewSelection view,Long(picked_id)
                request=WorldEditorViewBounds(view,Long(picked_id))
                request_kind="bounds"
                status="Picked entity "+picked_id
                last_pick=picked_id
            ElseIf request_kind="bounds"
                status=status+" - bounds received"
            Else
                status=request_kind+" request succeeded"
            EndIf
        EndIf
    EndIf

    ; Session events (hierarchy changes, host notifications) arrive as JSON
    session_event=PollWorldEditorEvent(session)
    If session_event<>0
        status="Event: "+Left(JsonStringify(session_event),60)
        FreeJson session_event
    EndIf

    ; Show live session health and both observed revisions
    state=WorldEditorSessionState(session)
    If state=WORLD_EDITOR_SESSION_CLOSED Then running=False
    If state=WORLD_EDITOR_SESSION_FAILED
        status="Session failed: "+WorldEditorSessionError(session)
        running=False
    EndIf
    If WorldEditorViewState(view)=WORLD_EDITOR_VIEW_FAILED Then status="View failed: "+WorldEditorViewError(view)
    SetGadgetText status_label,"State "+state+"  Revision "+WorldEditorSessionRevision(session)+"  Hierarchy "+WorldEditorSessionHierarchyRevision(session)+"  |  "+status

    RenderWorldEditorView view

Wend

; An unfinished request can be cancelled before its host operation commits
If request<>0
    CancelWorldEditorRequest request
    FreeWorldEditorRequest request
EndIf
FreeWorldEditorView view
CloseWorldEditorSession session
FreeGadget window

End

; Extract the descriptor that DebugWorld passes after --session
Function SessionArgument$()
    command$=CommandLine$()
    position=Instr(Lower(command),"--session")
    If position=0 Then Return ""
    position=position+9
    While position<=Len(command) And Mid(command,position,1)=" "
        position=position+1
    Wend
    If Mid(command,position,1)=Chr(34)
        finish=Instr(command,Chr(34),position+1)
        Return Mid(command,position+1,finish-position-1)
    EndIf
    Return Mid(command,position)
End Function

; Read one string member from a caller-owned JSON object
Function MemberText$(json,key$)
    If JsonObjectHas(json,key)=0 Then Return ""
    member=JsonObjectGet(json,key)
    If member=0 Then Return ""
    value$=JsonText(member)
    FreeJson member
    Return value
End Function

Index