[4.60] Remplacer temporairement CreateTerrain
Publié : jeu. 10/nov./2011 12:37
Sault à tous,
Pour remplacer la commande "CreateTerrain" (en attendant qu'elle soit réparée en v4.61
) , je me suis rapidement bricolé ce matin une procédure "MyCreateTerrain", que vous trouverez dans l'exemple ci-dessous.
Rien de révolutionnaire, mais ça peut dépanner, et puis ça m'a permis de voir comment fonctionne le nouveau "CreateMesh" (conclusion: il marche bien
).
Vous aurez besoin d'une heightmap, comme celle-ci:

A+
Pour remplacer la commande "CreateTerrain" (en attendant qu'elle soit réparée en v4.61

Rien de révolutionnaire, mais ça peut dépanner, et puis ça m'a permis de voir comment fonctionne le nouveau "CreateMesh" (conclusion: il marche bien

Code : Tout sélectionner
; ---------------------------------------------------------------------------------------------------------------
; Author: Kelebrindae
; Date: November,10,2011
; PB version: v4.60
;
; Temporary replacement for the "CreateTerrain" command (broken in PB v4.60)
; ---------------------------------------------------------------------------------------------------------------
; NB: Don't exceed 255x255 terrains, because the max vertices number in an Ogre mesh is 652235 !
; ---------------------------------------------------------------------------------------------------------------
EnableExplicit
;************************************************************************************
; Name: myCreateTerrain
; Purpose: Create a terrain mesh
; Parameters:
; - name of the heightmap
; - terrain size X
; - terrain size Y
; - maximum height (= height of the white points in the heightmap)
; - numbers of cols in the mesh
; - numbers of rows in the mesh
; Return-Value: mesh number
;************************************************************************************
Procedure.i MyCreateTerrain(heightmap.s,sizeX.f,sizeZ.f,maxHeight.f,nbCols.i,nbRows.i)
Protected numImage.i,imSizeX.f,imSizeY.f, height.i
Protected numMesh.i,i.i,j.i
Protected v0.i,v1.i,v2.i,v3.i
Protected cellSizeX.f, cellSizeZ.f,scaleY.f
; Load the heightmap
numImage = LoadImage(#PB_Any,heightmap)
If IsImage(numImage) = #False
ProcedureReturn 0
EndIf
imSizeX = ImageWidth(numImage) - 1
imSizeY = ImageHeight(numImage) - 1
; Create the mesh
numMesh = CreateMesh(#PB_Any)
cellSizeX = sizeX / nbCols
cellSizeZ = sizeZ / nbRows
scaleY = maxHeight / 255.0
; Create the vertices, according to heightmap values
StartDrawing(ImageOutput(numImage))
For j = 0 To nbCols
For i = 0 To nbRows
height = Red( Point(i * (imSizeX/nbCols) , j * (imSizeY/nbRows) ) )
AddMeshVertex(i*cellSizeX,scaleY * height,j*cellSizeZ)
MeshVertexColor($FFFFFF)
MeshVertexTextureCoordinate( i * (1 / nbCols),j * (1 / nbRows) )
Next i
Next j
StopDrawing()
FreeImage(numImage)
; Create the faces
For j=0 To nbRows - 1
For i = 0 To nbCols - 1
v0 = i + j*(nbRows + 1)
v1 = i + j*(nbRows + 1) + 1
v2 = i + (j+1)*(nbRows + 1)
v3 = i + (j+1)*(nbRows + 1) + 1
AddMeshFace(v0, v2, v3 )
AddMeshFace(v0, v3, v1 )
Next i
Next j
; Finih and compute the normals
FinishMesh()
NormalizeMesh(numMesh)
ProcedureReturn numMesh
EndProcedure
DisableExplicit
;- Initialization
Global FullScreen.b
Resultat = MessageRequester("Create terrain","Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6
FullScreen=#True
Else
FullScreen=#False
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 = #True
OpenScreen(1024,768,32,"Custom Terrain",#PB_Screen_SmartSynchronization)
Else
OpenWindow(0,0, 0, 800 , 500 ,"Custom Terrain")
OpenWindowedScreen(WindowID(0),0,0, 800, 500,0,0,0,#PB_Screen_SmartSynchronization)
EndIf
;- Terrain texture
CreateTexture(0,64,64)
StartDrawing(TextureOutput(0))
Box(0,0,64,64,$FFFFFF)
StopDrawing()
CreateMaterial(2,TextureID(0))
MaterialAmbientColor(2, #PB_Material_AmbientColors)
;- Terrain mesh
UsePNGImageDecoder()
UseJPEGImageDecoder()
heightmap.s = OpenFileRequester("Choisissez une Heightmap","","Images|*.png;*.bmp;*.jpg;*.jpeg",0)
If heightmap = ""
End
EndIf
numMesh = MyCreateTerrain(heightmap,500,500,50,250,250)
;- Terrain entity
CreateEntity(0,MeshID(numMesh),MaterialID(2))
EntityLocate(0,-50,0,-50)
;- Light
AmbientColor(0)
CreateLight(0,$FFFFFF, 0,500,500)
;- Camera
CreateCamera(0, 0, 0, 100, 100)
CameraBackColor(0,$FF7755)
CameraLocate(0, 400,100,500)
CameraLookAt(0,250,0,250)
#CameraSpeed = 1
;- Main loop
Repeat
While WindowEvent()
Delay(1)
Wend
If ExamineMouse()
MouseX = -(MouseDeltaX()/10)*#CameraSpeed
MouseY = -(MouseDeltaY()/10)*#CameraSpeed
EndIf
RotateCamera(0, MouseY, MouseX, RollZ, #PB_Relative)
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up)
MoveCamera (0, 0, 0, -#CameraSpeed)
EndIf
If KeyboardPushed(#PB_Key_Down)
MoveCamera (0, 0, 0, #CameraSpeed)
EndIf
EndIf
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

A+