Faciliter les choses avec Ogre 3D...

Généralités sur la programmation 3D
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Faciliter les choses avec Ogre 3D...

Message par Ollivier »

Bonjour,

Voilà, je réédite un peu ce post, parce qu'ayant envie de faire évoluer le développement en 3D avec Ogre, ça risque d'être illisible si je ne présente pas les choses proprement...

[Edit]... Et c'est illisible ! Je fais encore le ménage dans ce sujet...
Dernière modification par Ollivier le dim. 15/juin/2008 15:18, modifié 11 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

1er exemple

Code : Tout sélectionner

;_______________________________________________________________________________________
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; Cse - Ollivier
;_______________________________________________________________________________________
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

EnableExplicit
;{ Head }

  ;{ World }
Structure WORLD
  *EntiPtr
  EntiQtt.L
EndStructure
ProcedureDLL.L InitWorld32(MaxEntity.L)
;_______________________________________________________________________________________
; Cette procédure doit être appelée avant toute exploitation 3D
; Elle amorce DirectX, prépare un écran graphique et une vision 3D plein écran
;
; MaxEntity.L : Quantité maximum d'entités à traiter
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  Protected *Result.WORLD
  InitEngine3D()
  InitSprite()
  InitKeyboard()
  InitMouse()
  ExamineDesktops()
  OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "Ogre3D", $80000000)
  OpenWindowedScreen(WindowID(0), 0, 0, WindowWidth(0), WindowHeight(0), 0, 0, 0)
  CreateCamera(0, 0, 0, 100, 100)
  CameraRange(0, 0.1, 10000)
  *Result = AllocateMemory(SizeOf(WORLD) )
  *Result\EntiPtr = AllocateMemory(MaxEntity * 4)
 
  ProcedureReturn *Result
 
