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
;}