;
; ------------------------------------------------------------
;
;   PureBasic - Projective Texturing
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;
; Use the keyboard arrows to move the card
; Use F12 to switch between wireframe and textured
;

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

Define.f MouseX, MouseY, cx, cz=1

Procedure.f POM(v.f)
  ProcedureReturn (Random(v*1000)-v*500)/500
EndProcedure

Procedure SetupMaterial(n, Filename$, scale.f=1)
  LoadTexture(n, Filename$)
  CreateMaterial(n,TextureID(n))
  ScaleMaterial(n,0.5/scale,1/scale)
EndProcedure

If InitEngine3D()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
    Parse3DScripts()
    
    SetupMaterial(1, "grass.jpg",2)
    SetupMaterial(2, "dirt.jpg",2)
    SetupMaterial(3, "RustySteel.jpg",2)
    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0,0,80,-80)
    CameraLookAt(0, 0,0,0)
    CreateLight(0,$ffffff, 10000, 5000, 2000)
    AmbientColor($888888)
    
    CreateCamera(1,0,0,2,4)
    CameraFOV(1,40)
    MoveCamera(1,0,80,0)
    SwitchCamera(1,0)
    
    For i=1 To 3
      LoadTexture(0,  "Valetcoeur.jpg")
      AddMaterialLayer(i,TextureID(0),#PB_Material_Add)
      SetMaterialAttribute(i,#PB_Material_ProjectiveTexturing,1,1)
      SetMaterialAttribute(i,#PB_Material_TAM,#PB_Material_BorderTAM,1)
    Next
    CreatePlane(1,200,200,1,1,4,4)
    CreateEntity(1,MeshID(1),MaterialID(1))
    CreateIcoSphere(0,15,3)
    For i=2 To 50
      CreateEntity(i,MeshID(0),MaterialID(Random(3,2)),pom(80),pom(0),pom(80))
      ScaleEntity(i,1+pom(0.5),0.5,1+pom(0.5))
      RotateEntity(i,0,pom(180),0)
    Next
    
    Repeat
      Screen3DEvents()
      
      ExamineMouse()
      MouseX = -MouseDeltaX() *  0.05
      MouseY = -MouseDeltaY() *  0.05
      ExamineKeyboard()
      cx-(-Bool(KeyboardPushed(#PB_Key_Left))+Bool(KeyboardPushed(#PB_Key_Right)))*1
      cz+(-Bool(KeyboardPushed(#PB_Key_Down))+Bool(KeyboardPushed(#PB_Key_Up   )))*1
      If KeyboardReleased(#PB_Key_F12):fdf=1-fdf:If fdf:CameraRenderMode(0,#PB_Camera_Wireframe):Else:CameraRenderMode(0,#PB_Camera_Textured):EndIf:EndIf
      CameraLookAt(1,cx,0,cz)
      CreateLine3D(100,CameraX(1),CameraY(1),CameraY(1),$ffffff,cx,0,cz,$ffffff)
      RenderWorld()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape)
  EndIf
Else
  MessageRequester("Error","Can't initialize engine3D")
EndIf