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



; Button left to draw
; Button right to clear

Declare DrawOnWhiteBoard()

Define.f KeyX, KeyY, MouseX, MouseY
Global Entity.i, P.Vector3

LoadFont(0, "Arial"  ,  16, #PB_Font_Bold)

#CameraSpeed  = 3

Macro InitImage()
  StartDrawing(ImageOutput(0))
  Box(0, 0, 320, 240, 0)
  DrawingMode(#PB_2DDrawing_Outlined)
  Box(0, 0, 320, 240, RGB(255, 255, 255))
  DrawingFont(FontID(0))
  DrawText(5, 20, "left button to draw", RGB(155, 80, 0), 0)
  DrawText(5, 80, "Right button to clear", RGB(155, 80, 0), 0)
  StopDrawing()
EndMacro

InitEngine3D()

InitSprite()
InitKeyboard()
InitMouse()

ExamineDesktops():dx=DesktopWidth(0)*0.8:dy=DesktopHeight(0)*0.8
OpenWindow(0, 0,0, DesktopUnscaledX(dx),DesktopUnscaledY(dy), " ConvertWorldToLocalPosition - Use mouse to draw on mesh    [Esc] quit",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, dx, dy, 0, 0, 0)

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Models", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/skybox.zip", #PB_3DArchive_Zip)
Parse3DScripts()

CreateMesh(0)
MeshVertex(-1, 0, 1,  1,0,  $ffffff,  0,-1,0)
MeshVertex( 1, 0, 1,  0,0,  $ffffff,  0,-1,0)
MeshVertex( 1, 0,-1,  0,1,  $ffffff,  0,-1,0)
MeshVertex(-1, 0,-1,  1,1,  $ffffff,  0,-1,0)
MeshFace(0, 1, 2)
MeshFace(0, 2, 3)
MeshFace(2, 1, 0)
MeshFace(3, 2, 0)
FinishMesh(1)

CreateImage(0, 320, 240)
InitImage()

CreateTexture(0, 320, 240)

CreateMaterial(0, TextureID(0))
MaterialBlendingMode(0, #PB_Material_Add)
DisableMaterialLighting(0, 1)
MaterialCullingMode(0, 1)
MaterialFilteringMode(0,#PB_Material_Anisotropic)

Entity = CreateEntity(#PB_Any, MeshID(0), MaterialID(0), 30, 40, 50)
ScaleEntity(Entity, 80, 1, 60)

CreateLight(0, RGB(0,0,255), 100.0, 0, 0)

CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 10, 350, -150, #PB_Absolute)
CameraLookAt(0, 30, 40, 50)
CameraBackColor(0, RGB(0, 0, 90))

ShowGUI(128, 1) ; Display the GUI, semi-transparent and display the mouse cursor

SkyBox("stevecube.jpg")

MouseLocate(CameraViewWidth(0)/2, CameraViewHeight(0)/2)

Repeat
  While WindowEvent():Wend
  
  If ExamineMouse()
    InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
    MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
    MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
    
    ; Test Mouse
    
    If MouseRayCast(0, MouseX(), MouseY(), -1) = Entity
      DrawOnWhiteBoard()
    EndIf
  EndIf
  
  If ExamineKeyboard()    
    KeyX = (KeyboardPushed(#PB_Key_Right)-KeyboardPushed(#PB_Key_Left))*#CameraSpeed
    Keyy = (KeyboardPushed(#PB_Key_Down)-KeyboardPushed(#PB_Key_Up))*#CameraSpeed    
  EndIf
  RotateEntity(Entity, 0.1, 0.1, 0.1, #PB_Relative|#PB_World)
  
  StartDrawing(TextureOutput(0))
  DrawImage(ImageID(0), 0, 0)
  StopDrawing()
  
  CameraLookAt(0, 30, 40, 50)
  MoveCamera  (0, KeyX, 0, KeyY)
  RenderWorld()
  
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

Procedure DrawOnWhiteBoard()
  Protected x, y
  Static Mem, Memx, Memy
  StartDrawing(ImageOutput(0))
  If MouseButton(#PB_MouseButton_Left)
    
    ConvertWorldToLocalPosition(EntityID(Entity), PickX(), PickY(), PickZ())
    
    x = (1 - GetX()) * 160
    y = (1 - GetZ()) * 120

    If x>0 And x<320 And y>0 And y<240
      If mem = 0
        Memx = x
        Memy = y
        mem = 1
      EndIf
      LineXY(memx, memy, x, y, $FF)
      
      Memx = x
      Memy = y
    EndIf
  ElseIf MouseButton(#PB_MouseButton_Right)
    StopDrawing()
    InitImage()
  Else
    mem = 0
  EndIf
  StopDrawing()
EndProcedure