Blitz3D+ Command Reference

CanvasCamera ( canvas )

Parameters

canvas - a GUI canvas attached to 3D with Graphics3DCanvas

Description

Returns the camera bound to a 3D GUI canvas, or 0.

This is part of the GUI canvas system. It reports what SetCanvasCamera last bound: the camera that RenderWorldToCanvas will draw into this canvas, or 0 when the canvas uses the world's normal all-camera rendering order. A multi-view editor uses it to toggle bindings ("if the front camera is bound, swap to the top camera") and to label each view without keeping its own bookkeeping.

Expect 0 more often than you might think: a binding is cleared automatically whenever its camera, world, canvas, parent window, or the graphics service is freed, so a stored "which camera did I bind?" variable can go stale while CanvasCamera never does. Asking about a canvas that is not 3D-attached with Graphics3DCanvas is a runtime error.

Like the rest of the canvas system, this belongs in a GUI event-loop program: WaitEvent to stay responsive, RenderWorldToCanvas to draw, FlipCanvas to present.

Requires Extended mode.

See also: SetCanvasCamera, RenderWorldToCanvas, Graphics3DCanvas, CanvasBuffer, FlipCanvas.

Example

; CanvasCamera Example
; --------------------
; Requires Extended mode.

Const EVENT_WINDOW_CLOSE=$803

; Build a GUI window with a 3D canvas and a status label
window=CreateWindow("CanvasCamera",100,100,640,480,0,15)
canvas=CreateCanvas(8,8,608,396,window)
label=CreateLabel("",8,412,608,36,window)
Graphics3DCanvas canvas

world=GetWorld()

; Two cameras give two different views of the same scene
front_camera=CreateCamera()
PositionEntity front_camera,0,1,-5
top_camera=CreateCamera()
CameraProjMode top_camera,2
PositionEntity top_camera,0,8,0
RotateEntity top_camera,90,0,0
light=CreateLight()
RotateEntity light,45,45,0
cube=CreateCube()
PositionEntity cube,0,1,0
EntityColor cube,80,165,240

; Bind the front camera to the canvas to start with
SetCanvasCamera canvas,front_camera
last_bound=0

running=True
While running

    ; Pump GUI events so the window stays responsive
    event=WaitEvent(1)
    While event<>0
        If event=EVENT_WINDOW_CLOSE And EventSource()=window Then running=False
        event=PeekEvent()
    Wend
    If KeyHit(1) Then running=False

    ; Space binds whichever camera is not bound right now
    If KeyHit(57)
        If CanvasCamera(canvas)=front_camera Then SetCanvasCamera canvas,top_camera Else SetCanvasCamera canvas,front_camera
    EndIf

    ; CanvasCamera reports the camera currently bound to the canvas
    bound=CanvasCamera(canvas)
    If bound<>last_bound
        If bound=front_camera Then view$="the front camera" Else view$="the top camera"
        SetGadgetText label,"CanvasCamera(canvas) = "+bound+" - "+view+"   Space: swap   Esc: exit"
        last_bound=bound
    EndIf

    TurnEntity cube,0,1,0
    RenderWorldToCanvas canvas,world
    FlipCanvas canvas,True

Wend

EndGraphics
FreeGadget window
End

Index