Bon , la 3D est en place , prochaine étape , mettre de l'ordre dans ce code ( c'est un mélange de mes différents essais ) .
Code : Tout sélectionner
#WINDOW = 0
#TOOLBAR = 0
#MENU = 0
#GADGET_MDI = 1
#ScreenWidth  = 800
#Screenheight = 600
#AngleInitial = 90
#Camera = 0
;/Gadgets
Enumeration
  #TrackBar_HauteurCamera
  #TrackBar_DistanceCamera
  #TrackBar_InclinaisonCamera
  #String_CameraHauteur
  #String_CameraDistance
  #String_CameraInclinaison
  #Button_CameraMode
  #Button_CameraRotationGauche
  #Button_CameraRotationDroite
  #CheckBox_ChangeTextureFacette
  #ScrollArea_Texture
  #String_NbTextureX
  #String_NbTextureZ
  #String_TextureTailleX
  #String_TextureTailleZ
  #Button_ChargeTexture
  #Text_TextureTailleX
  #Text_TextureTailleZ
  #Text_NbTextureX
  #Text_NbTextureZ
  #Button_RemplissageTexture
  #ButtonImage_TextureEnCours
  #Image_TextureEnCours
  #Frame3D_InfosTexture
  #Text_FacetteNewHauteur
  #String_FacetteNewHauteur
  #Option_Facette
  #Option_Vertex
  #Option_SansTexture
  #Option_AvecTexture
  #CheckBox_Vertex1
  #CheckBox_Vertex2
  #CheckBox_Vertex3
  #CheckBox_Vertex4
  #TrackBar_CurseurTailleX
  #TrackBar_CurseurTailleZ
  #Button_CameraBackColor
  #ButtonImage_TextureFinale
  #Text_LargeurMatrice
  #Text_ProfondeurMatrice
  #Text_NbFacetteXMatrice
  #Text_NbFacetteZMatrice
  #String_LargeurMatrice
  #String_ProfondeurMatrice
  #String_NbFacetteXMatrice
  #String_NbFacetteZMatrice
  #CheckBox_DoubleFaceMatrice
  #Button_ValideMatrice
  #Button_ValideDecoupageTexture
  #TrackBar_DecalageCamera
  #String_DecalageCamera
  #Panel_Principal
  #Panel_3D
  #Panel_Texture
  #Contenair
EndEnumeration
;/Menu
#MenuBarre = 0
#PopupMenu = 1
Enumeration
  #Menu_NouvelleMatrice
  #Menu_OuvrirMatrice
  #Menu_SauverMatrice
  #MEnu_Exporter
  #Menu_Importer
  #Menu_Quitter
  #Menu_Aide
  #Menu_CouleurAmbiante
  #Menu_CouleurLumiere
  #Menu_HauteurLumiere
  #Menu_Camera
  #Menu_VueCamera1
  #Menu_VueCamera2
  #Menu_VueCamera3
  #Menu_VueCamera4
  #Menu_Curseur
  #Menu_HauteurCurseur1
  #Menu_HauteurCurseur2
  #Menu_HauteurCurseur3
  #Menu_HauteurCurseur4
  #Menu_ChargeTexture
  #Menu_PrepareTexture
  
  #MenuPop_SelectionFacette
  #MenuPop_RotationTextureDR
  #MenuPop_RotationTextureGA
  #MenuPop_AppliquerTexture
  #MenuPop_FixerHauteur
  
  #Shortcut_CTRL_Up
  #Shortcut_CTRL_Down
  #Shortcut_CTRL_Left
  #Shortcut_CTRL_Right
  #Shortcut_ALT_Up
  #Shortcut_ALT_Down
  #Shortcut_ALT_Left
  #Shortcut_ALT_Right
  #Shortcut_Up
  #Shortcut_Down
  #Shortcut_Left
  #Shortcut_Right
  #Shortcut_SHIFT
  #Shortcut_SHIFT_Up
  #Shortcut_SHIFT_Down
  #Shortcut_SHIFT_Left
  #Shortcut_SHIFT_Right  
EndEnumeration
;/Menu
Enumeration
  #MENU_Open
  #MENU_Close
  #MENU_CloseAll
  #MENU_Quit
  
  #MENU_ChargerTexture
  
  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next
  
  #MENU_FirstMDI
EndEnumeration
;/Images
Enumeration
  #ImageTextureFinale
  #ImageTextureEnCours
  #ImageRadar
