Page 1 sur 3

image2D -> mesh3D

Publié : mar. 30/janv./2007 16:36
par tmyke
Voici un petit code que je livre ici, car en fait il a des effets plus surprenant
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é)

Image

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

Publié : mar. 30/janv./2007 19:14
par Backup
cool :D

Publié : mer. 31/janv./2007 19:42
par Patrick88
en essayant cet exemple et après avoir téléchargé les packages

j'ai cette erreur avec pb4

Image

(les exemples marche po non plus)

beuh ? j'ai merdé quelque part ?

pat

Publié : mer. 31/janv./2007 19:45
par Backup
réessaie avec la derniere version de l'installateur !! :D

chez moi l'exemple fonctionne !!
c'est donc une erreur dans l'installation de ta part :D

Tmyke viens de nous concocter un installateur tout neuf (et beau !) :D

Publié : mer. 31/janv./2007 19:52
par Patrick88
Dobro a écrit :réessaie avec la derniere version de l'installateur !! :D

chez moi l'exemple fonctionne !!
c'est donc une erreur dans l'installation de ta part :D

Tmyke viens de nous concocter un installateur tout neuf (et beau !) :D
c'est la dernière version de l'installateur... (sig)

je me suis posé la question suivante : où "coller" les fichiers de l'installateur ?

dans le dossier purebasic ?
je les aies mis ailleurs, apparement , c'est po le bon choix...
la version du pure ? c'est la 4.00

pat

Publié : mer. 31/janv./2007 20:02
par tmyke
Passe par l'installation en manuel a partir du pack que tu as dans le topic initial DM3D, (PackPB.zip) voici la procedure a suivre:

- copier les DLL dans le repertoire 'windows/system32/', ou a defaut
dans le repertoire de ton application.
- copier les fichier du repertoire LIB dans le repertoire 'PureBasic/PureLibraries/windows/Libraries/'

- et normalement, tu lances les exemples, cela doit marcher sans soucis...

Sinon, pour ce qui est de l'installateur, il est peut-etre buggué, a voir, mais
sinon, pour son utilisation, tu décompresses, peut importe ou, de toute façon après tu supprime les fichiers. En suite tu click juste sur install, et c'est tout.
Comme le demande l'installateur, tu selectionne le repertoire racine de PureBasic et c'est tout...

En espérant avoir pu t'aider. Si tu y arrive, dis le moi, car c'est que quelque
part ce que j'ai fait n'est pas très clair, donc il va faloir que je corrige le tir...
:wink:

Publié : mer. 31/janv./2007 20:15
par Patrick88
apparement le dreammotion.lib n'a pas été remplacé par l'installeur
il y avait une version qui faisait 130kilo et des broquettes

je ressaye

invalid memory access à la ligne 242
DM_VertexCoords(*surface, pp, x*2-larg, hh, z*2-haut)

l'image de test =
http://patrick.claude.free.fr/PureBasicLogo.bmp

j'ai essayé l'exemple 13-pivot qui fonctionne sans problème...

pat

Publié : mer. 31/janv./2007 20:33
par tmyke
J'avoue ne pas trop comprendre. On dirait que la lib et la DLL que tu as installé ne semblent pas les bonnes.
Ici, tu charge juste le module, avec la DLL et la Lib:
http://www.dreamotion3d.com/_downloads/ ... dulePB.zip

Tu les mets dans les bon répertoires, et cela doit fonctionner, j'ai Dowloadé et testé sur mes trois machines
et cela roule normalement

Publié : mer. 31/janv./2007 20:55
par Patrick88
toujours la même erreur...

je virerai les dll et les lib, il y a peut-être un conflit qq part

j'ai aussi une version 3.94 d'installée, c'est peut-être ça qui fout la m.rde

pat

Publié : mer. 31/janv./2007 20:58
par comtois
j'ai cette erreur avec le PurePatator dans le répertoire PhysX\samples
J'ai utilisé ton installateur, les exemples du package fonctionnent.
Alors j'ai recopié les fichiers include pour mettre à jour le répertoire PhysX\samples\include , mais j'ai ce message :

---------------------------
PureBasic0.exe - Point d'entrée introuvable
---------------------------
Le point d'entrée de procédure _DM_FreeEntity@4 est introuvable dans la bibliothèque de liaisons dynamique Dreamotion3D.dll.
---------------------------
OK
---------------------------

Publié : mer. 31/janv./2007 21:02
par tmyke
@Comtois: Oui, la c'est normal, car j'ai mis a jour DM3D, mais la mise a jour de
PhysX je ne la ferais que demain...

@Patrick88: DM3D ne doit pas bien marcher avec PB V3.xx

Publié : mer. 31/janv./2007 21:06
par comtois
Patrick88 a écrit :toujours la même erreur...

je virerai les dll et les lib, il y a peut-être un conflit qq part

j'ai aussi une version 3.94 d'installée, c'est peut-être ça qui fout la m.rde

pat
J'ai aussi plusieurs versions d'installées , y compris la 3.94, c'est totalement indépendant, chaque version est dans son répertoire. si tu as les dll dans le répertoire system32, et les lib dans le bon répertoire de la bonne version PureBasic (perso j'utilise la 4.02), ça devrait fonctionner.

Publié : mer. 31/janv./2007 21:09
par tmyke
Je pense aussi.

Sinon, je viens de mettre en ligne le dernier module de PhysX.
La Pack complet de PhysX je le passerais demains, mais le module devrait
te permettre de faire fonctionner de nouveau PurePatator...

Publié : mer. 31/janv./2007 21:14
par comtois
j'ai un access invalid memory sur cette ligne

Code : Tout sélectionner

NX_CreateCharacter(*camera, 100, 150, 100, 20.0, 80, 0.1)
Bon je vais attendre le packcomplet demain

Publié : jeu. 01/févr./2007 11:34
par tmyke
J'ai mis a jour le pack DM3D et le packPhysX. Testé sur mes machines
de test, cela tourne sans soucis. A tester donc pour confirmer...