GetScriptMaterial() et mise à jour du material

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: GetScriptMaterial() et mise à jour du material

Message par kelebrindae »

blendman a écrit :Et sur ton screenshot, l'espèce de shaders en displace, tu ne l'as pas ?
C'est le dernier des liens ci-dessus (le post contient aussi des infos sur la façon d'utiliser le CgToolkit de nVidia); tu peux le télécharger ici: http://keleb.free.fr/pb/cgShader-normalMap.zip (mais ce n'est que du normal mapping, pas du displacement).
Mon shader "Refraction" ne marche plus depuis les dernières mises à jour de PB... :cry:
blendman a écrit :J'ai essayé d'importer ceux de G-rom, mais aucun ne marche.
Je ne sais pas comment il faut s'il faut changer des choses
Pour importer un material, inutile de copier ou déplacer quoi que ce soit: ce sont les boutons "importer" qui copient les fichiers que tu choisis vers des dossiers temporaires qu'utilise l'éditeur; ces fichiers sont ensuite "packés" dans le fichier qui est créé quand tu sauvegardes, et "unpackés" quand tu ré-ouvres ton projet.
Par contre, importer un fichier ".material" n'importe pas automatiquement les shaders et les textures qu'il utilise: il faut les importer manuellement un par un.

Exemple avec le material "SphereMap" dans purebasic/examples/3d/data/scripts:
- Sur l'onglet "material", clique sur le bouton "importer" et choisis "spheremap.material" => le contenu du fichier apparaît dans l'éditeur;
- Sur l'onglet "Shader", tu peux tout supprimer (ce material n'utilise pas de shader. S'il y en avait, ils seraient référencés derrière le mot-clef "source" dans le material);
- Sur l'onglet "Textures - meshes", supprime les textures et importe les deux référencées dans les "textures units" du material: "rustySteel.jpg" et "spheremap.png" (elles sont dans purebasic/examples/3d/data/textures);
- Appuie sur Ctrl-R pour forcer le rafraîchissement => ça devrait marcher.

Limitations:
- Mon éditeur ne gère qu'un seul material par fichier ".material", et un seul fichier ".material" par projet; donc un projet = un material (par contre, pas de limite sur le nombre de fichiers de shaders ou de textures).
- J'ai corrigé un bug: l'éditeur ne retrouvait pas le nom du material si celui-ci figurait dans la première ligne de fichier ".material" (comme dans le SphereMap de G-rom). Si tu constates ce bug, recharge le .exe de l'éditeur : http://keleb.free.fr/codecorner/downloa ... Editor.exe
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: GetScriptMaterial() et mise à jour du material

Message par blendman »

kelebrindae a écrit :C'est le dernier des liens ci-dessus (le post contient aussi des infos sur la façon d'utiliser le CgToolkit de nVidia); tu peux le télécharger ici: http://keleb.free.fr/pb/cgShader-normalMap.zip (mais ce n'est que du normal mapping, pas du displacement).
merci, je vais regarder ça :)
Mon shader "Refraction" ne marche plus depuis les dernières mises à jour de PB... :cry:
mince et ça ne se corrige pas ?
blendman a écrit :Pour importer un material, inutile de copier ou déplacer quoi que ce soit: ce sont les boutons "importer" qui copient les fichiers que tu choisis vers des dossiers temporaires qu'utilise l'éditeur; ces fichiers sont ensuite "packés" dans le fichier qui est créé quand tu sauvegardes, et "unpackés" quand tu ré-ouvres ton projet.
Par contre, importer un fichier ".material" n'importe pas automatiquement les shaders et les textures qu'il utilise: il faut les importer manuellement un par un.
ok, ça a marché merci :).

Par contre, je n'arrive pas à utiliser ton exemple de shader bump (defaut.x) en dehors de ton éditeur.
Les autres material (ceux de G-rom), fonctionnent sans problème, mais le tiens non, c'est bizarre.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: GetScriptMaterial() et mise à jour du material

Message par kelebrindae »

Bin, en fait, c'est ça que je voulais rajouter avant de poster le source: une fonction "export", qui écrit le material et tous les fichiers d'un projet à l'endroit indiqué par l'utilisateur, avec un mini bout de code PB qui ferait office d'exemple pour les recharger...

Regarde dans ton ogre.log, il y a peut-être l'explication. Si le material fonctionne dans l'éditeur mais pas dans PB, c'est peut-être que tu as oublié de récupérer un des fichiers ou de référencer son emplacement avec les "add3Darchive" (de mémoire, il y a 4 fichiers: default.material, default.fx, tile.jpg et tile_n.bmp).
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: GetScriptMaterial() et mise à jour du material

Message par blendman »

kelebrindae a écrit :Bin, en fait, c'est ça que je voulais rajouter avant de poster le source: une fonction "export", qui écrit le material et tous les fichiers d'un projet à l'endroit indiqué par l'utilisateur, avec un mini bout de code PB qui ferait office d'exemple pour les recharger...
oui, ce serait très pratique pour tout bien tester ;)
Regarde dans ton ogre.log, il y a peut-être l'explication. Si le material fonctionne dans l'éditeur mais pas dans PB, c'est peut-être que tu as oublié de récupérer un des fichiers ou de référencer son emplacement avec les "add3Darchive" (de mémoire, il y a 4 fichiers: default.material, default.fx, tile.jpg et tile_n.bmp).
je dois les mettre tous ensemble, ou dans un dossier spécifique ?

