; QueryPhysicsSphere Example
; --------------------------

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
probe=CreateSphere(16)
ScaleEntity probe,1,1,1
PositionEntity probe,0,0.5,0
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

    ; Find every shape inside a 2 m sphere at the probe
    hits=QueryPhysicsSphere(query,px,0.5,pz,2)

    ; 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,"QueryPhysicsSphere(query,x,0.5,z,2) = "+hits

    Flip

Wend

FreePhysicsWorld world
End
