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

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

Define.f KeyX, KeyY, MouseX, MouseY, SpriteX, SpriteY 

LoadFont(0, "Verdana", 24, #PB_Font_Bold)

#Mask1 = 1 << 0
#Mask2 = 1 << 1
#Mask3 = 1 << 2

Macro CreateTexture2(No, Color, Texte)
  CreateTexture(No, 256, 256)
  StartDrawing(TextureOutput(No))
  Box(0, 0, 256, 256, Color)
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0))
  DrawText(30, 128, Texte, RGB(255, 255, 255))
  StopDrawing()
EndMacro
    
If InitEngine3D()
  
    
  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()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    WorldShadows(#PB_Shadow_Modulative)
    
    ;-Ground
    CreateMaterial(0, LoadTexture(0, "Dirt.jpg"))
    CreatePlane(0, 1500, 1500, 40, 40, 15, 15)
    CreateEntity(0,MeshID(0),MaterialID(0)); Always visible (visibility mask = $FFFF FFFF)
    EntityRenderMode(0, 0)
    
    ;-Mesh
    CreateCube(1, 100)
    
    ;-Material
    GetScriptMaterial(1, "Color/Blue")
    GetScriptMaterial(2, "Color/Green")
    GetScriptMaterial(3, "Color/Red")
    
    ;-Entity
    CreateEntity(1, MeshID(1), MaterialID(1), -100, 50, 0, -1, #Mask1) ; Visible by camera 0
    CreateEntity(2, MeshID(1), MaterialID(2),    0, 50, 0, -1, #Mask2) ; Visible by camera 1
    CreateEntity(3, MeshID(1), MaterialID(3),  100, 50, 0, -1, #Mask3) ; Visible by camera 2
    
    ;-BillBoard
    CreateTexture2(11, RGB(  0,   0, 255), "Player 1")
    CreateMaterial(11, TextureID(11))
    CreateTexture2(12, RGB(  0, 255,   0), "Player 2")
    CreateMaterial(12, TextureID(12))
    CreateTexture2(13, RGB(255,   0,   0), "Player 3")
    CreateMaterial(13, TextureID(13))
    CreateBillboardGroup(1, MaterialID(11), 100, 100, 0, 0, 0, #Mask1, #PB_Billboard_Point)
    AddBillboard(1, -100, 180, 0)
    CreateBillboardGroup(2, MaterialID(12), 100, 100, 0, 0, 0, #Mask2, #PB_Billboard_Point)
    AddBillboard(2,    0, 180, 0)
    CreateBillboardGroup(3, MaterialID(13), 100, 100, 0, 0, 0, #Mask3, #PB_Billboard_Point)
    AddBillboard(3,  100, 180, 0)
       
    ;- Camera
    CreateCamera(0,  0,  0, 50, 50, #Mask1) ; Entity 1 visible
    MoveCamera(0, 0, 120, 500, #PB_Absolute)
    
    CreateCamera(1, 50,  0, 50, 50, #Mask2); Entity 2 visible
    MoveCamera(1, 0, 120, 500, #PB_Absolute)
    
    CreateCamera(2,  0, 50, 50, 50, #Mask3); Entity 3 visible 
    MoveCamera(2, 0, 120, 500, #PB_Absolute)
    
    CreateCamera(3, 50, 50, 50, 50, #Mask1 | #Mask3) ; entities 1 & 3 visibles
    MoveCamera(3, 0, 120, 500, #PB_Absolute)
       
    ;- Light
    CreateLight(0, RGB(255, 255, 255), -40, 300, 80)
    AmbientColor(RGB(80, 80, 80))
    
    ;- SkyBox
    SkyBox("Desert07.jpg")
        
    Repeat
      Screen3DEvents()
      
      ExamineMouse()
   
      ExamineKeyboard()
       
      RenderWorld() 
      FlipBuffers()
      
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End