image2D -> mesh3D

Généralités sur la programmation 3D
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

image2D -> mesh3D

Message 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
Force et sagesse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

cool :D
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message 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
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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:
Force et sagesse...
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message 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
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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
Force et sagesse...
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
---------------------------
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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...
Force et sagesse...
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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...
Force et sagesse...
Répondre