J'ai bien copié tout ce qui est nécessaire.
Voici le message d'Ogre (la fin) :

Code : Tout sélectionner

15:59:40: WARNING: material default2 has no supportable Techniques and will be blank. Explanation: 
Pass 0: Vertex program vs cannot be used - compile error.
c'est étrange si ça marche dans ton éditeur, mais pas là...
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: GetScriptMaterial() et mise à jour du material

Message par kelebrindae »

En fait, tu peux mettre les fichiers ensemble ou séparément, pour peu que tu aies les "add3Darchive" qui vont bien. Je m'explique.
Perso, j'aime bien répartir les fichiers dans 4 dossiers: materials, shaders, meshes, textures. Pour que Ogre trouve les fichiers répartis dans ces 4 dossiers, je dois indiquer dans mon code:

Code : Tout sélectionner

Add3DArchive("shaders\", #PB_3DArchive_FileSystem )
Add3DArchive("textures\", #PB_3DArchive_FileSystem )
Add3DArchive("meshes\", #PB_3DArchive_FileSystem )
Add3DArchive("materials\", #PB_3DArchive_FileSystem )
avant le "Parse3DScripts()".

Le petit code tout moche ci-dessous illustre ce cas; la variable nomMesh contient le nom du mesh à charger, et la variable nomMat contient le nom du material, tel qu'indiqué dans le fichier ".material" (et pas le nom du fichier, attention).

Code : Tout sélectionner

;- Initialisation
If InitEngine3D() = 0
  MessageRequester( "Error" , "Can't initialize 3D, check if engine3D.dll is available" , 0 )
  End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester( "Error" , "Can't find DirectX 7.0 or above" , 0 )
  End
EndIf

OpenWindow(0,0, 0, 400 , 400 ,"test",#PB_Window_Normal)
OpenWindowedScreen(WindowID(0),0,0, 400, 400,0,0,0,#PB_Screen_SmartSynchronization)


;- Ressources
Add3DArchive("shaders\", #PB_3DArchive_FileSystem )
Add3DArchive("textures\", #PB_3DArchive_FileSystem )
Add3DArchive("meshes\", #PB_3DArchive_FileSystem )
Add3DArchive("materials\", #PB_3DArchive_FileSystem )

;- Camera
CreateCamera(0, 0,0,100,100)
CameraLocate(0, 0, 0, 3)
CameraLookAt(0, 0 , 0, 0)


;- Mesh
nomMesh.s = "teapot.mesh"
nomMat.s = "default2"

Parse3DScripts()
numMaterial = GetScriptMaterial(#PB_Any,nomMat)

numMesh = LoadMesh(#PB_Any , nomMesh)
If IsMesh(numMesh) = #False
  numMesh = CreateSphere(#PB_Any,1)
  NormalizeMesh(numMesh)
  BuildMeshShadowVolume(numMesh)
EndIf  
  
If IsMaterial(numMaterial) <> 0
  CreateEntity(1,MeshID(numMesh),MaterialID(numMaterial),0,0,0)
Else
  CreateEntity(1,MeshID(numMesh),#PB_Material_None,0,0,0) 
EndIf

AmbientColor($555555)
CreateLight(1,$FFFFFF,15,20,30)


timer = ElapsedMilliseconds()
speed.f = 1
angleX.f = 0 : angleY.f = 0
Repeat

  While WindowEvent():Delay(1):Wend
  
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_PageUp)
     MoveCamera(0,0,0,-speed/10)
  EndIf
  If KeyboardPushed(#PB_Key_PageDown)
     MoveCamera(0,0,0,speed/10)
  EndIf
  If KeyboardPushed(#PB_Key_Up)
    anglex-speed
    RotateEntity(1,anglex,angley,0)
  EndIf
  If KeyboardPushed(#PB_Key_Down)
    anglex+speed
     RotateEntity(1,anglex,angley,0)
  EndIf
  If KeyboardPushed(#PB_Key_Left)
    angley-speed
     RotateEntity(1,anglex,angley,0)
  EndIf
  If KeyboardPushed(#PB_Key_Right)
    angley+speed
    RotateEntity(1,anglex,angley,0)
  EndIf
    
  RenderWorld()
  FlipBuffers()
 
Until KeyboardPushed(#PB_Key_Escape)
     
End
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: GetScriptMaterial() et mise à jour du material

Message par blendman »

oui, c'est bien ce que je fais.

J'ai vérifié plusieurs, et j'ai finalement réussi, j'imagine que je dois avoir un material qui s'appelle déjà default, car lorsque j'ai mis tous les élements dans un dossier séparé, ça a marché ;).

Merci :D

EDIT : rah, j'arrive avec ton exemple, mais toujours pas avec mon éditeur, je ne comprends d'où vient le problème :(
Répondre