Code : Tout sélectionner
;- ---------- Main program ----------
;- Screen initialisation
Resultat = MessageRequester("Telluric planet generation","Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6
FullScreen=1
Else
FullScreen=0
EndIf
If InitEngine3D() = 0
MessageRequester( "Error" , "Can't initialize 3D, check if engine3D.dll is available" , 0 )
End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 )
End
EndIf
If Fullscreen
OpenScreen(1024,768,32,"Telluric Planet Generator")
Else
OpenWindow(0,0, 0, 800 , 600 ,"Telluric Planet Generator",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf
StartDrawing(ScreenOutput())
DrawText(0,0,"Generating base mesh and heightmaps, please wait...", $00FFFF, $BB0000)
StopDrawing()
FlipBuffers()
;-Mesh
planetMesh = CreateDynMesh("NewWorld",1,1,1,0,0,1,1,RGB(0,127,200))
;-Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
Box(0, 0, 128, 128, $FFFFFF)
StopDrawing()
;-Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,#PB_Material_AmbientColors)
;-Entity
CreateEntity(planetEntity,MeshID(dynMesh(planetMesh)\numMesh),MaterialID(0))
;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,5)
CameraLookAt(0,EntityX(planetEntity),EntityY(planetEntity),EntityZ(planetEntity))
;-Light
AmbientColor(RGB(63,63,63))
CreateLight(0,RGB(255,255,255),300,300,300)
;- Heightmaps
; Prepare six heightmaps (one for each side)
dispersion=512
For i=0 To 5
makeDiamondSquare(maxgrid,dispersion,#PLANETSEED+i)
; Voronoi can add a nice "fractured" touch to heightmaps, but can be long to generate
;makeVoronoi(maxgrid,3,3,#PLANETSEED+i)
; Pass 1 as last parameter to use Voronoi
makeHeightmap(i,maxgrid,1,-1)
Next i
; Blend seams between heightmaps of each side of the mesh
eraseseam(#FRONTSIDE,"right",#LEFTSIDE,"left",512,25)
eraseseam(#FRONTSIDE,"left",#RIGHTSIDE,"right",512,25)
eraseseam(#BACKSIDE,"right",#RIGHTSIDE,"left",512,25)
eraseseam(#BACKSIDE,"left",#LEFTSIDE,"right",512,25)
eraseseam(#TOPSIDE,"bottom",#BACKSIDE,"top",512,25)
eraseseam(#TOPSIDE,"left",#LEFTSIDE,"top",512,25)
eraseseam(#TOPSIDE,"top",#FRONTSIDE,"top",512,25)
eraseseam(#TOPSIDE,"right",#RIGHTSIDE,"top",512,25)
eraseseam(#BOTTOMSIDE,"top",#FRONTSIDE,"bottom",512,25)
eraseseam(#BOTTOMSIDE,"right",#LEFTSIDE,"bottom",512,25)
eraseseam(#BOTTOMSIDE,"bottom",#BACKSIDE,"bottom",512,25)
eraseseam(#BOTTOMSIDE,"left",#RIGHTSIDE,"bottom",512,25)
;- Main loop
Repeat
If fullscreen = 0
While WindowEvent() : Wend
EndIf
; Rotate
ExamineMouse()
anglex+MouseDeltaX()
angley+MouseDeltaY()
If phase < 4
RotateEntity(planetEntity, anglex,angley,0)
Else
For i=0 To 5
RotateEntity(newEntity+i, anglex,angley,0)
Next i
EndIf
If ExamineKeyboard()
; Wireframe view
If KeyboardReleased(#PB_Key_F1)
CameraMode=1-CameraMode
CameraRenderMode(0,CameraMode)
AmbientColor(RGB(63+cameramode*150,63+cameramode*150,63+cameramode*150))
EndIf
; Zoom / unzoom
If KeyboardReleased(#PB_Key_Add)
MoveCamera(0,0,0,-0.25)
EndIf
If KeyboardReleased(#PB_Key_Subtract)
MoveCamera(0,0,0,0.25)
EndIf
; Change phase
If KeyboardReleased(#PB_Key_Space) And phase <5
phase + 1
Select phase
Case 1
MessageRequester("Phase 1","Subdivide base mesh into something more spheric.")
t=ElapsedMilliseconds()
subdivideMesh(planetMesh,4)
findDuplicateVertices(planetMesh)
t=ElapsedMilliseconds()-t
MessageRequester("Phase 1","Phase 1 complete in " + Str(t) + " ms.")
Case 2
MessageRequester("Phase 2","Apply heightmaps.")
t=ElapsedMilliseconds()
applyHeightmaps(planetMesh,maxgrid)
t=ElapsedMilliseconds()-t
MessageRequester("Phase 2","Phase 2 complete in " + Str(t) + " ms.")
Case 3
MessageRequester("Phase 3","Smooth mesh normals.")
t=ElapsedMilliseconds()
normalizeMesh(planetMesh)
t=ElapsedMilliseconds()-t
MessageRequester("Phase 3","Phase 3 complete in " + Str(t) + " ms.")
Case 4
MessageRequester("Phase 4","Cut out mesh into 6 sub-meshes")
t=ElapsedMilliseconds()
newMesh=cutOutSides(planetmesh)
newEntity=10
For i=0 To 5
CreateEntity(newEntity+i,MeshID(dynMesh(newMesh + i)\numMesh),MaterialID(0))
Next i
HideEntity(planetEntity,1)
t=ElapsedMilliseconds()-t
MessageRequester("Phase 4","Phase 4 complete in " + Str(t) + " ms.")
; Color sides, so they're easier to see
For i=0 To 5
*ptrPoly = dynMesh(newMesh+i)\polygonBuffer
*ptrSide = dynMesh(newMesh+i)\faceSideBuffer
For j = 1 To dynMesh(newMesh+i)\nbTri
side = PeekB(*ptrSide)
*ptrVert = dynMesh(newMesh+i)\vertexBuffer + (*ptrPoly\numVert1 * SizeOf(Vertex))
*ptrVert\couleur = couleur(side)
*ptrVert = dynMesh(newMesh+i)\vertexBuffer + (*ptrPoly\numVert2 * SizeOf(Vertex))
*ptrVert\couleur = couleur(side)
*ptrVert = dynMesh(newMesh+i)\vertexBuffer + (*ptrPoly\numVert3 * SizeOf(Vertex))
*ptrVert\couleur = couleur(side)
*ptrPoly+SizeOf(Polygon)
*ptrSide+1
Next j
SetMeshData(dynMesh(newMesh+i)\numMesh,#PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate,dynMesh(newMesh+i)\vertexBuffer,dynMesh(newMesh+i)\nbVert)
Next i
Case 5
MessageRequester("Phase 5","Generate a texture for each side and apply it to sub-meshes")
t=ElapsedMilliseconds()
For i=0 To 5
makeHeightmapTexture(10+i,i,maxgrid)
CreateMaterial(10+i,TextureID(10+i))
EntityMaterial(newEntity+i,MaterialID(10+i))
Next i
t=ElapsedMilliseconds()-t
MessageRequester("Phase 5","Phase 5 complete in " + Str(t) + " ms.")
EndSelect
EndIf
EndIf
; show it all
RenderWorld()
; A little help
StartDrawing(ScreenOutput())
DrawText(0,0,"[F1] to change RenderMode, [Space] to go to next phase", $00FFFF, $BB0000)
DrawText(0,15,"[+] to zoom, [-] to unzoom, [MOUSE] to rotate entity", $00FFFF, $BB0000)
DrawText(0,30,Str(dynMesh(planetMesh)\nbVert) + " vertices, " + Str(dynMesh(planetMesh)\nbTri) + " polygons", $00FFFF, $BB0000)
StopDrawing()
; Flip buffers to avoid tearing
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
; Delete dynamic meshes
For i=0 To #MAXMESH
If dynmesh(i)\numMesh > 0
deleteDynMesh(i)
EndIf
Next i
;- Mesh Datas
DataSection:
PointyCube:
; Nb sommets / Nb faces
Data.l 72,24
; Vertices: pos / uv
; Up
Data.f 0,1,0
Data.f 0,1,0
Data.f 0.5,0.5
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f 0,1
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f 1,1
Data.f 0,1,0
Data.f 0,1,0
Data.f 0.5,0.5
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f 1,1
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f 1,0
Data.f 0,1,0
Data.f 0,1,0
Data.f 0.5,0.5
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f 1,0
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f 0,0
Data.f 0,1,0
Data.f 0,1,0
Data.f 0.5,0.5
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f 0,0
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f 0,1
; Bottom
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0.5,0.5
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f 0,1
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f 1,1
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0.5,0.5
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f 0,0
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f 0,1
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0.5,0.5
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f 1,0
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f 0,0
Data.f 0,-1,0
Data.f 0,-1,0
Data.f 0.5,0.5
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f 1,1
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f 1,0
; Left
Data.f -1,0,0
Data.f -1,0,0
Data.f 0.5,0.5
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f 1,0
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f 0,0
Data.f -1,0,0
Data.f -1,0,0
Data.f 0.5,0.5
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f 1,1
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f 1,0
Data.f -1,0,0
Data.f -1,0,0
Data.f 0.5,0.5
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f 0,1
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f 1,1
Data.f -1,0,0
Data.f -1,0,0
Data.f 0.5,0.5
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f 0,0
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f 0,1
; Right
Data.f 1,0,0
Data.f 1,0,0
Data.f 0.5,0.5
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f 1,0
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f 0,0
Data.f 1,0,0
Data.f 1,0,0
Data.f 0.5,0.5
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f 0,0
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f 0,1
Data.f 1,0,0
Data.f 1,0,0
Data.f 0.5,0.5
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f 0,1
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f 1,1
Data.f 1,0,0
Data.f 1,0,0
Data.f 0.5,0.5
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f 1,1
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f 1,0
; Front
Data.f 0,0,-1
Data.f 0,0,-1
Data.f 0.5,0.5
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f 1,0
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f 0,0
Data.f 0,0,-1
Data.f 0,0,-1
Data.f 0.5,0.5
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f #SQRT03,#SQRT03,-#SQRT03
Data.f 0,0
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f 0,1
Data.f 0,0,-1
Data.f 0,0,-1
Data.f 0.5,0.5
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f #SQRT03,-#SQRT03,-#SQRT03
Data.f 0,1
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f 1,1
Data.f 0,0,-1
Data.f 0,0,-1
Data.f 0.5,0.5
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f -#SQRT03,-#SQRT03,-#SQRT03
Data.f 1,1
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f -#SQRT03,#SQRT03,-#SQRT03
Data.f 1,0
; Back
Data.f 0,0,1
Data.f 0,0,1
Data.f 0.5,0.5
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f 1,0
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f 0,0
Data.f 0,0,1
Data.f 0,0,1
Data.f 0.5,0.5
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f 1,1
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f #SQRT03,#SQRT03,#SQRT03
Data.f 1,0
Data.f 0,0,1
Data.f 0,0,1
Data.f 0.5,0.5
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f 0,1
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f #SQRT03,-#SQRT03,#SQRT03
Data.f 1,1
Data.f 0,0,1
Data.f 0,0,1
Data.f 0.5,0.5
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f -#SQRT03,#SQRT03,#SQRT03
Data.f 0,0
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f -#SQRT03,-#SQRT03,#SQRT03
Data.f 0,1
; Faces
Data.w 0,1,2
Data.b #TOPSIDE
Data.w 3,4,5
Data.b #TOPSIDE
Data.w 6,7,8
Data.b #TOPSIDE
Data.w 9,10,11
Data.b #TOPSIDE
Data.w 12,13,14
Data.b #BOTTOMSIDE
Data.w 15,16,17
Data.b #BOTTOMSIDE
Data.w 18,19,20
Data.b #BOTTOMSIDE
Data.w 21,22,23
Data.b #BOTTOMSIDE
Data.w 24,25,26
Data.b #LEFTSIDE
Data.w 27,28,29
Data.b #LEFTSIDE
Data.w 30,31,32
Data.b #LEFTSIDE
Data.w 33,34,35
Data.b #LEFTSIDE
Data.w 36,37,38
Data.b #RIGHTSIDE
Data.w 39,40,41
Data.b #RIGHTSIDE
Data.w 42,43,44
Data.b #RIGHTSIDE
Data.w 45,46,47
Data.b #RIGHTSIDE
Data.w 48,49,50
Data.b #FRONTSIDE
Data.w 51,52,53
Data.b #FRONTSIDE
Data.w 54,55,56
Data.b #FRONTSIDE
Data.w 57,58,59
Data.b #FRONTSIDE
Data.w 60,61,62
Data.b #BACKSIDE
Data.w 63,64,65
Data.b #BACKSIDE
Data.w 66,67,68
Data.b #BACKSIDE
Data.w 69,70,71
Data.b #BACKSIDE
EndDataSection