|
view - World Editor view handle x# - world-space camera X position y# - world-space camera Y position z# - world-space camera Z position pitch# - camera pitch in radians yaw# - camera yaw in radians zoom# - editor navigation speed hint |
|
Sets the detached host camera used by rendering and picking. It never changes a camera entity in the target world. Handles are context-owned and reject stale or wrong-kind values. For the full story, see the Debug World Editor guide. See also: CreateWorldEditorView, SetWorldEditorViewProjection, RenderWorldEditorView. |
; OpenWorldEditorSession Example
; ------------------------------
; 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