que je l'aurais pensé.
Il s'agit en fait au départ d'un utilitaire, pour la conception d'un jeux en 3D que
je commence, pour construire des petites map, a partir de fichiers image en niveau de gris
(pour le relief) sans passer par le moteur de terrain. Enfin a vous d'essayer pour voir ce
que cela peut donner.
la marche a suivre est simple, on fait 'LoadImage' pour importer une image (256x256 pixel max)
puis on fait 'process'. Si l'option de génération des normales est activé (ce qui est le cas par defaut)
cela peux prendre jusqu'à 30 seconde pour une image de 256x256 pixels (normal smooth
toujours aussi lent sous DX9)
Si on veut sauvegarder le mesh au format '.x' -> SaveMesh.
On peut controler la vue 3D, avec la souris (click gauche) et les touches du curseur.
A oui, dernière version de DM3D pour pouvoir tourner... (cela m'a permit de lever quelques bug,
que j'ai corrigé)

a oui, le code, j'suis toujours aussi étourdis moi...
(c'est pas super commenté ni super optimisé, mais bon, pour une heure de
travail consacré - tests compris et debuggage de DM3D - c'est présentable)
Code : Tout sélectionner
; ------------------------------------------------------------
; DreaMotion3D
;
; Utility : little map générator
; Historique :
; --/--/-- 00:00 DreaMotion3D Team
; 30/01/07 16:00 TMyke
;
; ------------------------------------------------------------
; Fichiers Include
IncludePath "Include\" : IncludeFile "dreamotion3d.pbi"
Declare.l Process(larg.l, haut.l)
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
Enumeration
#Button_0
#Button_1
#Container_0
#Container_1
#Button_2
#Button_3
#Text_0
#Text_1
#CheckBox_0
#Text_2
#Text_3
#Text_4
#String_0
#Text_5
EndEnumeration
Structure vertex
x.f
y.f
z.f
nx.f
ny.f
nz.f
tu.f
tv.f
EndStructure
; controle
Global Event.l
Global anglex.f, angley.f, flagXDown.w
Global mox.f, omx.f, moy.l, omy.l
; objet DM3D
Global *mesh.CEntity
Global *camera.CEntity
Global *brush.CBrush
; générales
Global Hauteur.l
Global Largeur.l
Global flag_Load_Image.b
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
End
EndIf
; les format supporte en import
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
;creation et ouverture la fenetre
If OpenWindow(#Window_0, 216, -1, 436, 646, "Dreamotion Utility Screen", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#Window_0))
ButtonGadget(#Button_0, 270, 10, 80, 30, "Load Image")
ButtonGadget(#Button_1, 270, 240, 90, 30, "Save Mesh")
ButtonGadget(#Button_2, 370, 240, 60, 30, "Quit")
ButtonGadget(#Button_3, 270, 90, 80, 30, "Process")
TextGadget(#Text_0, 280, 50, 130, 20, "Largeur")
TextGadget(#Text_1, 280, 70, 130, 20, "Hauteur")
CheckBoxGadget(#CheckBox_0, 370, 130, 20, 20, "")
TextGadget(#Text_2, 270, 130, 90, 20, "generate normales")
TextGadget(#Text_3, 270, 190, 130, 20, "Faces:")
TextGadget(#Text_4, 270, 210, 130, 20, "Vertices:")
StringGadget(#String_0, 390, 160, 40, 20, "10")
TextGadget(#Text_5, 270, 160, 110, 20, "Echelle des hauteurs")
;-
ContainerGadget(#Container_0, 10, 10, 256, 256)
CloseGadgetList()
;-
ContainerGadget(#Container_1, 10, 280, 390, 350)
CloseGadgetList()
EndIf
DM_Graphics3DGadget(436, 646, GadgetID(#Container_1), 1)
ID = GadgetID(#Container_1)
OpenWindowedScreen(ID, 0, 0, 10,10,0,0,0)
EndIf
; normal smooth par defaut
SetGadgetState(#CheckBox_0, #True)
; ---------------------------------------
; 3D init
; ---------------------------------------
*mesh=#Null
*brush=#Null
flag_Load_Image=#False
DM_CreateLight(3)
DM_AmbiantLight(0,0,0)
*camera = DM_CreateCamera()
DM_CameraClsColor(*camera, 125, 125, 125)
DM_MoveEntity(*camera, 0,50,-200.0)
DM_TurnEntity(*camera,20,0,0)
; ---------------------------------------
; main loop
; ---------------------------------------
Repeat
;
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Gadget
If EventGadget() = #Button_2
End
EndIf
If EventGadget() = #Button_0
filter.s="Files (*.*)|*.*;All Files (*.*)|*.*"
name.s=OpenFileRequester("Select image file to open","",filter, #False )
SetCurrentDirectory(GetPathPart(name))
LoadImage(0, name)
Hauteur = ImageHeight(0)
Largeur = ImageWidth(0)
If(Hauteur<257) Or (Largeur<257)
*brush = DM_CreateBrush("brush")
*texture = DM_LoadTexture(name)
DM_BrushTexture(*brush, *texture)
flag_Load_Image=#True
SetGadgetText(#Text_0, "Largeur = "+Str(Largeur))
SetGadgetText(#Text_1, "Hauteur = "+Str(Hauteur))
EndIf
flagXDown=0
EndIf
If EventGadget() = #Button_3
*mesh = Process(Hauteur,Largeur)
flagXDown=0
EndIf
If EventGadget() = #Button_1
filter.s="Files 3D (*.x)|*.x;All Files (*.x)|*.x"
name.s=OpenFileRequester("Select 3D file to save","",filter, #False )
DM_SaveSurface(DM_GetSurface(*mesh), name)
flagXDown=0
EndIf
Case #PB_Event_CloseWindow
End
Case #WM_LBUTTONDOWN
If flagXDown=0
omx = WindowMouseX(#Window_0)
omy = WindowMouseY(#Window_0)
flagXDown=11
EndIf
Case #WM_LBUTTONUP
flagXDown = 0
EndSelect
Until Event = 0
; dessin de l'image
If(flag_Load_Image)
StartDrawing(WindowOutput(#Window_0))
DrawImage(ImageID(0), 10, 10)
StopDrawing()
EndIf
; manipulation par le clavier dans le fenetre 3D
ExamineKeyboard()
; Gestion de la caméra
If KeyboardPushed(#PB_Key_Up)
DM_MoveEntity(*camera, 0,0,4)
ElseIf KeyboardPushed(#PB_Key_Down)
DM_MoveEntity(*camera, 0,0,-4)
EndIf
If flagXDown=11
moy = WindowMouseY(#Window_0)-omy
angley=(moy/5.0)
omy= WindowMouseY(#Window_0)
mox = WindowMouseX(#Window_0)-omx
anglex=(mox/5.0)
omx= WindowMouseX(#Window_0)
DM_TurnEntity(*camera, angley,anglex,0)
EndIf
If(*mesh <> #Null) : DM_TurnEntity(*mesh, 0,0.2,0) : EndIf
; mise a jour de l'ecran 3D
DM_BeginScene()
DM_RenderWorld()
DM_EndScene()
ForEver
DM_ClearGraphics()
End
Procedure.l Process(larg.l, haut.l)
Protected h.l
Protected *entity.CEntity
Protected *surface.CSurface
If(*mesh) : DM_FreeEntity(*mesh) : EndIf
numV.l = (larg)*(haut)
numF.l = (larg-1)*(haut-1)*2
*entity = DM_CreateMesh()
*surface = DM_CreateSurface(*entity, *brush, #D3DFVF_XYZ | #D3DFVF_NORMAL | #D3DFVF_TEX1, numV, numF)
scale.f = Val(GetGadgetText(#String_0))
StartDrawing(WindowOutput(#Window_0))
; les vertices
pp.l=0
For z=0 To larg-1
For x=0 To haut-1
;les coordonnées de vertex
h = Point(x+10,z+10) & $ff
hh.f = h
hh = hh/scale
DM_VertexCoords(*surface, pp, x*2-larg, hh, z*2-haut)
DM_VertexTexCoords(*surface, pp, x/haut, z/larg)
Plot(x+10,z+10,RGB(0,0,255)) ; symbolise l'avancé
pp=pp+1
Next x
Next z
; les faces
i.l = 0
Nb=haut
For b=0 To larg-2
For a=0 To haut-2
P1=a+(b*Nb)
P2=P1+1
P3=a+(b+1)*Nb
P4=P3+1
DM_VertexTriangle(*surface, i, P3,P2,P1)
i + 1
DM_VertexTriangle(*surface, i, P2,P3,P4)
i + 1
Next
Next
StopDrawing()
SetGadgetText(#Text_3, "Faces = "+Str(i))
SetGadgetText(#Text_4, "Vertices= "+Str(pp-1))
If(GetGadgetState(#CheckBox_0))
DM_NormalizeSurface(*surface)
EndIf
DM_PositionEntity(*camera, 0,100, -300)
DM_PointEntity(*camera,*entity)
ProcedureReturn *entity
EndProcedure