Blitz3D+ Command Reference

PhysicsQueryMaterialHigh ( query,index )

Parameters

query - query handle

index - one-based hit index

Description

Returns the high 32 bits of a ray or sweep hit's material ID.

Returns the high 32 bits of the native 64-bit user material ID at a ray/sweep hit, as a signed Int bit pattern. PhysicsQueryMaterialLow supplies the low 32 bits. Both halves are copied, remain valid after deletion, and default to zero for native default materials. Overlap hits have no per-hit material and raise an error.

Results are copied. They survive StepPhysics and other queries until this query runs successfully again or is freed. Failed runs preserve the previous results. Freeing the owning world frees its queries. Invalid/stale/wrong-kind handles and invalid hit indices raise runtime errors.

Requires Extended mode.

See also: CreatePhysicsQuery, PhysicsQueryFilter, PhysicsQueryTarget, QueryPhysicsRay, QueryPhysicsSphere, PhysicsQueryLimit.

Example

; PhysicsQueryMaterialHigh Example
; --------------------------------
; Requires Extended mode.

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

Const PHYSICS_STATIC=0
Const PHYSICS_DYNAMIC=2

camera=CreateCamera()
PositionEntity camera,0,7,-8
RotateEntity camera,40,0,0

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

; An independent Box3D world with standard gravity
world=CreatePhysicsWorld()

; Blue static floor
ground=CreateCube()
ScaleEntity ground,6,0.5,6
PositionEntity ground,0,-0.5,0
EntityColor ground,80,160,255
ground_body=CreatePhysicsBody(world,ground,PHYSICS_STATIC)
ground_shape=PhysicsBodyBox(ground_body,12,1,12)

; A ring of crates to aim at
For i=1 To 8
    crate=CreateCube()
    ScaleEntity crate,0.5,0.5,0.5
    PositionEntity crate,Cos(i*45)*4,0.5,Sin(i*45)*4
    EntityColor crate,255,120,70
    crate_body=CreatePhysicsBody(world,crate,PHYSICS_STATIC)
    crate_shape=PhysicsBodyBox(crate_body,1,1,1)

    ; Give each crate an application material ID: low word = crate number, high word = 7
    PhysicsShapeMaterialId crate_shape,i,7
Next

; A query object runs searches and keeps a copy of their results
query=CreatePhysicsQuery(world)

; Start aimed at a crate
angle#=45

While Not KeyDown(1)

    ; A and D sweep the ray around the centre
    If KeyDown(30) Then angle=angle+1.5
    If KeyDown(32) Then angle=angle-1.5
    dx#=Cos(angle)*6
    dz#=Sin(angle)*6

    StepPhysics world,1.0/60.0,4

    ; Cast a ray 6 m out from the centre, half a metre above the floor
    hits=QueryPhysicsRay(query,0,0.5,0,dx,0,dz)

    ; 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

    ; Draw the ray from the centre to the first hit, or to its full length
    CameraProject camera,0,0.5,0
    start_x=ProjectedX()
    start_y=ProjectedY()
    If hits>0
        CameraProject camera,PhysicsQueryX(query,1),PhysicsQueryY(query,1),PhysicsQueryZ(query,1)
    Else
        CameraProject camera,dx,0.5,dz
    EndIf
    Line start_x,start_y,ProjectedX(),ProjectedY()

    Text 0,0,"Arrow keys: move camera   A / D: sweep the ray   Esc: exit"
    If hits>0
        Text 0,20+0,"PhysicsQueryMaterialHigh(query,1) = "+PhysicsQueryMaterialHigh(query,1)
        Text 0,20+20,"(low word "+PhysicsQueryMaterialLow(query,1)+", the crate number)"
    Else
        Text 0,20,"The ray hits nothing"
    EndIf

    Flip

Wend

FreePhysicsWorld world
End

Index