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

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

Define yaw.f, X.f, Y.f, Z.f, FOV.f, Timer.i

If InitEngine3D()
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #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()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  If Screen3DRequester()
    
    ; Земля (Ground)
    ;
    GetScriptMaterial(0, "Scene/GroundBlend")
    CreatePlane(0, 10000, 10000, 100, 100, 50, 50)
    CreateEntity(0, MeshID(0), MaterialID(0))
    
    ; Узел (Node) для Шлейфа и билбордов
    ;
    CreateNode(0, 0, 500, 0)
    
    ; Узел (Node) для Бликов объектива
    ;
    CreateNode(1, 110, 500, 0)
    
    ;Шлейф (Ribbon)
    ;
    GetScriptMaterial(1, "Scene/RibbonTrail")
    CreateRibbonEffect(0, MaterialID(1), 3, 80, 1750)
    RibbonEffectColor(0, 0, RGBA(255, 0, 0, 255), RGBA(0, 0, 255, 255))
    RibbonEffectWidth(0, 0, 10, 3)
    
    AttachRibbonEffect(0, NodeID(0))
    
    ; билборд
    ;
    GetScriptMaterial(2, "Scene/burst")
    CreateBillboardGroup(0, MaterialID(2), 512, 512)
    AddBillboard(0, 0, 0, 0)
        
    AttachNodeObject(0, BillboardGroupID(bGrp))
   
    ; Камера
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 2000, 100, 2000, #PB_Absolute)
    CameraLookAt(0, 0, 1500, 0)
    CameraFOV(0, 60)
    
    ; блики объектива для этой камеры
    ;
    CreateLensFlareEffect(3, CameraID(0), NodeID(1), 10, 20, MaterialID(2), MaterialID(2), MaterialID(2))
    
    ; Скайбокс (SkyBox)
    ;
    SkyBox("desert07.jpg")
        
    Repeat
      Screen3DEvents()
      
      If Timer < ElapsedMilliseconds()
        Timer = ElapsedMilliseconds() + 5
        yaw + 0.1
      EndIf 
               
      ;Шлейф 
      X = 1000 + 500 * Cos(ElapsedMilliseconds() / 250)
      Y = 1500 + 750 * Cos(ElapsedMilliseconds() / 350)
      Z = 500  + 250 * Cos(ElapsedMilliseconds() / 750)
      MoveNode(0, X, Y, Z, #PB_Absolute)
      
      ;Камера
      FOV = 60 - 30 * Cos(ElapsedMilliseconds() / 2500)
      RotateCamera(0, 0, yaw, 0)
      CameraFOV(0, FOV)
      CameraLookAt(0, X, Y, Z)
         
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
      
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
    
  EndIf
  
Else
  MessageRequester("Ошибка", "3D Движок не может быть инициализирован", 0)
EndIf

End