; ------------------------------------------------------------
;
;   PureBasic - NodeAnimation
;
;    (c) Fantaisie Software
;
; ------------------------------------------------------------
;
;An example of using AnimationTracks To make a node smoothly
;follow a predefined path With spline interpolation.

Declare AddPath(NodeAnimation)
Define.f Duration = 10000, Time = Duration / 4

InitEngine3D()

InitSprite()
InitKeyboard()
InitMouse()

ExamineDesktops():dx=DesktopWidth(0)*0.8:dy=DesktopHeight(0)*0.8
OpenWindow(0, 0,0, DesktopUnscaledX(dx),DesktopUnscaledY(dy), " NodeAnimation - [Esc] quit",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, dx, dy, 0, 0, 0)

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data"                , #PB_3DArchive_FileSystem)
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/Scripts"         , #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip)
Parse3DScripts()

;- Barrel
CreateEntity(1, LoadMesh(1, "Barrel.mesh"), #PB_Material_None)
ScaleEntity(1, 9, 9, 9)

;- Camera
CreateCamera(0, 0, 0, 100, 100)

;- Node
CreateNode(0)
AttachNodeObject(0, CameraID(0))

;- Light
AmbientColor(RGB(75, 75, 75))
CreateLight(0, RGB(235, 253, 126), -750, 750, -750)

;- SkyBox
SkyBox("desert07.jpg")

;- NodeAnimation
NodeAnimation = CreateNodeAnimation(#PB_Any, NodeID(0), Duration, #PB_NodeAnimation_Spline, #PB_NodeAnimation_LinearRotation)

CreateNodeAnimationKeyFrame(NodeAnimation, Time * 0,  200,   0,    0); key 0
CreateNodeAnimationKeyFrame(NodeAnimation, Time * 1,    0, -50,  100); key 1
CreateNodeAnimationKeyFrame(NodeAnimation, Time * 2, -500, 100,    0); key 2
CreateNodeAnimationKeyFrame(NodeAnimation, Time * 3,    0, 200, -300); key 3
CreateNodeAnimationKeyFrame(NodeAnimation, Time * 4,  200,   0,    0); key 4

StartNodeAnimation(NodeAnimation)

Repeat
  While WindowEvent():Wend
  
  ExamineKeyboard()
  AddNodeAnimationTime(NodeAnimation, TimeSinceLastFrame)
  CameraLookAt(0, EntityX(1), EntityY(1), EntityZ(1))
  
  TimeSinceLastFrame = RenderWorld()
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape)