Blitz3D+ Command Reference

ValidatePhysicsRecording ( file$[,workers] )

Parameters

file$ - recording file saved by StopPhysicsRecording

workers (optional) - worker threads for the replay world, 1 to 32; 1 (default)

Description

Replays a saved physics recording and checks it reproduces identical results.

A fresh, hidden world is stood up from the recording's starting snapshot, every recorded operation is replayed, and the resulting state is checked against the hashes embedded in the file. Returns True when everything matches, False if the replay diverged. Your live physics worlds are never touched.

Run it after StopPhysicsRecording to prove the simulation is deterministic - the foundation for replays and lockstep multiplayer - or on another machine to check a build reproduces a captured bug. A recording that cannot be loaded raises a runtime error.

Requires Extended mode.

See also: StartPhysicsRecording, StopPhysicsRecording, PhysicsWorkers.

Example

; ValidatePhysicsRecording Example
; --------------------------------
; Requires Extended mode.

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

Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2

camera=CreateCamera()
PositionEntity camera,0,3,-6

light=CreateLight()
RotateEntity light,45,-30,0
AmbientLight 50,50,50

world=CreatePhysicsWorld()
PhysicsGravity world,0,-9.81,0

; Static ground slab
ground=CreateCube()
ScaleEntity ground,4,0.5,4
PositionEntity ground,0,-0.5,5,True
EntityColor ground,80,160,255
ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC)
ground_shape=PhysicsBodyBox(ground_body,8,1,8,0)

; A bouncy ball gives the recording something to capture
ball=CreateSphere(16)
ScaleEntity ball,0.5,0.5,0.5
PositionEntity ball,0,4,5,True
EntityColor ball,255,120,70
ball_body=CreatePhysicsBody(world,ball,PHYSICS_DYNAMIC)
ball_shape=PhysicsBodySphere(ball_body,1,1)
PhysicsShapeRestitution ball_shape,0.7

recording_file$="physics_example.b3rec"

; Begin capturing a deterministic recording of the simulation
StartPhysicsRecording world
recording=1
frames=0
saved=0
valid=0

While Not KeyDown(1)

    If recording
        frames=frames+1
        ; Space (or 300 recorded frames) stops and validates the recording
        If KeyHit(57) Or frames>=300
            saved=StopPhysicsRecording(world,recording_file)
            valid=ValidatePhysicsRecording(recording_file,1)
            recording=0
        EndIf
    Else
        ; Space re-drops the ball and starts a fresh recording
        If KeyHit(57)
            FreePhysicsBody ball_body
            PositionEntity ball,0,4,5,True
            ball_body=CreatePhysicsBody(world,ball,PHYSICS_DYNAMIC)
            ball_shape=PhysicsBodySphere(ball_body,1,1)
            PhysicsShapeRestitution ball_shape,0.7
            StartPhysicsRecording world
            recording=1
            frames=0
        EndIf
    EndIf

    StepPhysics world,1.0/60.0,4

    ; 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

    If recording
        Text 0,0,"Space: stop and validate   Arrow keys: move camera   Esc: exit"
        Text 0,20,"Recording frame "+frames+"   (stop to run ValidatePhysicsRecording)"
    Else
        Text 0,0,"Space: record again   Arrow keys: move camera   Esc: exit"
        Text 0,20,"ValidatePhysicsRecording(recording_file$,1) = "+valid+"   Saved: "+saved
    EndIf

    Flip

Wend

; Tidy up the recording file the example created
If FileType(recording_file)=1 Then DeleteFile recording_file
FreePhysicsWorld world
End

Index