EndEnumeration 
;/Entity
Enumeration
  #Curseur
  #Matrice
  #Sphere
  #Coin1
  #Coin2
  #Coin3
  #Coin4
  #Pointe
  #Fleche
EndEnumeration
#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget
Structure Camera
  AngleX.l       ; angle de la camera 
  AngleY.l       ;Inclinaison 
  Decalage.l     ; Decalage par rapport au curseur
  VitesseRotation.l
  SensRotation.l ; Sens et Vitesse de Rotation 
  Distance.l     ; distance entre la camera et le perso 
  Hauteur.l      ; hauteur de la camera 
  ToucheHaut.l 
  ToucheBas.l
  ToucheAvance.l
  ToucheRecul.l
  ToucheAngleHaut.l
  ToucheAngleBas.l
  ToucheRotationGauche.l
  ToucheRotationDroite.l
  RenderMode.s[2]
  Mode.l
EndStructure
Structure Matrice 
  largeur.f 
  Profondeur.f 
  NbFacetteX.l      
  NbFacetteZ.l      
  FaceVisible.l      ; si = #True on double les triangles pour voir l'entité des deux côtés 
  NbPointX.l 
  NbPointZ.l 
  Nbtriangle.l 
  TailleFacetteX.f   ; Je ne sais pas si je vais garder cette méthode 
  TailleFacetteZ.f   ; Je ne sais pas si je vais garder cette méthode  
  NbTextureX.l
  NbTextureZ.l
  TailleTextureX.f
  TailleTextureZ.f
  PointIDMemory.l 
  TriangleIDMemory.l 
  TextureIDMemory.l 
  NormaleIDMemory.l 
  TotalTriangles.l
  TotalPoints.l
EndStructure
Structure Curseur 
  AngleX.l         ;  
  Sens.l           ;Gestion de la rotation de la camera pour se déplacer avec les bonnes touches
  Epaisseur.f
  FacetteX.l      ;position sur la matrice en X 
  FacetteZ.l      ;position sur la matrice en Z
  NbFacetteX.l    ;Largeur du curseur en X
  NbFacetteZ.l    ;profondeur du curseur en Z
  TailleX.l       
  TailleZ.l
  HauteurFacette.l         ;Hauteur de modification des facettes 
  HauteurReelleFacette.l   ; Hauteur d'une facette sous le curseur 
  RayonRoue.l
