kelebrindae a écrit :
- Est-il possible de faire des "GetMeshDatas" ou des "CopyArray" avec un tableau de tableaux ou un tableau situé dans une structure? Parce que je voulais stocker les infos des meshes élémentaires au lieu de faire des "GetMeshDatas" à chaque fois, et je n'ai pas réussi.
Oui on peut faire un CopyArray d'un tableau vers un tableau ou bien un GetMeshDatas dans un élément d'une liste incluant un tableau.
Obtenir les données internes du mesh passe par une structure prédéfinie de type
PB_MeshVertex.
Juste pour les curieux
Code : Tout sélectionner
Structure PB_MeshVertex
x.f
y.f
z.f
NormalX.f ; qu'avec l'option #PB_Mesh_Normal
NormalY.f ;
NormalZ.f ;
TangentX.f
TangentY.f
TangentZ.f
u.f ; qu'avec l'option #PB_Mesh_UVCoordinate
v.f ;
Color.l ; qu'avec l'option #PB_Mesh_Color
EndStructure
Cette structure peut être
inclus dans un tableau ou bien
dans une autre structure.
■ PB_MeshVertex dans un tableau et utilisation de copyArray
Avec ce code on crée deux entités (A et B) de tailles différentes puis à l'aide d'un
GetMeshData() du mesh A on va exécuter un
CopyArray() des informations du Mesh A vers le Mesh B pour obtenir la même taille.
Code : Tout sélectionner
Enumeration
#Mainform
EndEnumeration
Define.l Event
Global Dim MeshDataA.PB_MeshVertex(0)
Global Dim MeshDataB.PB_MeshVertex(0)
InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
OpenWindow(#Mainform,0,0,1024,768, "M", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)
;Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 2, 5, 15, #PB_Absolute)
CameraLookAt(Camera, 0,0,0)
;Creation d'un mesh
MeshA = CreateCube(#PB_Any, 3)
MeshB = CreateCube(#PB_Any, 1)
;Création de deux entités de tailles différentes
EntityA = CreateEntity(#PB_Any, MeshID(MeshA),#PB_Entity_None, -3, 0, 0)
EntityB = CreateEntity(#PB_Any, MeshID(MeshB),#PB_Entity_None, 3, 0, 0)
;Obtenir les données internes du Mesh A
GetMeshData(MeshA, 0, MeshDataA(), #PB_Mesh_Vertex, 0, MeshVertexCount(MeshA)-1)
;Copie des données du Mesh A vers le Mesh B
CopyArray(MeshDataA(), MeshDataB())
;Au final nous aurons deux meshs
SetMeshData(MeshB, 0, MeshDataB(), #PB_Mesh_Vertex, 0, MeshVertexCount(MeshB)-1)
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
If ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
EndIf
; Affiche le rendu de la scène
ClearScreen(RGB(0, 0, 0))
RenderWorld(80)
FlipBuffers()
ForEver
■ PB_MeshVertex dans une structureCode : Tout sélectionner
Enumeration
#Mainform
EndEnumeration
Define.l Event
Structure Mesh
Array Meshdata.PB_MeshVertex(0)
EndStructure
Global NewList Meshs.Mesh()
InitEngine3D()
InitKeyboard()
InitSprite()
InitMouse()
OpenWindow(#Mainform,0,0,1024,768, "M", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Mainform),0,0,1024,768,0, 0, 0)
KeyboardMode(#PB_Keyboard_International)
;Lumiere et ombre
AmbientColor(RGB(127, 127, 127))
CreateLight(#PB_Any,RGB(151, 251, 151), -1.8, 10, 5)
WorldShadows(#PB_Shadow_Additive)
;Camera
Camera = CreateCamera(#PB_Any,0,0,100,100)
CameraBackColor(Camera, RGB(145, 182, 201))
MoveCamera(Camera, 2, 5, 15, #PB_Absolute)
CameraLookAt(Camera, 0,0,0)
;Creation de deux meshs de tailles différentes
MeshA = CreateCube(#PB_Any, 3)
MeshB = CreateCube(#PB_Any, 1)
;Création de deux entités de tailles différentes
EntityA = CreateEntity(#PB_Any, MeshID(MeshA),#PB_Entity_None, -3, 0, 0)
EntityB = CreateEntity(#PB_Any, MeshID(MeshB),#PB_Entity_None, 3, 0, 0)
;Obtenir les données internes du Mesh A
AddElement(Meshs())
GetMeshData(MeshA, 0, Meshs()\Meshdata(), #PB_Mesh_Vertex, 0, MeshVertexCount(MeshA)-1)
;Au final nous aurons deux meshs
SetMeshData(MeshB, 0, Meshs()\Meshdata(), #PB_Mesh_Vertex, 0, MeshVertexCount(MeshB)-1)
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
Until Event = 0
If ExamineKeyboard()
If KeyboardPushed (#PB_Key_Escape)
Break
EndIf
EndIf
; Affiche le rendu de la scène
ClearScreen(RGB(0, 0, 0))
RenderWorld(80)
FlipBuffers()
ForEver
Pour copier un élément vers un autre on va créer un pointeur sur l'élément en cours et copier la zone de mémoire structurée courante vers la nouvelle.
Avec le code précédent, juste après
Code : Tout sélectionner
;Au final nous aurons deux meshs
SetMeshData(MeshB, 0, Meshs()\Meshdata(), #PB_Mesh_Vertex, 0, MeshVertexCount(MeshB)-1)
Ajoute
Code : Tout sélectionner
*Element = @Meshs()
AddElement(Meshs())
CopyStructure(*Element, @Meshs(), Mesh)
et tu pourras voir le résultat avec le visualiseur de variables.