Blitz3D+ Command Reference

PhysicsQueryContactFeature ( query,manifold,point )

Parameters

query - owned query handle

manifold - one-based manifold index

point - one-based point index within the manifold

Description

Returns the copied native 32-bit point feature ID as a signed Int bit pattern.

It identifies a matching feature in the context of a shape pair; it is not a globally unique handle or permanent manifold index. Query results are copied and survive stepping, other queries and deletion until this query runs successfully again or is freed. Generation-checked identity getters return zero for deleted objects; copied tags and numerical fields survive. Failed runs retain the complete previous payload. Freeing the owning world frees its queries.

Invalid/stale/wrong-kind handles, invalid indices or unavailable payload fields raise runtime errors.

Requires Extended mode.

See also: QueryPhysicsBodyContacts, QueryPhysicsShapeContacts, QueryPhysicsSensor, CountPhysicsQueryManifolds, PhysicsBodyEvents.

Example

; PhysicsQueryContactFeature 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,-7
RotateEntity camera,20,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)

; An orange crate on the floor, with a green crate resting on top
crate=CreateCube()
ScaleEntity crate,0.6,0.6,0.6
EntityColor crate,255,120,70
crate_body=CreatePhysicsBody(world,crate,PHYSICS_DYNAMIC)
crate_shape=PhysicsBodyBox(crate_body,1.2,1.2,1.2)
top=CreateCube()
ScaleEntity top,0.4,0.4,0.4
EntityColor top,120,200,140
top_body=CreatePhysicsBody(world,top,PHYSICS_DYNAMIC)
top_shape=PhysicsBodyBox(top_body,0.8,0.8,0.8)
ResetPhysicsBody crate_body,0,0.6,0,0,0,0
ResetPhysicsBody top_body,0,1.6,0,0,0,0

; A query object keeps a copy of the contacts it finds
query=CreatePhysicsQuery(world)

While Not KeyDown(1)

    ; Space shoves the orange crate along the floor, R stacks the crates again
    If KeyHit(57) Then PhysicsBodyImpulse crate_body,4,0,0
    If KeyHit(19)
        ResetPhysicsBody crate_body,0,0.6,0,0,0,0
        ResetPhysicsBody top_body,0,1.6,0,0,0,0
    EndIf

    StepPhysics world,1.0/60.0,4

    ; Copy the orange crate's contacts: one manifold for each shape it touches
    manifolds=QueryPhysicsBodyContacts(query,crate_body)

    ; 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

    ; Ring every contact point
    For m=1 To manifolds
        For p=1 To PhysicsQueryContactPoints(query,m)
            CameraProject camera,PhysicsQueryContactX(query,m,p),PhysicsQueryContactY(query,m,p),PhysicsQueryContactZ(query,m,p)
            Oval ProjectedX()-3,ProjectedY()-3,7,7,False
        Next
    Next

    Text 0,0,"Arrow keys: move camera   Space: shove   R: reset   Esc: exit"
    For m=1 To manifolds
        Text 0,20+(m-1)*20,"Manifold "+m+": "+"point 1 feature ID "+PhysicsQueryContactFeature(query,m,1)
    Next
    Text 0,20,"(IDs let you match a point from one step to the next)"

    Flip

Wend

FreePhysicsWorld world
End

Index