Je rencontre un bug, et je n'arrive pas à déterminer s'il vient de PB ou de moi.
Mon but est de construire un mesh complexe avec plusieurs submeshes dotés chacun de leur propre material.
Pour cela, je duplique les "meshDatas" d'un cube standard et je les recopie plein de fois en changeant juste les x,y,z des vertex. Et quand je veux passer au material suivant, j'ajoute un submesh.
Or, dès que je dépasse 3 submeshes (cf. ligne 164 dans le code), je me tape une erreur "invalide memory access" sur le "finishMesh". J'obtiens le même résultat en DirectX et en OpenGL, et sur deux PC différents.
Quelqu'un pourrait me dire ce que je fais mal, s'il vous plaît ?
Code : Tout sélectionner
; Window size
#SCREENWIDTH = 800
#SCREENHEIGHT = 500
; Camera
#CAMERA = 0
#CAMERASPEED = 0.2
Structure meshInfo_struct
maxVertIndex.i
maxFaceIndex.i
Array vertInfos.PB_MeshVertex(0)
Array faceInfos.PB_MeshFace(0)
EndStructure
Global Dim meshInfo.meshInfo_struct(64)
Global mouseX.f, mouseY.f
Global timer.i, oldTimer.i, loopTime.f
EnableExplicit
;************************************************************************************
;- ---- Procedures ----
;************************************************************************************
; Ici, je récupère les meshDatas d'un cube purebasic standard
Procedure initializeCubeMesh()
Protected cubeMesh.i,i.i
cubeMesh = CreateCube(#PB_Any,1)
BuildMeshShadowVolume(cubeMesh)
BuildMeshTangents(cubeMesh)
i=0
meshInfo(i)\maxVertIndex = MeshVertexCount(cubeMesh) - 1
meshInfo(i)\maxFaceIndex = MeshIndexCount(cubeMesh) - 1
GetMeshData(cubeMesh,0,meshInfo(i)\vertInfos(),#PB_Mesh_Vertex|#PB_Mesh_Normal|#PB_Mesh_UVCoordinate,0,meshInfo(i)\maxVertIndex )
GetMeshData(cubeMesh,0,meshInfo(i)\faceInfos(),#PB_Mesh_Face,0,meshInfo(i)\maxFaceIndex )
FreeMesh(cubeMesh)
EndProcedure
; Juste pour faire joli
Procedure initializeMaterials()
Protected Dim couleur.i(7)
Protected i.i,j.i,x.i,y.i
couleur(0) = $0000FF
couleur(1) = $0077FF
couleur(2) = $00FFFF
couleur(3) = $00FF00
couleur(4) = $FF0000
couleur(5) = $FF0077
couleur(6) = $FF00FF
couleur(7) = $FFFFFF
For i = 0 To 7
CreateTexture(i,64,64)
StartDrawing(TextureOutput(i))
Box(0,0,64,64,couleur(i))
For j=0 To Random(10)
x = Random(64): y = Random(64)
Box(x,y,4,4,RGB( Red(couleur(i)) / 2,Green(couleur(i)) / 2,Blue(couleur(i)) / 2 ) )
Next j
StopDrawing()
CreateMaterial(i,TextureID(i))
Next i
EndProcedure
; Ici, je crée le gros mesh en dupliquant plein de fois les meshDatas du cube
Procedure.i buildComplexMesh(size.i)
Protected x.i,y.i,z.i
Protected i.i
Protected index.i, numSubMesh.i, numMesh.i
numMesh = CreateMesh(#PB_Any)
; Le mesh mesurera size*size
For y = 0 To size-1
; Quand je change de material, j'assigne le material au submesh précédent et j'en ajoute un autre
If y > 0
Debug "Submesh " + Str(numSubMesh) + " : material = " + Str( (size - y)%8 )
SetMeshMaterial(numMesh,MaterialID( (size - y)%8 ),numSubMesh)
AddSubMesh()
numSubMesh+1
index = 0
EndIf
For x = 0 To size - y - 1
For z = 0 To size - y - 1
; Add the vertices
For i = 0 To meshInfo(0)\maxVertIndex
MeshVertexPosition((meshInfo(0)\vertInfos(i)\x ) + x,
(meshInfo(0)\vertInfos(i)\y ) + y,
(meshInfo(0)\vertInfos(i)\z ) + z)
MeshVertexNormal(meshInfo(0)\vertInfos(i)\NormalX,
meshInfo(0)\vertInfos(i)\NormalY,
meshInfo(0)\vertInfos(i)\NormalZ)
MeshVertexTextureCoordinate(meshInfo(0)\vertInfos(i)\u,
meshInfo(0)\vertInfos(i)\v )
Next i
For i = 0 To meshInfo(0)\maxFaceIndex Step 3
MeshFace(meshInfo(0)\faceInfos(i)\Index + index,meshInfo(0)\faceInfos(i+1)\Index + index,meshInfo(0)\faceInfos(i+2)\Index + index)
Next i
index + meshInfo(0)\maxVertIndex + 1
Next z
Next x
Next y
FinishMesh(#True)
SetMeshMaterial(numMesh,MaterialID( (size - y)%8 ),numSubMesh)
Debug "Submesh " + Str(numSubMesh) + " - material = " + Str( (size - y)%8 )
ProcedureReturn numMesh
EndProcedure
DisableExplicit
;************************************************************************************
;- ---- Main program ----
;************************************************************************************
;- Initialization
InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
UsePNGImageEncoder()
;- Window
OpenWindow(Wmain,0, 0, #SCREENWIDTH,#SCREENHEIGHT ,"Test submesh",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(Wmain), 0, 0, #SCREENWIDTH,#SCREENHEIGHT, 0, 0, 0,#PB_Screen_NoSynchronization)
;- Camera
CreateCamera(#CAMERA, 0, 0, 100, 100)
CameraBackColor(#CAMERA,$222222)
MoveCamera(#CAMERA,20,30,20)
CameraLookAt(#CAMERA,0,0,0)
;-Light
CreateLight(1,$FFFFFF,CameraX(#CAMERA),CameraY(#CAMERA),CameraZ(#CAMERA))
WorldShadows(#PB_Shadow_None)
;- Initialize the mesh datas
initializeCubeMesh()
;- Initialize the materials
initializeMaterials()
;- Build a mesh with many submeshes
;- BUG ICI !
numMesh = buildComplexMesh(15) ; Le bug se produit dès que je dépasse 3
;- Create the entity
;CreateStaticGeometry(0, 100,100,100, #False)
chunkEntity = CreateEntity(#PB_Any,MeshID(numMesh),#PB_Material_None)
;AddStaticGeometryEntity(0, EntityID(chunkEntity),0,0,0)
;FreeEntity(chunkEntity)
;BuildStaticGeometry(numGroup)
;- Main Loop
oldTimer = ElapsedMilliseconds()
KeyboardMode(#PB_Keyboard_International)
Repeat
Delay(1)
; Windows events
WaitWindowEvent(1)
ExamineKeyboard()
; Activate wireframe render
If KeyboardReleased(#PB_Key_W)
wireframe = 1-wireframe
If wireframe = #True
CameraRenderMode(#CAMERA,#PB_Camera_Wireframe)
Else
CameraRenderMode(#CAMERA,#PB_Camera_Textured)
EndIf
EndIf
;- Movements (mouse + arrows)
timer = ElapsedMilliseconds()
loopTime = 1 + (timer - oldtimer)
If looptime > 32
looptime = 32
EndIf
oldtimer = timer
; Look around
If ExamineMouse()
MouseX = -(MouseDeltaX()/10)
MouseY = -(MouseDeltaY()/10)
EndIf
RotateCamera(#CAMERA, MouseY, MouseX,0, #PB_Relative)
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up)
MoveCamera (#CAMERA, 0, 0, -#CAMERASPEED/looptime)
EndIf
If KeyboardPushed(#PB_Key_Down)
MoveCamera (#CAMERA, 0, 0, #CAMERASPEED/looptime)
EndIf
If KeyboardPushed(#PB_Key_Left)
MoveCamera (#CAMERA, -#CAMERASPEED/looptime,0, 0)
EndIf
If KeyboardPushed(#PB_Key_Right)
MoveCamera (#CAMERA, #CAMERASPEED/looptime,0, 0)
EndIf
EndIf
;- Render
RenderWorld()
;- Display FPS
;DISPLAY_FPS(timer)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
;************************************************************************************
;- ---- Datas ----
;************************************************************************************
;- Meshes datas
DataSection
meshTopDatas:
; Nb vertices, nb triangles
Data.i 4,2
; Vertices: pos / normals / uv
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.f 1,0
Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.f 1,1
Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.f 0,1
; Faces
Data.i 2,1,0
Data.i 0,3,2
MeshBottomDatas:
; Nb vertices, nb triangles
Data.i 4,2
; Vertices: pos / normals / uv
Data.f -0.50,-0.50,0.50
Data.f 0.00,-1.00,0.00
Data.f 0,0
Data.f 0.50,-0.50,0.50
Data.f 0.00,-1.00,0.00
Data.f 1,0
Data.f 0.50,-0.50,-0.50
Data.f 0.00,-1.00,0.00
Data.f 1,1
Data.f -0.50,-0.50,-0.50
Data.f 0.00,-1.00,0.00
Data.f 0,1
; Faces
Data.i 2,1,0
Data.i 0,3,2
MeshLeftDatas:
; Nb vertices, nb triangles
Data.i 4,2
; Vertices: pos / normals / uv
Data.f -0.50,0.50,-0.50
Data.f -1.00,0.00,0.00
Data.f 0,0
Data.f -0.50,0.50,0.50
Data.f -1.00,0.00,0.00
Data.f 1,0
Data.f -0.50,-0.50,0.50
Data.f -1.00,0.00,0.00
Data.f 1,1
Data.f -0.50,-0.50,-0.50
Data.f -1.00,0.00,0.00
Data.f 0,1
; Faces
Data.i 2,1,0
Data.i 0,3,2
MeshRightDatas:
; Nb vertices, nb triangles
Data.i 4,2
; Vertices: pos / normals / uv
Data.f 0.50,0.50,0.50
Data.f 1.00,0.00,0.00
Data.f 0,0
Data.f 0.50,0.50,-0.50
Data.f 1.00,0.00,0.00
Data.f 1,0
Data.f 0.50,-0.50,-0.50
Data.f 1.00,0.00,0.00
Data.f 1,1
Data.f 0.50,-0.50,0.50
Data.f 1.00,0.00,0.00
Data.f 0,1
; Faces
Data.i 2,1,0
Data.i 0,3,2
MeshFrontDatas:
; Nb vertices, nb triangles
Data.i 4,2
; Vertices: pos / normals / uv
Data.f -0.50,0.50,0.50
Data.f 0.00,0.00,1.00
Data.f 0,0
Data.f 0.50,0.50,0.50
Data.f 0.00,0.00,1.00
Data.f 1,0
Data.f 0.50,-0.50,0.50
Data.f 0.00,0.00,1.00
Data.f 1,1
Data.f -0.50,-0.50,0.50
Data.f 0.00,0.00,1.00
Data.f 0,1
; Faces
Data.i 2,1,0
Data.i 0,3,2
MeshBackDatas:
; Nb vertices, nb triangles
Data.i 4,2
; Vertices: pos / normals / uv
Data.f 0.50,0.50,-0.50
Data.f 0.00,0.00,-1.00
Data.f 0,0
Data.f -0.50,0.50,-0.50
Data.f 0.00,0.00,-1.00
Data.f 1,0
Data.f -0.50,-0.50,-0.50
Data.f 0.00,0.00,-1.00
Data.f 1,1
Data.f 0.50,-0.50,-0.50
Data.f 0.00,0.00,-1.00
Data.f 0,1
; Faces
Data.i 2,1,0
Data.i 0,3,2
EndDataSection