;
; ------------------------------------------------------------
;
;   PureBasic - ExamineWorldCollisions
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

#CameraSpeed = 1

Define.f KeyX, KeyY, MouseX, MouseY, Speed1, Speed2, TimeSinceLastFrame, d = 0.4

If InitEngine3D()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/skybox.zip", #PB_3DArchive_Zip)
    Parse3DScripts()
    
    WorldShadows(#PB_Shadow_Modulative, 100)
    
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreateMaterial(1, LoadTexture(1, "DosCarte.png"))
    CreateMaterial(2, LoadTexture(2, "Wood.jpg"))
    
    SphereMesh = CreateSphere(#PB_Any, 0.06)
    CubeMesh = CreateCube(#PB_Any, 0.1)
    
    ;-Ground
    Ground = CreateEntity(#PB_Any, MeshID(CubeMesh), MaterialID(0))
    ScaleEntity(Ground, 150, 1, 150)
    EntityRenderMode(Ground, 0)
    CreateEntityBody(Ground, #PB_Entity_BoxBody, 0, 0, 0.1)
    
    Entity = CreateEntity(#PB_Any, MeshID(SphereMesh), MaterialID(1), 0, 0.2, 0)
    
    CreateEntityBody(Entity, #PB_Entity_SphereBody, 0.5, 0, 0.0)
    
    For i = 0 To 100
      If Random(100)>50
        Ent = CreateEntity(#PB_Any, MeshID(CubeMesh), MaterialID(2), 7.5-Random(15), 0.5, 7.5-Random(15))
        CreateEntityBody(Ent, #PB_Entity_BoxBody, 0.1, 0, 0.3)
      Else
        Ent = CreateEntity(#PB_Any, MeshID(CubeMesh), MaterialID(0), 7.5-Random(15), 0.1, 7.5-Random(15))
        CreateEntityBody(Ent, #PB_Entity_BoxBody, 0, 0, 0.3)
      EndIf
    Next
    
    SkyBox("stevecube.jpg")
    
    Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
    CameraRange(Camera, 0.01, 50)
    
    CameraFollow(Camera, EntityID(Entity), 180, EntityY(Entity) + 0.3, 1, 1, 1)
    
    CreateLight(0, RGB(155, 155, 155), 330, 500, 330)
    AmbientColor(RGB(100, 100, 100))
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.1
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Up)
          Speed1 = 0.2
        ElseIf KeyboardPushed(#PB_Key_Down)
          Speed1 = -0.2
        Else
          Speed1 * 0.9
        EndIf
        
      EndIf
      
      RotateEntity(Entity, 0, MouseX, 0, #PB_Relative)
      MoveEntity(Entity, 0, 0, Speed1, #PB_Local)
      
      CameraFollow(Camera, EntityID(Entity), 180, EntityY(Entity) + 0.2, 0.7, 0.1, 0.1)
      CameraLookAt(Camera, EntityX(Entity), EntityY(Entity), EntityZ(Entity))
      
      If ExamineWorldCollisions(#True) ; get also contacts
        
        While NextWorldCollision()
          
          If FirstWorldCollisionEntity() <> Ground And SecondWorldCollisionEntity() <> Ground
            
            WorldCollisionContact()
            x.f = GetX()
            y.f = GetY()
            z.f = GetZ()
            
            WorldCollisionNormal()
            xn.f = x + GetX() * d
            yn.f = y + GetY() * d
            zn.f = z + GetZ() * d
            
            CreateLine3D(Total, x, y, z, RGB(0, 255, 0), xn ,yn, zn, RGB(0, 255, 0))
            
            total + 1
            
            If total > 200
              
              For i = 0 To Total-1
                FreeMesh(i)
              Next
              total = 0
            EndIf
            
          EndIf
        Wend
        
      EndIf
      
      TimeSinceLastFrame = RenderWorld(50)
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End>