Blitz3D+ Command Reference

LineDepthMode line_list[,mode]

Parameters

line_list - a line-list entity created with CreateLineList

mode (optional) - how the list's lines interact with scene depth
0: overlay - drawn after the scene with depth testing and writing off, so lines show through everything
1: depth test (default) - drawn after opaque scene geometry, hidden behind closer surfaces, never writes depth
2: depth write - drawn before ordinary scene geometry with depth testing and writing on
3: always write - drawn before ordinary scene geometry, always passes the depth test and writes depth

Description

Sets how a line list's lines interact with the scene's depth buffer.

Most of the time the default mode 1 is right: lines behave like solid objects and hide behind walls, but never block anything themselves.

Mode 0 turns the list into a pure overlay that shows through all geometry - ideal for a selection outline or a path the player must never lose sight of.

Modes 2 and 3 make the lines write depth, so scene geometry drawn afterwards can be occluded by them, and they render before the ordinary scene rather than after it. Mode 3 additionally always passes its own depth test. Its special trick is editor-style ground grids: a grid drawn exactly in a floor plane normally flickers with z-fighting, but an always-write grid lays its depth down first and later geometry occludes it cleanly, with no need to nudge the grid above the floor.

A mode outside 0-3 stops the program with a runtime error, as does passing an entity that is not a line list. The setting covers every line in the list; use separate lists for mixed behaviour.

Requires Extended mode.

See also: LineWidth, CreateLineList, DebugLine.

Example

; LineDepthMode Example
; ---------------------
; Requires Extended mode.

Graphics3D 640,480,0,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,1,-7

light=CreateLight()
RotateEntity light,45,45,0

; A spinning crate with a targeting line passing straight through it
crate=CreateCube()
PositionEntity crate,0,0,2
EntityColor crate,180,130,70

lines=CreateLineList()
AddLine lines,-4,0,2,4,0,2
EntityColor lines,255,210,40
LineWidth lines,4

mode=1

While Not KeyDown(1)

    ; [ and ] cycle through the four depth modes
    If KeyHit(26) Then mode=(mode+3) Mod 4
    If KeyHit(27) Then mode=(mode+1) Mod 4

    ; LineDepthMode controls how the line interacts with scene depth
    LineDepthMode lines,mode

    TurnEntity crate,0,1,0

    ; A short label for each documented mode
    Select mode
        Case 0
            label$="overlay - ignores depth, always on top"
        Case 1
            label$="default - hidden inside the crate, drawn after the scene"
        Case 2
            label$="early - depth tested and written before the scene"
        Case 3
            label$="grid - always passes, writes depth for later geometry"
    End Select

    ; Arrow keys move the camera
    If KeyDown(200) Then MoveEntity camera,0,0,0.1
    If KeyDown(208) Then MoveEntity camera,0,0,-0.1
    If KeyDown(203) Then TurnEntity camera,0,1,0
    If KeyDown(205) Then TurnEntity camera,0,-1,0

    RenderWorld

    Text 0,0,"Arrow keys: move camera   [ / ] : depth mode   Esc: exit"
    Text 0,20,"LineDepthMode lines,"+mode+"   ("+label+")"

    Flip

Wend

End

Index