Chargement progressif et non bloquant des assets
Publié : mar. 03/avr./2018 17:31
j'ai été inspiré par le sujet Flux en France - 3D de Cool Dji.
Le chargement des assets est un peu long. J'ai cherché un moyen de faire un chargement non bloquant (Esc pour quitter en cours de chargement) des données.
■ Objectif :
- Charger 500 meshs
- Effectuer une rotation sur chacun des axes x y et z de chaque mesh
- Déplacement avec les fléches du clavier et la souris.
Voila ce que ça donne.
Le chargement des assets est un peu long. J'ai cherché un moyen de faire un chargement non bloquant (Esc pour quitter en cours de chargement) des données.
■ Objectif :
- Charger 500 meshs
- Effectuer une rotation sur chacun des axes x y et z de chaque mesh
- Déplacement avec les fléches du clavier et la souris.
Voila ce que ça donne.
Code : Tout sélectionner
EnableExplicit
;Police
Global FontInfo = LoadFont(-1, "Arial", 12)
;Scene [3D]
Global Camera, MouseX.f, MouseY.f, Light
;Assets & Preload
Global NewMap Material()
Global NewMap Mesh()
Global NewMap Entity()
Global CountLoad, MaxLoad = 500, CurrentOperation.b
;Sprite [2D]
;Bottom
Global Bottom
;Returns a random float in the interval [0.0, Maximum]
Macro RandomFloat(Maximum=1.0)
( Random(2147483647)*Maximum*4.6566128752457969241e-10 ) ; Random * 1/MaxRandom
EndMacro
;Returns a random sign {-1, 1}
Macro RandomSign()
( Random(1)*2-1 )
EndMacro
;Summary
Declare GamePreload()
Declare GameLoad()
Declare RenderGame3D()
Declare RenderGame2D()
Declare Exit()
GameLoad()
Procedure AddAssets(Id.s, Type, Value)
If Not CurrentOperation
CurrentOperation = #True
Select Type
Case 1 ;Material
Material(Id) = Value
If Material(Id)
CountLoad + 1
CurrentOperation = #False
EndIf
Case 2 ;Mesh
Mesh(Id) = Value
If Mesh(Id)
CountLoad + 1
CurrentOperation = #False
EndIf
Case 3 ; Entity
Entity(Id) = Value
If Entity(Id)
CountLoad + 1
CurrentOperation = #False
EndIf
EndSelect
EndIf
EndProcedure
Procedure GamePreload()
Static n
Protected x.f, y.f, z.f
Select CountLoad
Case 0 : AddAssets("box", 1, CreateMaterial(-1, TextureID(LoadTexture(-1, "MRAMOR6X6.jpg"))))
Case 1 : AddAssets("box", 2, CreateCube(-1, 10))
Case 3 : AddAssets("sinbad", 2, LoadMesh(-1, "sinbad.mesh"))
Case 4 : AddAssets("sinbad", 3, CreateEntity(-1, MeshID(Mesh("sinbad")), #PB_Material_None))
Case 4,6,7,8,9,10,11,12,13, 14, 15, 16, 17, 18, 19, 20
x = RandomFloat(100) * RandomSign()
y = RandomFloat(50) * RandomSign()
z = RandomFloat(100) * RandomSign()
n + 1
AddAssets("sinbad" + n, 3, CreateEntity(-1, MeshID(Mesh("sinbad")), #PB_Material_None, x, y, z))
Default
x = RandomFloat(400) * RandomSign()
y = RandomFloat(100) * RandomSign()
z = RandomFloat(400) * RandomSign()
n + 1
AddAssets("box" + n, 3, CreateEntity(-1, MeshID(Mesh("box")), MaterialID(Material("box")), x, y, z))
EndSelect
If CountLoad = MaxLoad
UnbindEvent(#PB_Event_Timer, @GamePreload())
EndIf
EndProcedure
Procedure GameLoad()
Protected Window
If InitEngine3D() And InitKeyboard() And InitSprite() And InitMouse() And InitSound()
Window = OpenWindow(#PB_Any, 0, 0, 0, 0, "", #PB_Window_Maximize | #PB_Window_BorderLess)
;-[Screen]
OpenWindowedScreen(WindowID(Window),0, 0, WindowWidth(Window) , WindowHeight(Window))
KeyboardMode(#PB_Keyboard_International | #PB_Keyboard_AllowSystemKeys)
;-[2D]
Bottom = CreateSprite(-1, ScreenWidth(), 150, #PB_Sprite_AlphaBlending)
;-[3D]
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/Sinbad.zip", #PB_3DArchive_Zip)
Parse3DScripts()
AddWindowTimer(Window, 0, 1)
BindEvent(#PB_Event_Timer, @GamePreload())
;-Camera
Camera = CreateCamera(#PB_Any, 0, 0, 100, 100)
CameraBackColor(Camera, RGB(50, 51, 80))
MoveCamera(Camera, 0, 0, -50)
CameraLookAt(Camera, 0, 0, 0)
;-Light
Light = CreateLight(#PB_Any, RGB(255, 255, 255), 0, 0, 0, #PB_Light_Point)
SetLightColor(Light, #PB_Light_SpecularColor, RGB(255, 255, 255))
SetLightColor(Light, #PB_Light_DiffuseColor, RGB(255, 255, 255))
;-Loop
While #True
Repeat : Until WindowEvent() = 0
FlipBuffers()
RenderGame3D()
RenderWorld()
RenderGame2D()
Wend
Else
EndIf
EndProcedure
Procedure RenderGame3D()
Protected CameraSpeed.f, CameraLateralSpeed.f
;-Events Keyboard
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
Exit()
EndIf
If KeyboardPushed(#PB_Key_Up)
CameraSpeed = -3
ElseIf KeyboardPushed(#PB_Key_Down)
CameraSpeed = 3
Else
CameraSpeed = 0
EndIf
If KeyboardPushed(#PB_Key_Left)
CameraLateralSpeed = -3
ElseIf KeyboardPushed(#PB_Key_Right)
CameraLateralSpeed = 3
Else
CameraLateralSpeed = 0
EndIf
EndIf
;-Events Mouse
If ExamineMouse()
MouseX = -MouseDeltaX() * 0.05
MouseY = -MouseDeltaY() * 0.05
EndIf
ForEach Entity()
RotateEntity(Entity(), 1, 1 , 1, #PB_Relative)
Next
;-Camera movement
RotateCamera(Camera, MouseY, MouseX, 0, #PB_Relative)
MoveCamera(Camera, CameraLateralSpeed, 0, CameraSpeed, #PB_Absolute|#PB_Local)
EndProcedure
Procedure RenderGame2D()
Protected Buffer.s = "Loading in progress"
Protected n.f = ((ScreenWidth() - 20) / MaxLoad)
StartDrawing(SpriteOutput(Bottom))
DrawingFont(FontID(FontInfo))
Box(0, 0, ScreenWidth(), SpriteHeight(Bottom), RGBA(0, 0, 0, 0))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0, 0, ScreenWidth(), SpriteHeight(Bottom), RGBA(0, 0, 0, 110))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(10, 10, ". : : Help : : .")
DrawText(10, 40, "Esc : Exit.")
DrawText(10, 70, "Keyboard arrows and mouse to move around.")
DrawingMode(#PB_2DDrawing_Default)
If CountLoad <> MaxLoad
Box(10, 100, ScreenWidth() - 20, 24, RGB(55, 59, 190))
Box(10, 100, n * CountLoad, 24, RGB(255, 255, 255))
DrawingMode(#PB_2DDrawing_Transparent)
DrawText((ScreenWidth() - TextWidth(Buffer))/2, 102, Buffer, RGB(0, 0, 0))
EndIf
StopDrawing()
DisplayTransparentSprite(Bottom, 0, ScreenHeight() - SpriteHeight(Bottom))
EndProcedure
Procedure Exit()
End
EndProcedure