QueryPhysicsSensor ( query,sensor )
Parameters
|
query - owned query handle sensor - sensor shape handle |
Description
|
Returns how many shapes are inside a sensor, and copies them. Returns the number of live visitors in the supplied sensor shape's last processed overlap state, copying them as kind-7 query hits. Before the first step it is empty. Moving a visitor or sensor does not update occupancy until StepPhysics; destroyed visitor IDs still present in the native buffer are skipped. The supplied shape must be a sensor in the query world. Results are unique and sorted by shape handle, with body/entity identities and copied tags. No point, normal, fraction, material or triangle/child geometry is invented (triangle/child are -1). This is direct simulation-state inspection: query search filters/targets do not hide supplied objects or native contacts. Native collision filters, sensor/event settings and the most recently processed simulation state still determine the data. It does not force a new narrowphase pass after edits. PhysicsQueryLimit counts manifolds for contact captures and visitors for occupancy; it accepts 1–65536, default 1024. A native contact-pair/visitor capacity above 65536 also raises an explicit error. Hit, manifold and temporary native-data buffers share the 64 MiB query budget. Overflow or allocation failure preserves the previous snapshot; nothing is silently truncated. 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, CountPhysicsQueryManifolds, PhysicsBodyEvents. |
Example
; QueryPhysicsSensor 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) ; Crates scattered over the floor Dim crates(9) Dim crate_bodies(9) For i=0 To 9 crates(i)=CreateCube() ScaleEntity crates(i),0.4,0.4,0.4 PositionEntity crates(i),Rnd(-4,4),0.4,Rnd(-4,4) crate_bodies(i)=CreatePhysicsBody(world,crates(i),PHYSICS_DYNAMIC) crate_shape=PhysicsBodyBox(crate_bodies(i),0.8,0.8,0.8) Next ; A query object runs searches and keeps a copy of their results ; It ignores the floor body, so only crates are found query=CreatePhysicsQuery(world) PhysicsQueryFilter query,-1,-1,ground_body ; A see-through yellow probe shows the search volume ; The probe carries a sensor shape: it collides with nothing but notes what enters it probe=CreateSphere(16) PositionEntity probe,0,0.5,0 probe_body=CreatePhysicsBody(world,probe,1) sensor=PhysicsBodySphere(probe_body,2,1,0,0,0,True) EntityColor probe,255,230,60 EntityAlpha probe,0.4 While Not KeyDown(1) ; A, D, W and S move the probe over the floor If KeyDown(30) Then MoveEntity probe,-0.05,0,0 If KeyDown(32) Then MoveEntity probe,0.05,0,0 If KeyDown(17) Then MoveEntity probe,0,0,0.05 If KeyDown(31) Then MoveEntity probe,0,0,-0.05 px#=EntityX(probe) pz#=EntityZ(probe) StepPhysics world,1.0/60.0,4 ; Copy the shapes that were inside the sensor after the last step hits=QueryPhysicsSensor(query,sensor) ; Crates found by the search turn yellow For i=0 To 9 EntityColor crates(i),255,120,70 Next For h=1 To hits found=PhysicsQueryEntity(query,h) If found<>ground Then EntityColor found,255,230,60 Next ; 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 A / D / W / S: move the probe Esc: exit" Text 0,20,"QueryPhysicsSensor(query,sensor) = "+hits Text 0,40,"A sensor ignores query filters, so the floor is counted too" Flip Wend FreePhysicsWorld world End
Index