EndProcedure
ProcedureDLL WalkWorld()
;_______________________________________________________________________________________
; Explore le monde sans règles précises (liberté de positions et d'angles de caméra)
; Utile pour explorer un décor
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  Protected ExitCode.L
  Protected Event0.L
  Protected Event1.L
  Protected EntityAngleX.F
  Protected EntityAngleY.F
  Protected EntityAngleZ.F
  CameraLocate(0,  100, 1.80,  100)
  CreateLight(0,$FFFFFF)
  LightLocate(0,100,5,100)
  Repeat
      Delay(24)
      StartDrawing(ScreenOutput() )
        DrawText(0, 0, "MODE CAMERA : LIBRE", $FFFFFF, $000000)
        DrawText(0, 16, "X= " + Str(CameraX(0) ) )
        DrawText(0, 32, "Y= " + Str(CameraY(0) ) )
        DrawText(0, 48, "Z= " + Str(CameraZ(0) ) )
      StopDrawing()
      FlipBuffers()
      ClearScreen(0)
      ExamineKeyboard()
      ExamineMouse()
      If KeyboardPushed(#PB_Key_Right): MoveCamera(0,  1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_Left):  MoveCamera(0, -1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_PageUp):    MoveCamera(0,  0, 1, 0):EndIf
      If KeyboardPushed(#PB_Key_PageDown):  MoveCamera(0,  0, -1, 0):EndIf
      If KeyboardPushed(#PB_Key_Up):    MoveCamera(0,  0, 0, -1):EndIf
      If KeyboardPushed(#PB_Key_Down):  MoveCamera(0,  0, 0, 1):EndIf
      Event0 = WindowEvent()
      If Event0 = 16: ExitCode | 1: EndIf
      If Event0 = #PB_Event_Menu: ExitCode | 2: EndIf
      If Event0 = #WM_RBUTTONDOWN: DisplayPopupMenu(0, WindowID(0) ): EndIf
      If KeyboardPushed(#PB_Key_Escape): ExitCode | 1: EndIf
      RotateCamera(0, -MouseDeltaX(), -MouseDeltaY(), 0)
      CameraLocate(0,  CameraX(0), 1.80, CameraZ(0) )
      RenderWorld()
    Until ExitCode
   
EndProcedure
ProcedureDLL ExploreWorld()
;_______________________________________________________________________________________
; Explore le monde sans règles précises (liberté de positions et d'angles de caméra)
; Utile pour explorer un décor
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  Protected ExitCode.L
  Protected Event0.L
  Protected Event1.L
  Protected EntityAngleX.F
  Protected EntityAngleY.F
  Protected EntityAngleZ.F
  MoveCamera(0,  0, 0,  50)
  CreateLight(0,$FFFFFF)
  LightLocate(0,100,5,100)
  Repeat
      Delay(24)
      StartDrawing(ScreenOutput() )
        DrawText(0, 0, "MODE CAMERA : LIBRE", $FFFFFF, $000000)
        DrawText(0, 16, "X= " + Str(CameraX(0) ) )
        DrawText(0, 32, "Y= " + Str(CameraY(0) ) )
        DrawText(0, 48, "Z= " + Str(CameraZ(0) ) )
      StopDrawing()
      FlipBuffers()
      ClearScreen(0)
      ExamineKeyboard()
      ExamineMouse()
      If KeyboardPushed(#PB_Key_Right): MoveCamera(0,  1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_Left):  MoveCamera(0, -1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_PageUp):    MoveCamera(0,  0, 1, 0):EndIf
      If KeyboardPushed(#PB_Key_PageDown):  MoveCamera(0,  0, -1, 0):EndIf
      If KeyboardPushed(#PB_Key_Up):    MoveCamera(0,  0, 0, -1):EndIf
      If KeyboardPushed(#PB_Key_Down):  MoveCamera(0,  0, 0, 1):EndIf
      Event0 = WindowEvent()
      If Event0 = 16: ExitCode | 1: EndIf
      If Event0 = #PB_Event_Menu: ExitCode | 2: EndIf
      If Event0 = #WM_RBUTTONDOWN: DisplayPopupMenu(0, WindowID(0) ): EndIf
      If KeyboardPushed(#PB_Key_Escape): ExitCode | 1: EndIf
      RotateCamera(0, -MouseDeltaX(), -MouseDeltaY(), 0)
      RenderWorld()
    Until ExitCode
   
EndProcedure
ProcedureDLL MapWorld(AltitudeIni.F)
;_______________________________________________________________________________________
; Explore le monde à 40m d'altitude
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  Protected ExitCode.L
  Protected Event0.L
  Protected Event1.L

  Protected EntityAngleX.F
  Protected EntityAngleY.F
  Protected EntityAngleZ.F
 
  CreateLight(0,$FFFFFF)
  LightLocate(0,100,5,100)
  CreateLight(1,$FFFFFF)
  LightLocate(1,100,35,100)
  CameraLocate(0, 0.0, 40.0, 0.0)
  RotateCamera(0, 0.0, -90.0, 0.0)
 
  Repeat
      Delay(48)
      StartDrawing(ScreenOutput() )
        DrawText(0, 0, "MODE CAMERA : LECTURE DE CARTE", $FFFFFF, $000000)
        DrawText(0, 16, "X= " + Str(CameraX(0) ) )
        DrawText(0, 32, "Altitude = " + Str(CameraY(0) ) + "m")
        DrawText(0, 48, "Z= " + Str(CameraZ(0) ) )
      StopDrawing()
      FlipBuffers()
      ClearScreen(0)
      ExamineKeyboard()
;      ExamineMouse()
      If KeyboardPushed(#PB_Key_Right): MoveCamera(0,  1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_Left):  MoveCamera(0, -1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_PageUp):    MoveCamera(0,  0, 0, -10):EndIf
      If KeyboardPushed(#PB_Key_PageDown):  MoveCamera(0,  0, 0, 10):EndIf
      If KeyboardPushed(#PB_Key_Up):    MoveCamera(0,  0, 1, 0):EndIf
      If KeyboardPushed(#PB_Key_Down):  MoveCamera(0,  0, -1, 0):EndIf
      Event0 = WindowEvent()
      If Event0 = 16: ExitCode | 1: EndIf
      If Event0 = #PB_Event_Menu: Event1 = EventMenu(): EndIf
      If Event0 = #WM_RBUTTONDOWN: EndIf
      If KeyboardPushed(#PB_Key_Escape): ExitCode | 1: EndIf
      RenderWorld()
    Until ExitCode
   
EndProcedure
ProcedureDLL FlyWorld(AltitudeIni.F)
;_______________________________________________________________________________________
; Perçoit le paysage en isométrique avec d'altitude stable et des angles constants
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  Protected ExitCode.L
  Protected Event0.L
  Protected Event1.L

  Protected CamX.F
  Protected CamY.F
  Protected CamZ.F

  Protected EntityAngleX.F
  Protected EntityAngleY.F
  Protected EntityAngleZ.F
 
  CreateLight(0,$FFFFFF)
  LightLocate(0,100,5,100)
  CreateLight(1,$FFFFFF)
  LightLocate(1,100,35,100)
  CameraLocate(0, 100.0, 40.0, 100.0)
  RotateCamera(0, 45.0, -45.0, 0.0)
  Repeat
      Delay(48)
      StartDrawing(ScreenOutput() )
        DrawText(0, 0, "MODE HELICO EN ISO", $FFFFFF, $000000)
        DrawText(0, 16, "X= " + Str(CameraX(0) ) )
        DrawText(0, 32, "Altitude = " + Str(CameraY(0) ) + "m")
        DrawText(0, 48, "Z= " + Str(CameraZ(0) ) )
      StopDrawing()
      FlipBuffers()
      ClearScreen(0)
      ExamineKeyboard()
;      ExamineMouse()

      If KeyboardPushed(#PB_Key_PageUp):    MoveCamera(0,  0, 0, -1):EndIf
      If KeyboardPushed(#PB_Key_PageDown):  MoveCamera(0,  0, 0, 1):EndIf
      CamY = CameraY(0)
      If KeyboardPushed(#PB_Key_Right): MoveCamera(0,  1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_Left):  MoveCamera(0, -1, 0,  0):EndIf
      If KeyboardPushed(#PB_Key_Up):    MoveCamera(0,  0, 1, 0):EndIf
      If KeyboardPushed(#PB_Key_Down):  MoveCamera(0,  0, -1, 0):EndIf
     
      CameraLocate(0, CameraX(0), CamY, CameraZ(0) )
     
      Event0 = WindowEvent()
      If Event0 = 16: ExitCode | 1: EndIf
      If Event0 = #PB_Event_Menu: Event1 = EventMenu(): EndIf
      If Event0 = #WM_RBUTTONDOWN: EndIf
      If KeyboardPushed(#PB_Key_Escape): ExitCode | 1: EndIf
      RenderWorld()
    Until ExitCode
   
EndProcedure
ProcedureDLL WorldMenu()
  ;ExploreWorld()
  ;MapWorld(200.0)
  ;FlyWorld(40.0)
  WalkWorld()
EndProcedure
  ;}
  ;{ Texture }
Structure ENTI
  N.L
  Texture.L
  Material.L
  Mesh.L
  MeshData.L
EndStructure
ProcedureDLL TextureMonochrom(*Enti.ENTI, Color.L)
  *Enti\Texture = CreateTexture(-1, 256, 256)
  StartDrawing(TextureOutput(*Enti\Texture) )
    Box(0, 0, 256, 256, Color)
  StopDrawing()
EndProcedure
ProcedureDLL TextureGrass(*Enti.ENTI)
  Protected x.L
  Protected y.L
  Protected R.L
  Protected V.L
  Protected B.L
  *Enti\Texture = CreateTexture(-1, 256, 256)
  StartDrawing(TextureOutput(*Enti\Texture) )
    For y = 0 To 255
      For x = 0 To 255
        V = Random(255)
        R = Random(V)
        B = 0
        Box(x, y, 1, 1, RGB(R, V, B) )
      Next
    Next
  StopDrawing()
EndProcedure
  ;}
  ;{ Mesh }
ProcedureDLL CreateMeshBuffer()
;_______________________________________________________________________________________
; CreateMeshBuffer() crée un buffer vierge qui va contenir la structure fil de fer.
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  Protected *Enti.ENTI
  *Enti = AllocateMemory(SizeOf(ENTI) )
  *Enti\MeshData = AllocateMemory(16)
  PokeL(*Enti\MeshData, AllocateMemory(1 << 17) ) ; Mémoire pour les sommets
  PokeL(*Enti\MeshData + 4, AllocateMemory(1 << 17) ) ; Mémoire pour les faces
  PokeL(*Enti\MeshData + 8, 0) ; Quantité de sommets
  PokeL(*Enti\MeshData + 12, 0) ; Quantité de face
  ProcedureReturn *Enti
 
EndProcedure
ProcedureDLL FreeMeshBuffer(*MeshBuffer)
;_______________________________________________________________________________________
; Libère le buffer de structure fil de fer
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

  FreeMemory(PeekL(*MeshBuffer) )
  FreeMemory(PeekL(*MeshBuffer + 4) )
  FreeMemory(*MeshBuffer)

EndProcedure
ProcedureDLL MeshAddTria(*MB, x1.F, y1.F, z1.F, x2.F, y2.F, z2.F, x3.F, y3.F, z3.F)

  Protected Ax.F
  Protected Ay.F
  Protected Az.F
 
  Protected Bx.F
  Protected By.F
  Protected Bz.F
 
  Protected Nx.F
  Protected Ny.F
  Protected Nz.F

  Protected *VertexList
  Protected *FaceList
  Protected VertexQ.L
  Protected FaceQ.L
  Protected *Vertex
  Protected *Face
 
  *VertexList = PeekL(*MB)
  *FaceList = PeekL(*MB + 4)
  VertexQ = PeekL(*MB + 8)
  FaceQ = PeekL(*MB + 12)

  *Vertex = *VertexList + VertexQ * 32
  *Face = *FaceList + FaceQ * 6
   
  Ax = x2 - x1: Ay = y2 - y1: Az = z2 - z1
  Bx = x3 - x1: By = y3 - y1: Bz = z3 - z1   

  Nx = (Ay * Bz) - (By * Az)
  Ny = (Ax * Bz) - (Bx * Az)
  Nz = (Ax * By) - (Bx * Ay)
 
  PokeF(*Vertex, x1)
  PokeF(*Vertex + 4, y1)
  PokeF(*Vertex + 8, z1)
  PokeF(*Vertex + 12, nx)
  PokeF(*Vertex + 16, ny)
  PokeF(*Vertex + 20, nz)
  PokeF(*Vertex + 24, 0.0)
  PokeF(*Vertex + 28, 0.0)
  *Vertex + 32: VertexQ + 1
 
  PokeF(*Vertex, x2)
  PokeF(*Vertex + 4, y2)
  PokeF(*Vertex + 8, z2)
  PokeF(*Vertex + 12, nx)
  PokeF(*Vertex + 16, ny)
  PokeF(*Vertex + 20, nz)
  PokeF(*Vertex + 24, 1.0)
  PokeF(*Vertex + 28, 0.0)
  *Vertex + 32: VertexQ + 1
 
  PokeF(*Vertex, x3)
  PokeF(*Vertex + 4, y3)
  PokeF(*Vertex + 8, z3)
  PokeF(*Vertex + 12, nx)
  PokeF(*Vertex + 16, ny)
  PokeF(*Vertex + 20, nz)
  PokeF(*Vertex + 24, 0.0)
  PokeF(*Vertex + 28, 1.0)
  *Vertex + 32: VertexQ + 1
 
  PokeW(*Face, VertexQ - 4)
  PokeW(*Face + 2, VertexQ - 3)
  PokeW(*Face + 4, VertexQ - 2)
  *Face + 6: FaceQ + 1
 
  PokeW(*Face, VertexQ - 2)
  PokeW(*Face + 2, VertexQ - 3)
  PokeW(*Face + 4, VertexQ - 1)
  *Face + 6: FaceQ + 1
 
  PokeL(*MB + 8, VertexQ)
  PokeL(*MB + 12, FaceQ)

EndProcedure
ProcedureDLL MeshAddQuad(*MB, x1.F, y1.F, z1.F, x2.F, y2.F, z2.F, x3.F, y3.F, z3.F, x4.F, y4.F, z4.F)

  Protected Ax.F
  Protected Ay.F
  Protected Az.F
  Protected Bx.F
  Protected By.F
  Protected Bz.F
  Protected Nx.F
  Protected Ny.F
  Protected Nz.F

  Protected *VertexList
  Protected *FaceList
  Protected VertexQ.L
  Protected FaceQ.L
  Protected *Vertex
  Protected *Face
 
  *VertexList = PeekL(*MB)
  *FaceList = PeekL(*MB + 4)
  VertexQ = PeekL(*MB + 8)
  FaceQ = PeekL(*MB + 12)
  *Vertex = *VertexList + VertexQ * 32
  *Face = *FaceList + FaceQ * 6
   
  Ax = x2 - x1: Ay = y2 - y1: Az = z2 - z1
  Bx = x3 - x1: By = y3 - y1: Bz = z3 - z1   

  Nx = (Ay * Bz) - (By * Az)
  Ny = (Ax * Bz) - (Bx * Az)
  Nz = (Ax * By) - (Bx * Ay)
 
  PokeF(*Vertex, x1)
  PokeF(*Vertex + 4, y1)
  PokeF(*Vertex + 8, z1)
  PokeF(*Vertex + 12, nx)
  PokeF(*Vertex + 16, ny)
  PokeF(*Vertex + 20, nz)
  PokeF(*Vertex + 24, 0.0)
  PokeF(*Vertex + 28, 0.0)
  *Vertex + 32: VertexQ + 1
 
  PokeF(*Vertex, x2)
  PokeF(*Vertex + 4, y2)
  PokeF(*Vertex + 8, z2)
  PokeF(*Vertex + 12, nx)
  PokeF(*Vertex + 16, ny)
  PokeF(*Vertex + 20, nz)
  PokeF(*Vertex + 24, 1.0)
  PokeF(*Vertex + 28, 0.0)
  *Vertex + 32: VertexQ + 1
 
  PokeF(*Vertex, x3)
  PokeF(*Vertex + 4, y3)
  PokeF(*Vertex + 8, z3)
  PokeF(*Vertex + 12, nx)
  PokeF(*Vertex + 16, ny)
  PokeF(*Vertex + 20, nz)
  PokeF(*Vertex + 24, 0.0)
  PokeF(*Vertex + 28, 1.0)
  *Vertex + 32: VertexQ + 1
 
  PokeF(*Vertex, x4)
  PokeF(*Vertex + 4, y4)
  PokeF(*Vertex + 8, z4)
  PokeF(*Vertex + 12, nx)
  PokeF(*Vertex + 16, ny)
  PokeF(*Vertex + 20, nz)
  PokeF(*Vertex + 24, 1.0)
  PokeF(*Vertex + 28, 1.0)
  *Vertex + 32: VertexQ + 1

  PokeW(*Face, VertexQ - 4)
  PokeW(*Face + 2, VertexQ - 3)
  PokeW(*Face + 4, VertexQ - 2)
  *Face + 6: FaceQ + 1
 
  PokeW(*Face, VertexQ - 2)
  PokeW(*Face + 2, VertexQ - 3)
  PokeW(*Face + 4, VertexQ - 1)
  *Face + 6: FaceQ + 1
 
  PokeL(*MB + 8, VertexQ)
  PokeL(*MB + 12, FaceQ)

EndProcedure
ProcedureDLL MeshAddSquare(*MB, x.F, y.F, z.F, Side.F)

  Protected x1.F
  Protected y1.F
  Protected z1.F
 
  Protected x2.F
  Protected y2.F
  Protected z2.F
 
  Protected x3.F
  Protected y3.F
  Protected z3.F
 
  Protected x4.F
  Protected y4.F
  Protected z4.F

  x * Side
  z * Side

  x1 = x
  y1 = y
  z1 = z
 
  x2 = x
  y2 = y
  z2 = z + Side
 
  x3 = x + Side
  y3 = y
  z3 = z
 
  x4 = x + Side
  y4 = y
  z4 = z + Side
 
  MeshAddQuad(*MB, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4)
 
EndProcedure
ProcedureDLL MeshAddBox(*MB, x1.F, y1.F, z1.F, x2.F, y2.F, z2.F)
  MeshAddQuad(*MB, x1, y1, z2, x2, y1, z2, x1, y2, z2, x2, y2, z2)
  MeshAddQuad(*MB, x1, y1, z1, x1, y1, z2, x1, y2, z1, x1, y2, z2)
  MeshAddQuad(*MB, x2, y1, z1, x1, y1, z1, x2, y2, z1, x1, y2, z1)
  MeshAddQuad(*MB, x2, y1, z2, x2, y1, z1, x2, y2, z2, x2, y2, z1)
  MeshAddQuad(*MB, x1, y1, z1, x2, y1, z1, x1, y1, z2, x2, y1, z2)
  MeshAddQuad(*MB, x1, y2, z2, x2, y2, z2, x1, y2, z1, x2, y2, z1)
EndProcedure
ProcedureDLL CatchMesh(*Enti.ENTI)
;_______________________________________________________________________________________
; Transfert les données du buffer *MeshBuff dans la nouvelle structure Mesh
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  *Enti\Mesh = CreateMesh(-1, PeekL(*Enti\MeshData + 8) )
  SetMeshData(*Enti\Mesh, 13, PeekL(*Enti\MeshData), PeekL(*Enti\MeshData + 8) )
  SetMeshData(*Enti\Mesh, 16, PeekL(*Enti\MeshData + 4), PeekL(*Enti\MeshData + 12) )
 
EndProcedure
  ;}
  ;{ Entity }
ProcedureDLL CatchEntity(*World.WORLD, *Enti.ENTI, n.L)

  Protected *EntityIndex
   
  CatchMesh(*Enti)
  *Enti\Material = CreateMaterial(-1, TextureID(*Enti\Texture) )
  CreateEntity(n, MeshID(*Enti\Mesh), MaterialID(*Enti\Material) )
  *Enti\N = n
 
  *EntityIndex = *World\EntiPtr + (*World\EntiQtt * 4)
  PokeL(*EntityIndex, *Enti)
  *World\EntiQtt + 1 
 
EndProcedure
ProcedureDLL EntiBalise(*World.WORLD, n.L)

  Protected *Enti.ENTI
   
  *Enti = CreateMeshBuffer()
  MeshAddBox(*Enti\MeshData, 0.0, 0.0, 0.0, 10.0, 10.0, 10.0)
  MeshAddBox(*Enti\MeshData, 2.0, -10.0, 2.0, 8.0, 20.0, 8.0)
  TextureMonochrom(*Enti, #Blue)
  CatchEntity(*World, *Enti, n)
 
EndProcedure
ProcedureDLL EntiBuilding(*World.WORLD, n.L, x.F, y.F, z.F, Side.F, LevelHeight.F, LastLevel.L)

  Protected *Enti.ENTI
  Protected Height.F
  Protected i.L
   
  Height = LevelHeight * (LastLevel + 1.0)
  *Enti = CreateMeshBuffer()
  For i = 0 To LastLevel
    MeshAddBox(*Enti\MeshData, x, y + (LevelHeight * i), z, x + Side, y + 0.15 + (LevelHeight * i), z + Side)
  Next
 
  MeshAddBox(*Enti\MeshData, x, y, z, x + 0.20, y + Height, z + 0.20)
  MeshAddBox(*Enti\MeshData, x + Side, y, z, x + 0.20 + Side, y + Height, z + 0.20)
  MeshAddBox(*Enti\MeshData, x, y, z + Side, x + 0.20, y + Height, z + 0.20 + Side)
  MeshAddBox(*Enti\MeshData, x + Side, y, z + Side, x + 0.20 + Side, y + Height, z + 0.20 + Side)
  TextureMonochrom(*Enti, #White)
  CatchEntity(*World, *Enti, n)
 
EndProcedure
ProcedureDLL EntiMapRandom(n.L, w.L, d.L, Altitude.L)

  Protected *MeshBuff
  Protected x.F
  Protected y.F
  Protected z.F

  Protected ix.L
  Protected iz.L

  Protected i1y.F
  Protected i2y.F
  Protected i3y.F
  Protected i4y.F
 
  Protected Dist.F
  Protected dx.F
  Protected dz.F
 
;  *MeshBuff = CreateMeshBuffer()
 
  Global Dim Alt.F(w, d)
  For ix = 0 To w
    For iz = 0 To d
      dx = (ix - w / 2)
      dz = (iz - d / 2)
      Dist = (dx * dx) + (dz * dz)
      Alt(ix, iz) = Sin(Dist / 64.0) * Altitude + Random(10)
    Next
  Next
 
  For ix = 0 To w - 1
    For iz = 0 To d - 1
      x = ix * 10.0
      z = iz * 10.0
      i1y = Alt(ix, iz + 1)
      i2y = Alt(ix + 1, iz + 1)
      i3y = Alt(ix, iz)
      i4y = Alt(ix + 1, iz)
      MeshAddQuad(*MeshBuff, x, i1y, z, x + 10.0, i2y, z, x, i3y, z - 10.0, x + 10.0, i4y, z - 10.0)
    Next
  Next     
;  CatchMesh(0, *MeshBuff)
  TextureGrass(0)
  CreateEntity(n, MeshID(0), MaterialID(0) )
 
EndProcedure
ProcedureDLL EntiMapSquarePlain(*World.WORLD, n.L, MapWidth.F, MapDepth.F, Altitude.F, TileSide.F)

  Protected *Enti.ENTI
 
  Protected ixMax.L
  Protected izMax.L
 
  Protected ix.L
  Protected iz.L
   
  *Enti = CreateMeshBuffer()
  TextureGrass(*Enti)
 
  ixMax = Int(MapWidth / TileSide) - 1
  izMax = Int(MapDepth / TileSide) - 1
 
  For ix = 0 To ixMax
    For iz = 0 To izMax
   
      MeshAddSquare(*Enti\MeshData, ix, Altitude, iz, TileSide)
     
    Next
  Next
 
  CatchEntity(*World, *Enti, n)
 
EndProcedure
  ;}

;}

; *** C'est ici que tout commence ! ***

  Define *World.WORLD 
  Define i.L 
  
  *World = InitWorld32(16) 
  
  EntiMapSquarePlain(*World, 2, 320.0, 320.0, 0.0, 10.0) ;: EntityLocate(2, 20.0, 0.0, 0.0) 

  For i = 0 To 50 

    EntiBuilding(*World, i + 3, Random(31) * 10.0, 0.0, Random(31) * 10.0, 10.0, 2.5, 1 + Random(9) ) 

  Next 

  WalkWorld() 
Dernière modification par Ollivier le jeu. 29/mai/2008 11:46, modifié 7 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Pas mal du tout! :D Générer le monde 3d permet de gagner de la place... C'est un choix, ou tu n'arrives pas à les faire sous un éditeur 3d?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

chez moi ton exemple deconne avec les touches page up/down

normalement on devrais s'elever dans les airs , ben chez moi ça s'eleve pas !

ça recule ou ça avance ...

je pense a un bug de la gestion d'OGRE par Purebasic, car apparemment tes parametres sembles bon :?
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Dobro a écrit :chez moi ton exemple deconne avec les touches page up/down

normalement on devrais s'elever dans les airs , ben chez moi ça s'eleve pas !

ça recule ou ça avance ...

je pense a un bug de la gestion d'OGRE par Purebasic, car apparemment tes parametres sembles bon :?
De même pour moi.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Salut à vous !

@djes : Mon but est d'éviter les Datas et les fichiers externes. Il n'y a que sans cela que l'on peut savoir vraiment ce qui nous est offert en natif. A partir du moment ou le programmeur sait ce qu'il peut faire, ça permet aussi d'évaluer correctement le besoin de recruter ou non un modeleur ou un graphiste dans un projet. Or actuellement, en PureBasic, la 3D c'est... vide...

@dobro et wolfjeremy

C'est «normal». C'est un reliquat : Ces 2 touches ne devraient pas fonctionner pour cet exemple! J'ai créé plusieurs procédures d'utilisation de caméra (WalkWorld, FlyWorld, MachinWorld, etc...). Vous pouvez tester les différentes procédures.

Par exemple, remplacer "WalkWorld()" par "ExploreWorld()".

Ollivier
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ollivier a écrit : Mon but est d'éviter les Datas et les fichiers externes. Il n'y a que sans cela que l'on peut savoir vraiment ce qui nous est offert en natif. A partir du moment ou le programmeur sait ce qu'il peut faire, ça permet aussi d'évaluer correctement le besoin de recruter ou non un modeleur ou un graphiste dans un projet. Or actuellement, en PureBasic, la 3D c'est... vide...
Moi je veux bien mais une bonne partie d'ogre concerne les fichiers .mesh et .material qui permettent de faire les anims, gérer les textures et le rendus. Tu dois évaluer ça aussi.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

(Hop... Ménage... Trop lourd mes explications...) Si quelqu'un a des questions, qu'il n'hésite pas...)
Dernière modification par Ollivier le jeu. 29/mai/2008 11:48, modifié 6 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@djes
Moi je veux bien mais une bonne partie d'ogre concerne les fichiers .mesh et .material qui permettent de faire les anims, gérer les textures et le rendus. Tu dois évaluer ça aussi.
C'est ce qui m'a découragé au départ.

Mais, est-ce que ça empêche de créer une animation sortie de ton imagination à l'écran?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ollivier a écrit :@djes
Moi je veux bien mais une bonne partie d'ogre concerne les fichiers .mesh et .material qui permettent de faire les anims, gérer les textures et le rendus. Tu dois évaluer ça aussi.
C'est ce qui m'a découragé au départ.

Mais, est-ce que ça empêche de créer une animation sortie de ton imagination à l'écran?
Non bien sûr. Pour certaines choses le code est plus facile (voire indispensable, par ex pour les déplacements), pour d'autres créer une anim sur son logiciel est préférable (par ex pour animer un visage; tu peux t'amuser à reproduire le comportement de tous les muscles, mais ça prendra surement beaucoup plus de temps).
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

Ollivier a écrit : I.4. Rappel sur les procédures

Je rappelle qu'une procédure c'est un bout de code avec un titre et des arguments entre parenthèses qu'on écrit pour ne plus avoir à le réécrire.

Code : Tout sélectionner

Procedure Titre()
Debug "Je suis une phrase écrite une seule fois."
EndProcedure

Titre()
Titre()
Titre()
(Même sans argument, on doit mettre la paire de parenthèses «()» après le titre de la procédure. )

Voilà, dans ce code, j'écris ma phrase une fois pour toute, et après je l'appelle 3 fois (c'est un exemple). ça m'évite de réécrire 3 fois la phrase.

Code : Tout sélectionner

Debug "Je suis une phrase écrite."
Debug "Je suis une phrase écrite."
Debug "Je suis une phrase écrite."
C'est plus simple avec Titre(): Titre(): Titre()...Surtout quand on va appeler une procédure des dizaines de fois...

Les avantages d'une procédure :
- économiser du temps en programmation
- réduire la taille d'un EXE
- export possible vers une DLL
- souplesse du code (1 ligne changée = beaucoup de changement dans le programme)
je sait que je chipote mais pour cette exemple j'aurai plutôt utilisé un macro on évite un appel de fonction supplémentaire.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@djes

Je comprends ton optique : mais sais-tu quelles animations sont possibles? Non! Moi, non plus, je ne sais pas!

C'est pour ça que je lance ces procédures ci-dessus (et que je vais les expliquer pas à pas). Il ne faut pas qu'on soit arrêté parce qu'il nous manque telle ou telle fonction.

Avec quelque chose à montrer, ça suscitera plus de critiques favorables à un moteur complet natif à l'avenir.

Ollivier
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ollivier a écrit :@djes

Je comprends ton optique : mais sais-tu quelles animations sont possibles? Non! Moi, non plus, je ne sais pas!

C'est pour ça que je lance ces procédures ci-dessus (et que je vais les expliquer pas à pas). Il ne faut pas qu'on soit arrêté parce qu'il nous manque telle ou telle fonction.

Avec quelque chose à montrer, ça suscitera plus de critiques favorables à un moteur complet natif à l'avenir.

Ollivier
J'ai l'impression que tu penses que je critique ton initiative... Bien au contraire, tout travail visant à améliorer le langage est le bienvenu! Keep up!
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Chaos

Procédure ou Macro : je n'en fais qu'à ma tête! Tu as tout à fait raison. En fait c'est un choix de départ. J'aurais pu tout mettre en macro mais j'ai préféré faire comme à mon habitude.

@djes

Merci!
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Argh : 1ère modif et gros plantage. Mais c'est quoi cette souris qui fait la grève dès qu'on travaille avec ExamineMouse() ?
Répondre