Page 1 sur 1

[RESOLU] LoadMaterial()

Publié : lun. 15/oct./2012 16:24
par falsam
J'ai cherché comment chargé un fichier *.material et j'ai cru que cette fonction existée.
La réponse est non elle n'existe pas. Alors comment faire.

Voila ma démarche.
1-j'ai commencé par créer ma matiére avec une texture quelconque

Code : Tout sélectionner

CreateMaterial(#Test_Mat, LoadTexture(0, "Wall10.jpg"))
2-J'ai ensuite obtenu une nouvelle matiére en chargeant ma matiére avec la fonction ReloadMaterial() associé à la fonction GetScriptMaterial()

Code : Tout sélectionner

ReloadMaterial("Test", "Test.material", #True)
GetScriptMaterial(#Test_Mat, "Test")
3-Enfin j'ai pu afficher l'entité

Code : Tout sélectionner

SetEntityMaterial(#Test_Entity, MaterialID(#Test_Mat))
EntityLocate(#Test_Entity, 0, 0, 0)
Si une autre méthode existe je suis preneur :)

Re: LoadMaterial()

Publié : lun. 15/oct./2012 18:12
par G-Rom
Add3dArchive() & ParseScript()
@+

Re: LoadMaterial()

Publié : lun. 15/oct./2012 18:20
par falsam
G-Rom a écrit :Add3dArchive() & ParseScript()
@+
Bonjour G-Rom, Add3dArchive() & ParseScript() figure dans mon code mais l'initialisation de la matiére ne se fait pas.

un extrait du code

Code : Tout sélectionner

....
LoadMesh(#Test_Mesh, "test.mesh")

ReloadMaterial("Test", "Test.material", #True)
GetScriptMaterial(#Test_Mat, "Test")

CreateEntity(#Test_Entity, MeshID(#Test_Mesh), #PB_Material_None)
SetEntityMaterial(#Test_Entity, MaterialID(#Test_Mat))
......
par contre avec la manière de faire que je cite precedement, le code fonctionne.

Re: LoadMaterial()

Publié : lun. 15/oct./2012 19:02
par falsam
En fait il ne faut pas exécuter SetEntityMaterial(#Test_Entity, MaterialID(#Test_Mat)). J'avoue que du coup je ne comprends pas comment ça fonctionne, mais ça fonctionne.

Un code trés simplifié pour illustrer ce que je tente d'expliquer. Je joint un fichier (zip) qui contient le code, le mesh et les textures.

:arrow: Télécharger le fichier source contenant les ressources

Juste à titre de curiosité, commenter Parse3DScripts().

Code : Tout sélectionner

Enumeration
  #Camera
  #Light
  
  #Test_Entity
  #Test_Mesh
  #Test_Mat
   
EndEnumeration

Global RotX.i, RotY.i, RotZ

If InitEngine3D()
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  Add3DArchive("Data", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  OpenWindow(0,0,0,900,700,"3d",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  OpenWindowedScreen(WindowID(0),0,0,900,700,0,0,0)
  
  ;Camera
  CreateCamera(#Camera, 0, 0, 900, 700)
  CameraLocate(#Camera, -150, 150, 550) 
  
  ;Fog & Light
  Fog(#Blue, 1, 200, 7000)
  CreateLight(#Light, RGB(255,255,255), -150, 150, 550)
  
  ;Mesh & material
  LoadMesh(#Test_Mesh, "test.mesh")
  CreateEntity(#Test_Entity, MeshID(#Test_Mesh), #PB_Material_None)
  
  ReloadMaterial("Test", "Test.material", #True)
  GetScriptMaterial(#Test_Mat, "Test")   
  EntityLocate(#Test_Entity, 0, 0, 0)
  
  Repeat
   Delay(10)
      
   If ExamineMouse()
       RotY = -MouseDeltaX()/10 
    RotX = -MouseDeltaY()/10  
 
   EndIf
   
   RotateCamera(#Camera, RotX, RotY, RotZ, #PB_Relative)
   
   If ExamineKeyboard()  	  
     If KeyboardPushed(#PB_Key_Escape)
       End
     EndIf  
   EndIf
   
  RenderWorld()
  FlipBuffers()
   
 ForEver
Else
  MessageRequester("Information", "Impossible d'initialiser le moteur 3D")
EndIf
J'ai pris un exemple (SacredPlace.dxs) issus du logiciel gratuit Deled 3D auquel j'ai ajouté le plugin Ogre Exporter Plugin 2.0
Post : http://www.purebasic.fr/french/viewtopi ... =9&t=11481

Re: LoadMaterial()

Publié : lun. 15/oct./2012 19:15
par G-Rom
J'ai cherché comment chargé un fichier *.material et j'ai cru que cette fonction existée.
La réponse est non elle n'existe pas. Alors comment faire.
J'ai répondu à ta question.

tous les .material sont chargé ( les chemins seulement ) via Add3dArchive()
puis parse3dScript() te charges tout les script d'ogre.

Dans ton code :

Code : Tout sélectionner

GetScriptMaterial(#Test_Mat, "Test")  
Le material "Test" n'existe pas.
il n'est pas défini dans le .material que tu fournis
seul Wall02 , Wall06 , Wall12 & Wood01 sont valides.

Code : Tout sélectionner

ReloadMaterial("Test", "Test.material", #True)
ne sert à rien dans ce cas.

ton code "corrigé" :

Code : Tout sélectionner

Enumeration
  #Camera
  #Light
  
  #Test_Entity
  #Test_Mesh
  #Test_Mat
   
EndEnumeration

Global RotX.f, RotY.f, RotZ.f

If InitEngine3D()
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  Add3DArchive("./data", #PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  OpenWindow(0,0,0,900,700,"3d",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  OpenWindowedScreen(WindowID(0),0,0,900,700,0,0,0)
  
  ;Camera
  CreateCamera(#Camera, 0, 0, 900, 700)
  CameraLocate(#Camera, -150, 150, 550) 
  
  ;Fog & Light
  Fog(#Blue, 1, 200, 7000)
  CreateLight(#Light, RGB(255,255,255), -150, 150, 550)
  
  ;Mesh & material
  LoadMesh(#Test_Mesh, "test.mesh")
  CreateEntity(#Test_Entity, MeshID(#Test_Mesh), #PB_Material_None)
  

  EntityLocate(#Test_Entity, 0, 0, 0)
  
  Repeat
   Delay(10)
      
   If ExamineMouse()
       RotY = -MouseDeltaX()/10 
    RotX = -MouseDeltaY()/10  
 
   EndIf
   
   RotateCamera(#Camera, RotX, RotY, RotZ, #PB_Relative)
   
   If ExamineKeyboard()  	  
     If KeyboardPushed(#PB_Key_Escape)
       End
     EndIf  
   EndIf
   
  RenderWorld()
  FlipBuffers()
   
 ForEver
Else
  MessageRequester("Information", "Impossible d'initialiser le moteur 3D")
EndIf

 
ps: utilise des float pour les angles. ;)

@++

Re: LoadMaterial()

Publié : lun. 15/oct./2012 21:53
par falsam
Whaouuu c'est encore plus simple comme ça. Merci G-Rom. Je laisse le download en modifiant le code.

ps : C'est noté pour les floats :)