EndStructure 
Global Camera.Camera
Global Curseur.Curseur
Global Matrice.Matrice
Global Quit.l
;{- Declare
;{-Initialisation
WinWidth = GetSystemMetrics_(#SM_CXSCREEN) 
WinHeight = GetSystemMetrics_(#SM_CYSCREEN) 
If InitEngine3D() = 0 
  MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 ) 
  End 
ElseIf InitSprite() = 0 
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 ) 
  End 
ElseIf OpenWindow(#WINDOW,0,0,WinWidth,WinHeight,#WindowFlags,"Editeur MAP 3D") = 0 
  MessageRequester( "Erreur", "Impossible d'ouvrir la fenêtre") 
  End 
EndIf
;}
;{- Procedures
Procedure Erreur(Message$)
  MessageRequester("Erreur",Message$,0)
  End
EndProcedure 
Procedure Texture()
  AddGadgetItem(#GADGET_MDI, -1, "Textures") 
EndProcedure
Procedure Window()
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      Quit = 1  
      
    Case #WM_RBUTTONDOWN
      DisplayPopupMenu(#PopupMenu,WindowID(#WINDOW), WindowMouseX(),WindowMouseY())  
    ;{/ MenuID  
    Case #PB_Event_Menu
  
      Select EventMenuID()
    
    
        Case #MENU_Quit
          Quit = 1     
      
        Case #MENU_TileV
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileVertically)
      
        Case #MENU_TileH
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileHorizontally)
      
        Case #MENU_Cascade
          SetGadgetState(#GADGET_MDI, #PB_MDI_Cascade)
      
        Case #MENU_Arrange
          SetGadgetState(#GADGET_MDI, #PB_MDI_Arrange)
      
        Case #MENU_Previous
          SetGadgetState(#GADGET_MDI, #PB_MDI_Previous)
      
        Case #MENU_Next
          SetGadgetState(#GADGET_MDI, #PB_MDI_Next)
      
      EndSelect
      ;}
    ;{/Gadget ID
    Case #PB_Event_Gadget
      Select EventGadgetID()  
        
        Case #GADGET_MDI
    
          Type = EventType()
    
          If Type = #PB_EventType_SizeItem          
            Element = GetGadgetAttribute(#GADGET_MDI, #PB_MDI_SizedItem)  
            If Element = 0
              Width  = GetGadgetItemAttribute(#GADGET_MDI, Element, #PB_MDI_ItemWidth)
              Height = GetGadgetItemAttribute(#GADGET_MDI, Element, #PB_MDI_ItemHeight)
              
              If Width > #ScreenWidth
                SetGadgetItemAttribute(#GADGET_MDI, Element, #PB_MDI_ItemWidth , #ScreenWidth)
              EndIf
              If Height > #Screenheight
                SetGadgetItemAttribute(#GADGET_MDI, Element, #PB_MDI_ItemHeight, #Screenheight)
              EndIf  
            EndIf
            
            
          ElseIf Type = #PB_EventType_CloseItem
            Element = GetGadgetState(#GADGET_MDI) 
            If Element
              RemoveGadgetItem(#GADGET_MDI, Element)
            EndIf
            
            
          EndIf  
      
      EndSelect
      ;}
  EndSelect    
EndProcedure
Procedure.f WrapValue(Angle.f) 
  Angle/360 
  Angle-Int(Angle) 
  If Angle<0 
    ProcedureReturn (Angle+1)*360 
  Else 
    ProcedureReturn Angle*360 
  EndIf 
EndProcedure 
Procedure.f NewXValue( x.f , Angle.f , NbUnite.f )
  ;à utiliser conjointement avec NewZvalue pour calculer une position de <NbUnite> dans la direction <angle> 
  Valeur.f = x + Cos(Angle * 0.0174533) * NbUnite
  ProcedureReturn Valeur
EndProcedure
Procedure.f NewZValue( Z.f , Angle.f , NbUnite.f )
  ;à utiliser conjointement avec NewXvalue pour calculer une position de <NbUnite> dans la direction <angle> 
  Valeur.f = Z - Sin(Angle * 0.0174533) * NbUnite
  ProcedureReturn Valeur
EndProcedure
Procedure GestionCamera(No)
  No = #Coin1
  If Camera\SensRotation
    Camera\AngleX = WrapValue(Camera\AngleX + Camera\SensRotation )
    If (Camera\AngleX % 90)=0
      Camera\SensRotation = 0 
    EndIf
  EndIf
  If GetMenuItemState(#PopupMenu,#MenuPop_SelectionFacette)
    PosX.f = EntityX(No) + (M3D_FacetteWidth(#Matrice) / 2)
    PosZ.f = EntityZ(No) + (M3D_FacetteHeight(#Matrice) / 2)
    PosY.f = M3D_GetGroundHeight(#Matrice,PosX,PosZ)
  Else
    PosX.f = EntityX(No)
    PosY.f = EntityY(No)
    PosZ.f = EntityZ(No)
  EndIf  
  Curseur\HauteurReelleFacette = M3D_GetGroundHeight(#Matrice, PosX, PosZ) 
  
  PosXCamera.f = NewXValue(PosX , Camera\AngleX + Camera\Decalage , Camera\Distance)
  PosYCamera.f = PosY + Camera\Hauteur 
  PosZCamera.f = NewZValue(PosZ , Camera\AngleX + Camera\Decalage , Camera\Distance) 
  
  
  ;positionne la caméra 
  CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
  ;oriente la caméra en direction du perso
  CameraLookAt(0 , PosX , PosY + Camera\AngleY, PosZ) 
EndProcedure
;}
;{-Gadgets  
If CreateGadgetList(WindowID(#WINDOW)) And CreateMenu(#MENU, WindowID(#WINDOW)) 
  MenuTitle("Fichier")
  MenuItem(#MENU_Open, "Ouvrir")
  MenuItem(#MENU_Close, "Fermer")
  MenuItem(#MENU_CloseAll, "Fermer tous")
  MenuBar()
  MenuItem(#MENU_Quit, "Quitter")    
  MenuTitle("Textures")
  MenuItem(#MENU_ChargerTexture, "Charger")    
  MenuTitle("Fenêtres")
  MenuItem(#MENU_TileV, "Verticale")
  MenuItem(#MENU_TileH, "Horizontale")
  MenuItem(#MENU_Cascade, "Cascade")
  MenuItem(#MENU_Previous, "Précédente")
  MenuItem(#MENU_Next, "Suivante")
  
  
  MDIGadget(#GADGET_MDI, 0, 0, 0, #MENU, 2, #MENU_FirstMDI, #PB_MDI_AutoSize) 
  AddGadgetItem(#GADGET_MDI, -1, "Vue 3D") 
  hCont = ContainerGadget(0,0,0,#ScreenWidth+5, #Screenheight+5, #PB_Container_Double) 
  Element = GetGadgetState(#GADGET_MDI) 
  SetGadgetItemAttribute(#GADGET_MDI, Element, #PB_MDI_ItemWidth , #ScreenWidth)
  SetGadgetItemAttribute(#GADGET_MDI, Element, #PB_MDI_ItemHeight, #Screenheight)
  
  If OpenWindowedScreen( hCont, 0, 0, #ScreenWidth, #Screenheight, 0, 0, 0 ) = 0 
    MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 ) 
    End 
  EndIf 
  
  Texture()
  CloseGadgetList() 
  If CreatePopupMenu(#PopupMenu)
    ;MenuTitle("Aide")
    MenuItem(#MenuPop_SelectionFacette,"Selection Facette")
    MenuItem(#MenuPop_RotationTextureDR,"Rotation texture à droite")
    MenuItem(#MenuPop_RotationTextureGA,"Rotation texture à gauche")
    MenuItem(#MenuPop_AppliquerTexture,"Appliquer texture")
    MenuItem(#MenuPop_FixerHauteur,"Fixer Hauteur")
  EndIf  
  ;GestionMenu()
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_Down    , #Shortcut_CTRL_Down  ) 
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_Up      , #Shortcut_CTRL_Up    ) 
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_Left    , #Shortcut_CTRL_Left  ) 
  AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_Right   , #Shortcut_CTRL_Right ) 
  AddKeyboardShortcut(0, #PB_Shortcut_Alt     | #PB_Shortcut_Down    , #Shortcut_ALT_Down   )
  AddKeyboardShortcut(0, #PB_Shortcut_Alt     | #PB_Shortcut_Up      , #Shortcut_ALT_Up     )
  AddKeyboardShortcut(0, #PB_Shortcut_Alt     | #PB_Shortcut_Left    , #Shortcut_ALT_Left   )
  AddKeyboardShortcut(0, #PB_Shortcut_Alt     | #PB_Shortcut_Right   , #Shortcut_ALT_Right  ) 
  AddKeyboardShortcut(0,                        #PB_Shortcut_Down    , #Shortcut_Down       )
  AddKeyboardShortcut(0,                        #PB_Shortcut_Up      , #Shortcut_Up         )
  AddKeyboardShortcut(0,                        #PB_Shortcut_Left    , #Shortcut_Left       )
  AddKeyboardShortcut(0,                        #PB_Shortcut_Right   , #Shortcut_Right      )
  AddKeyboardShortcut(0, #PB_Shortcut_Shift   | #PB_Shortcut_Shift   , #Shortcut_SHIFT      )
  AddKeyboardShortcut(0, #PB_Shortcut_Shift   | #PB_Shortcut_Down    , #Shortcut_SHIFT_Down )
  AddKeyboardShortcut(0, #PB_Shortcut_Shift   | #PB_Shortcut_Up      , #Shortcut_SHIFT_Up   )
  AddKeyboardShortcut(0, #PB_Shortcut_Shift   | #PB_Shortcut_Left    , #Shortcut_SHIFT_Left )
  AddKeyboardShortcut(0, #PB_Shortcut_Shift   | #PB_Shortcut_Right   , #Shortcut_SHIFT_Right)
EndIf 
;}
;{-Barre d'outils
If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
  ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
  ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
  ToolBarSeparator()
  ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
  ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
EndIf
;}
;{-Barre de status
If CreateStatusBar(0, WindowID(0))
  AddStatusBarField(100)
  AddStatusBarField(100)
  AddStatusBarField(100)
EndIf
StatusBarText(0, 0, "position curseur")
StatusBarText(0, 1, "dispo")
StatusBarText(0, 2, "No texture") 
;}
;{- Textures
CreateTexture(#Coin1,128, 128) 
StartDrawing(TextureOutput(#Coin1))
  Box(0,0,TextureWidth(#Coin1),TextureHeight(#Coin1),RGB(255, 100, 100))
StopDrawing() 
CreateTexture(#Matrice, 256, 256) 
StartDrawing(TextureOutput(#Matrice)) 
  Box(0, 0, TextureWidth(#Matrice), TextureHeight(#Matrice), RGB(250, 250, 250))
StopDrawing()
M3D_PrepareMatrixTexture(#Matrice,#Matrice,1,1) 
;}
;{- Matières
CreateMaterial(#Matrice, TextureID(#Matrice))
MaterialAmbientColor(#Matrice,RGB(55,55,55))
CreateMaterial(#Coin1, TextureID(#Coin1)) 
MaterialAmbientColor(#Coin1,RGB(220,220,220))
;}
;{- Mesh
CreateMesh (#Pointe) 
SetMeshData(#Pointe, #PB_Mesh_Vertices     , ?FlechePoints       , 5)
SetMeshData(#Pointe, #PB_Mesh_Triangles    , ?FlecheTriangles    , 4)
SetMeshData(#Pointe, #PB_Mesh_UVCoordinates, ?FlecheTextures     , 5)
SetMeshData(#Pointe, #PB_Mesh_Normals      , ?FlecheNormales     , 5)
M3D_CreateMeshMatrix(#Matrice,5000,5000,50,50,1)
;}
;{-Entity
;/Matrice
CreateEntity(#Matrice, MeshID(#Matrice), MaterialID(#Matrice))
EntityLocate(#Matrice, M3D_MatrixWidth(#Matrice) / 2, 0, M3D_MatrixHeight(#Matrice) / 2)
M3D_NormalesMatrix(#Matrice)
;/Curseur
Curseur\AngleX          = #AngleInitial
Curseur\Sens            = 0
Curseur\HauteurFacette  = 0
Curseur\TailleX         = M3D_FacetteWidth(#Matrice)
Curseur\TailleZ         = M3D_FacetteHeight(#Matrice)
Curseur\NbFacetteX      = 1
Curseur\NbFacetteZ      = 1
Curseur\FacetteX        = M3D_NbFacetteX(#Matrice) / 2
Curseur\FacetteZ        = M3D_NbFacetteZ(#Matrice) / 2
Curseur\Epaisseur       = 1
Curseur\RayonRoue       = 4
tr=Curseur\RayonRoue * 4
CreateEntity(#Coin1,MeshID(#Pointe),MaterialID(#Coin1))
ScaleEntity(#Coin1,tr,tr,tr)
EntityLocate(#Coin1, M3D_MatrixWidth(#Matrice) / 2, 0, M3D_MatrixHeight(#Matrice) / 2)
CreateEntity(#Coin2,MeshID(#Pointe),MaterialID(#Coin1))
ScaleEntity(#Coin2,tr,tr,tr)
CreateEntity(#Coin3,MeshID(#Pointe),MaterialID(#Coin1))
ScaleEntity(#Coin3,tr,tr,tr)
CreateEntity(#Coin4,MeshID(#Pointe),MaterialID(#Coin1))
ScaleEntity(#Coin4,tr,tr,tr)
;}
;{-Camera
Camera\Hauteur=269 
Camera\Distance=345 
Camera\AngleX = #AngleInitial
Camera\AngleY = 0
Camera\Decalage = 160
Camera\VitesseRotation = 2
Camera\RenderMode[0]="WireFrame"
Camera\RenderMode[1]="Textured"
If CreateCamera(#Camera, 0, 0 , 100, 100) = 0
  Erreur("Camera")
  End
EndIf  
CameraLocate(#Camera, 0, 200, 0)
CameraRenderMode(0,#PB_Camera_Wireframe)
RotateCamera(#Camera, Camera\AngleX, 0, 0)
CameraBackColor(#Camera, RGB(0, 0, 255))
;}
;{- Light
AmbientColor(RGB(255, 255, 255)) 
CreateLight(0,RGB(185, 185, 185))
;}
;{- Boucle principale
Repeat 
  GestionCamera(#Coin1)
  LightLocate(0,EntityX(#Coin1) , Curseur\HauteurFacette + 350, EntityZ(#Coin1))
  RenderWorld()
  FlipBuffers() 
  Delay(1)  
  Window()
Until Quit
;}
;{- Datas
DataSection
FlechePoints:
Data.f 0,0,0
Data.f -0.5,1,0.5
Data.f 0.5,1,0.5
Data.f 0.5,1,-0.5
Data.f -0.5,1,-0.5
FlecheTriangles:
Data.w 1,0,4
Data.w 4,0,3
Data.w 3,0,2
Data.w 2,0,1
FlecheTextures:
Data.f 0,0
Data.f 1,1
Data.f 1,1
Data.f 1,1
Data.f 1,1
;A revoir 
FlecheNormales:
Data.f 0,-10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0
Data.f 0,10,0
EndDataSection
;}