Blitz3D+ Command Reference

PhysicsQueryFilter query,category_bits,mask_bits[,ignored_body][,include_sensors]

Parameters

query - query handle

category_bits - signed Int pattern for the query category bits

mask_bits - signed Int pattern for accepted shape categories

ignored_body (optional) - body to exclude, or 0 (optional; 0) (default)

include_sensors (optional) - True to include sensors; False by default (optional; 0) (default)

Description

Sets which bodies and shapes a query's future runs can hit.

Sets category/mask bits, an optional ignored body and sensor inclusion for future world ray/sweep/overlap runs. Explicit closest-point, shape-distance, current-contact and sensor-occupancy inspections ignore these search settings. Simulation collision filters still determine contacts and occupants. Defaults for the optional arguments are ignored_body=0 (none) and include_sensors=False. Each Int is interpreted as an unsigned 32-bit pattern: -1 selects all bits, and -2147483648 selects bit 31. Zero category or mask accepts nothing.

The ignored body must initially be a live body in the same world. All its shapes are excluded before closest-hit selection. If later deleted, the saved identity cannot accidentally exclude a replacement body. Filter changes retain existing results until rerun.

Queries use two-sided category/mask filtering in the existing 32-bit domain, plus optional ignored-body, sensor and target rules. Collision groups and joints do not override query masks. Disabled bodies are absent from world queries. Existing shape filters default to all category bits; assign explicit shape categories when separating groups.

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, PhysicsQueryTarget, QueryPhysicsRay, QueryPhysicsSphere, PhysicsQueryLimit.

Example

; PhysicsQueryFilter 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)

    ; Odd crates are green and in collision category 2; even crates stay in category 1
    If i Mod 2
        EntityColor crate,120,200,140
        PhysicsShapeFilter crate_shape,2,-1
    EndIf
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

    ; F makes the query skip category 2, so the ray passes through green crates
    If KeyHit(33)
        skip=Not skip
        If skip
            PhysicsQueryFilter query,-1,1
        Else
            PhysicsQueryFilter query,-1,-1
        EndIf
    EndIf

    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   F: skip green   Esc: exit"
    Text 0,20,"Skipping green crates: "+skip
    Text 0,40,"PhysicsQueryFilter query,-1,"+(1-2*(skip=0))

    Flip

Wend

FreePhysicsWorld world
End

Index