Page 1 sur 1

Cube 3D avec une couleur par face

Publié : lun. 01/mai/2006 10:16
par comtois
Voila le dernier de la série des primitives classiques.

Ah non , je vais encore faire le tore ,c'est sympa d'avoir tore !!

Code : Tout sélectionner

;Comtois 01/05/06
;PB4.0 Beta 11


Resultat = MessageRequester("Cube 3D","Full Screen ?",#PB_MessageRequester_YesNo)
If Resultat = 6     
  FullScreen=1
Else           
  FullScreen=0
EndIf

;- Initialisation
If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf

If Fullscreen 
  OpenScreen(800,600,32,"Cube 3D")
Else
  OpenWindow(0,0, 0, 800 , 600 ,"Cube 3D",#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),0,0, 800 , 600,0,0,0)
EndIf

Macro MaCouleur(Rouge,Vert,Bleu)
  Rouge << 16 + Vert << 8 + Bleu
EndMacro

Structure Vertex
   px.f
   py.f
   pz.f
   nx.f
   ny.f
   nz.f
   co.l
   u.f
   v.f
EndStructure

Structure FTriangle
   f1.w
   f2.w
   f3.w
EndStructure

Structure s_Mesh
   No.l
   *VBuffer.Vertex
   *Ibuffer.FTriangle
EndStructure


Global Angle.f,Pas.f, CameraMode.l
Global *VBuffer,*IBuffer

Define.s_Mesh CubeMesh


Procedure CreateMeshCube(*Mesh.s_Mesh)
   *Mesh\VBuffer=AllocateMemory(SizeOf(Vertex)*24)
   *Mesh\IBuffer=AllocateMemory(SizeOf(FTriangle)*12)
   CopyMemory(?Vertices , *Mesh\VBuffer, SizeOf(Vertex)*24)
   CopyMemory(?Triangles, *Mesh\IBuffer, SizeOf(Vertex)*24)
     
   If CreateMesh(*Mesh\No,100)
      Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color 
      SetMeshData(*Mesh\No, Flag         , *Mesh\VBuffer, 24)
      SetMeshData(*Mesh\No, #PB_Mesh_Face, *Mesh\IBuffer, 12) 
      ProcedureReturn 1
   Else
      ProcedureReturn 0   
   EndIf
EndProcedure   

Procedure UpColorCube(*Mesh.s_Mesh,Color)
  *Mem.Vertex = *Mesh\VBuffer
  For i = 0 To 3
    *Mem\co=Color
    *Mem + SizeOf(Vertex)
  Next i
EndProcedure  

Procedure DownColorCube(*Mesh.s_Mesh,Color)
  *Mem.Vertex = *Mesh\VBuffer + 4 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=Color
    *Mem + SizeOf(Vertex)
  Next i
EndProcedure

Procedure FrontColorCube(*Mesh.s_Mesh,Color)
  *Mem.Vertex = *Mesh\VBuffer + 8 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=Color
    *Mem + SizeOf(Vertex)
  Next i
EndProcedure
  
Procedure BackColorCube(*Mesh.s_Mesh,Color)
  *Mem.Vertex = *Mesh\VBuffer + 12 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=Color
    *Mem + SizeOf(Vertex)
  Next i
EndProcedure

Procedure LeftColorCube(*Mesh.s_Mesh,Color)  
  *Mem.Vertex = *Mesh\VBuffer + 16 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=Color
    *Mem + SizeOf(Vertex)
  Next i
EndProcedure
  
Procedure RightColorCube(*Mesh.s_Mesh,Color)
  *Mem.Vertex = *Mesh\VBuffer + 20 * SizeOf(Vertex)
  For i = 0 To 3
    *Mem\co=Color
    *Mem + SizeOf(Vertex)
  Next i 
EndProcedure

Procedure UpDateCube(*Mesh.s_Mesh)
   Flag = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate | #PB_Mesh_Color 
   SetMeshData(*Mesh\No, Flag  , *Mesh\VBuffer, 24)
EndProcedure

;-Mesh
CubeMesh\No = 0
CreateMeshCube(@CubeMesh)
UpColorCube(@CubeMesh, MaCouleur(255,0,0))
DownColorCube(@CubeMesh, MaCouleur(255,255,0))
FrontColorCube(@CubeMesh, MaCouleur(0,255,0))
BackColorCube(@CubeMesh, MaCouleur(0,0,255))
LeftColorCube(@CubeMesh, MaCouleur(255,128,0))
RightColorCube(@CubeMesh, MaCouleur(255,255,255))
UpDateCube(@CubeMesh)

;-Texture
CreateTexture(0,128, 128)
StartDrawing(TextureOutput(0))
  Box(0, 0, 128, 128, 0)
  Box(1, 1, 126, 126, $FFFFFF)
StopDrawing() 

;-Material
CreateMaterial(0,TextureID(0))
MaterialAmbientColor(0,-1) 

;-Entity
CreateEntity(0,MeshID(0),MaterialID(0))
ScaleEntity(0,90,90,90)

;-Camera
CreateCamera(0, 0, 0 , 100 , 100)
MoveCamera(0,0,0,-400)
CameraLookAt(0,EntityX(0),EntityY(0),EntityZ(0))


;-Light
AmbientColor(RGB(255,255,255))

pas = 0.8
Repeat
   ;ClearScreen(0)
   If fullscreen = 0
      While WindowEvent() : Wend
   EndIf 
   Angle + Pas
   RotateEntity(0,angle,angle/2,-Angle)

   If ExamineKeyboard()
     If KeyboardReleased(#PB_Key_F1)
       CameraMode=1-CameraMode
       CameraRenderMode(0,CameraMode)
     EndIf
   EndIf
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) 

DataSection
Vertices:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.l 0
Data.f 0,1

Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,1

Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.l 0
Data.f 1,0

;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,0

Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.l 0
Data.f 1,0

;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,0

Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,1

Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,1

Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,0

;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,0

Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,1

Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,1

Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,0

;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 0,0

Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 0,1

Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 1,0

;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 1,1

Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 1,0

Triangles:
;0 à 3
Data.w 2,1,0
Data.w 0,3,2
;4 à 7
Data.w 6,5,4
Data.w 4,7,6
;8 à 11
Data.w 10,9,8
Data.w 8,11,10
;12 à 15
Data.w 14,13,12
Data.w 12,15,14
;16 à 19
Data.w 18,17,16
Data.w 16,19,18
;20 à 23
Data.w 22,21,20
Data.w 20,23,22
EndDataSection

Publié : lun. 01/mai/2006 13:01
par wolfjeremy
Arf je capte rien moi au moteur de PB, faudrai une doc plus complete car j'arriverai jamais a rien :(

Publié : lun. 01/mai/2006 13:29
par comtois
c'est vraiment pas indispensable de créer ses meshes manuellement.
Tu peux les faire avec un éditeur et utiliser LoadMesh() .
C'est plus simple et surtout plus efficace quand on veut autre chose qu'un cube :)

Le mieux pour comprendre, c'est que tu commences à en faire ;), ensuite tu montres ton code si tu coinces, et on essaye de t'aider dans la mesure du possible.