voici une méthode que j'utilisais sous blitz3d
apparemment, ça a l'air de marcher aussi avec purebasic
version ou chaque polygone est une "entity"
version plus simple mais plus lente
Code:
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY
If InitEngine3D()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(1, 0, 0, 200, 100, "", #PB_Window_SystemMenu)
If Screen3DRequester()
CreateMaterial(0, LoadTexture(0, "White.jpg"))
SetMaterialColor(0, #PB_Material_AmbientColor, -1)
tt=0
For y=-10000 To 10000 Step 250
For x=-15000 To 15000 Step 250
Couleur=Random($ffffff,$7f7f7f)
CreateMesh(tt)
MeshVertexPosition(-100, 100, z)
MeshVertexColor(Couleur)
MeshVertexPosition(100, 100, z)
MeshVertexColor(Couleur)
MeshVertexPosition(100, -100, z)
MeshVertexColor(Couleur)
MeshVertexPosition(-100, -100, z)
MeshVertexColor(Couleur)
MeshFace(2, 3, 0)
MeshFace(0, 1, 2)
FinishMesh(#True)
CreateEntity(tt, MeshID(tt), MaterialID(0))
EntityLookAt(tt,0,0,1)
MoveEntity(tt,x,y,0)
tt=tt+1
;If tt>=100000 : Break :EndIf
Next
Next
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 0, 0, 30000, #PB_Absolute)
Repeat
t=ElapsedMilliseconds()
Screen3DEvents()
;For i=0 To tt-1
;RotateEntity(i, 0, 0, 1, #PB_Relative)
;Next
RenderWorld()
Screen3DStats()
FlipBuffers()
t=ElapsedMilliseconds()-t
StartDrawing(WindowOutput(1))
DrawText(5,5,Str(tt)+" entity")
DrawText(5,25,Str(t)+" ")
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
End
version avec une seule 'intity'
Code:
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
Define.f KeyX, KeyY, MouseX, MouseY
If InitEngine3D()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(1, 0, 0, 200, 100, "", #PB_Window_SystemMenu)
If Screen3DRequester()
CreateMaterial(0, LoadTexture(0, "White.jpg"))
SetMaterialColor(0, #PB_Material_AmbientColor, -1)
z=0
tt=0
CreateMesh(tt)
For y=-12000 To 12000 Step 250
For x=-16000 To 16000 Step 250
Couleur=Random($ffffff,$7f7f7f)
MeshVertexPosition(-100+x, 100+y, z)
MeshVertexColor(Couleur)
MeshVertexPosition(100+x, 100+y , z)
MeshVertexColor(Couleur)
MeshVertexPosition(100+x, -100+y, z)
MeshVertexColor(Couleur)
MeshVertexPosition(-100+x, -100+y, z)
MeshVertexColor(Couleur)
MeshFace(2+tt, 3+tt, 0+tt)
MeshFace(0+tt, 1+tt, 2+tt)
tt=tt+4
Next
Next
FinishMesh(#True)
CreateEntity(0, MeshID(0), MaterialID(0))
EntityLookAt(0,0,0,1)
;MoveEntity(tt,x,y,0)
tt=tt+1
;If tt>=100 : Break :EndIf
;Next
;Next
Debug Str(tt)+" entity"
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 0, 0, 30000, #PB_Absolute)
Repeat
t=ElapsedMilliseconds()
Screen3DEvents()
;For i=0 To tt-1
;RotateEntity(0, 0, 0, 1, #PB_Relative)
;Next
RenderWorld()
Screen3DStats()
FlipBuffers()
t=ElapsedMilliseconds()-t
StartDrawing(WindowOutput(1))
DrawText(5,5,Str(tt/4)+" entity")
DrawText(5,25,Str(t)+" ")
StopDrawing()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
End