Page 1 sur 2

[Résolu] Génération de fichiers mesh pour Purebasic

Publié : lun. 04/janv./2016 21:16
par Dudule
Bonjour,
J'essaie vainement de créer des fichiers mesh pour Purebasic à partir de Blender avec l'exporter blender2ogre-0.6.0
Ici, un simple rectangle tout plat, tout rose.
J'obtiens un fichier "plane.mesh.xml" et un fichier "Material.001.material"
J'utilise ensuite OgreXmlConverter comme indiqué un peu partout. Cela me donne un fichier "plane.mesh" (si je l'ouvre avec un éditeur de texte, la première ligne indique [MeshSerializer_v1.41]
Jusqu'ici, pas de surprise.
Par contre, si je veux charger mon "plane.mesh" dans Purebasic (en modifiant l'exemple fourni "camera.pb" par exemple), la fonction loadMesh() me retourne la valeur 0 comme si elle n'avait pas trouvé le fichier (que j'ai pourtant placé au même endroit que les mesh d'exemple, qui eux aussi contiennent "[MeshSerializer_v1.41]" et se chargent sans problème).
J'ai aussi essayé "OgreAssimpConverter.exe" à partir de mon "plane.blend", et même de mon "plane.mesh.xml". cela me donne à chaque fois des "plane.mesh" que PB ne peut pas charger, loadMesh retourne invariablement 0.
Quelqu'un saurait-il me dire ce qui cloche avec mon "plane.mesh", car moi je sèche...
Mon fichier est dans l'archive zip ici : http://lecartablededudule.pagesperso-or ... /plane.zip

Merci par avance.

Re: Génération de fichiers mesh pour Purebasic

Publié : mar. 05/janv./2016 13:45
par djes
Ce serait sympa que tu inclues ton code dans l'archive, que nous n'ayons qu'un minimum de manips à faire... Merci !

Re: Génération de fichiers mesh pour Purebasic

Publié : mar. 05/janv./2016 13:55
par comtois
Pour info tu peux obtenir des infos lors du chargement l'ogre, en ajoutant un paramètre à InitEngine3D() (voir la doc pour plus de choix)

Code : Tout sélectionner

If InitEngine3D(#PB_Engine3D_DebugLog)
Et j'obtiens ceci
13:49:34: WARNING: robot.mesh is an older format ([MeshSerializer_v1.41]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
13:49:34: Texture: r2skin.jpg: Loading 1 faces(PF_R8G8B8,512x512x1) Internal format is PF_X8R8G8B8,512x512x1.
13:49:34: Mesh: Loading plane.mesh.
13:49:34: WARNING: plane.mesh is an older format ([MeshSerializer_v1.41]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
Conclusion, ton mesh est bien chargé, il n'y a pas d'erreur.

Pour voir ton mesh, dans l'exemple camera.pb j'ai ajouté

Code : Tout sélectionner

    CreateEntity(1, LoadMesh(1, "plane.mesh"), MaterialID(0))
    ScaleEntity(1,30,30,30)
Et dans la boucle

Code : Tout sélectionner

      RotateEntity(1, 1, 1, 1, #PB_Relative) 

Re: Génération de fichiers mesh pour Purebasic

Publié : mar. 05/janv./2016 19:13
par Dudule
Merci pour les infos. Moi je n'ai pas les WARNING dans le log lors du chargement des mesh (ni pour robot, ni pour mon plane), et le fait que la fonction retourne 0 me fait dire qu'il ne le charge pas. Il faut peut-être que je mette à jour mon Purebasic qui est resté à la version 5.31. Ça doit venir de là.
Merci !

Re: Génération de fichiers mesh pour Purebasic

Publié : mar. 05/janv./2016 21:37
par Dudule
Eh bien non, même avec la version 5.41 x64, j'obtiens la même erreur.
Comme je le disais, le log ne me mets aucun WARNING, mais au moment du CreateEntity, j'ai [ERROR] The specified #Mesh is not initialised.
J'ai testé avec un nom bidon, l'erreur est la même, comme si c'était plus un problème d'accès au fichier que de Mesh.
Mon code :

Code : Tout sélectionner

#CameraSpeed = 1

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D(#PB_Engine3D_DebugLog)

  Add3DArchive("./Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("./Data/Models", #PB_3DArchive_FileSystem); Ici, je fais bien attention que mon plane.mesh y soit, il est à côté du robot.mesh
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    AmbientColor(RGB(255, 255, 255)) 
 
    Debug(LoadMesh(0, "plane.mesh")); Là, pas de WARNING, mais la fonction retourne 0
    ;Debug(LoadMesh(0, "robot.mesh")); Ici, elle retourne un nombre
    
    CreateTexture(0, 256, 256)
    StartDrawing(TextureOutput(0))
    Box(0, 0, 256, 256, RGB(255, 0, 0))
    StopDrawing()
    CreateMaterial(0,TextureID(0))
    CreateEntity(0, MeshID(0), MaterialID(0))
        
    CreateCamera(0, 0, 0, 100, 100)  ; Front camera
    MoveCamera(0, 0, 20, 250, #PB_Absolute)
    CameraBackColor(0, RGB(55, 0, 0))
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
             
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

      EndIf
      
      RotateEntity(0, 0, 0.1, 0, #PB_Relative)
      
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End
Comprends pas...

Re: Génération de fichiers mesh pour Purebasic

Publié : mar. 05/janv./2016 22:15
par comtois
C'est curieux, ton code fonctionne bien chez moi.

Affiche ton fichier log complet, ça peut aider.

Re: Génération de fichiers mesh pour Purebasic

Publié : mar. 05/janv./2016 22:16
par Bill Gates
Hi, you forget Parse3DScript() after Add3dArchive() function ?

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 10:35
par djes
Il a raison Bill. J'ai réussi à faire fonctionner ton exemple avec un peu de mal au début car je n'avais pas mis les fichiers au bon endroit. Assure-toi toujours d'envoyer une archive complète avec les dossiers et sous-dossiers. Et n'oublie pas que windows protège les dossiers des programmes, donc tu DOIS travailler dans un dossier utilisateur (par exemple dans "mes documents").
J'ai modifié 2/3 bricoles pour charger le "materiau" natif de l'objet.

Comtois> Truc qui me gonfle, la fenêtre passe à l'arrière-plan 9 fois sur 10. Et le truc de mettre 0 dans createentity() pour charger le material par défaut n'est pas indiqué dans la doc. D'ailleurs, ça devrait être un paramètre optionnel, non ?

Code : Tout sélectionner

#CameraSpeed = 1

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D(#PB_Engine3D_DebugLog)

  ;Add3DArchive(#PB_Compiler_FilePath, #PB_3DArchive_FileSystem)
  Add3DArchive("./Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("./Data/Models", #PB_3DArchive_FileSystem); Ici, je fais bien attention que mon plane.mesh y soit, il est à côté du robot.mesh
  Add3DArchive("./Data/Scripts", #PB_3DArchive_FileSystem)
  Parse3DScripts()  ;Le parse est indispensable pour charger les matériaux
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    AmbientColor(RGB(255, 255, 255)) 

    Error = LoadMesh(0, "plane.mesh")
    ;Error = LoadMesh(0, "robot.mesh")
    ;Debug Error   
    
;     CreateTexture(0, 256, 256)
;     StartDrawing(TextureOutput(0))
;     Box(0, 0, 256, 256, RGB(255, 0, 0))
;     StopDrawing()
;     CreateMaterial(0,TextureID(0))
    CreateEntity(0, MeshID(0), 0) ;Le 0 revient à reprendre le material par défaut (équivalent à GetScriptMaterial(0, "Material.001"))
        
    CreateCamera(0, 0, 0, 100, 100)  ; Front camera
    MoveCamera(0, 0, 0, 10, #PB_Absolute) ;je la recule un peu
    CameraBackColor(0, RGB(55, 0, 0))
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
             
        If KeyboardPushed(#PB_Key_Left)
          KeyX = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Right)
          KeyX = #CameraSpeed 
        Else
          KeyX = 0
        EndIf
                  
        If KeyboardPushed(#PB_Key_Up)
          KeyY = -#CameraSpeed 
        ElseIf KeyboardPushed(#PB_Key_Down)
          KeyY = #CameraSpeed 
        Else
          KeyY = 0
        EndIf

      EndIf
      
      RotateEntity(0, 1, 1, 1, #PB_Relative)
      
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
    
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf
  
End

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 12:47
par comtois
Comtois a écrit :
djes a écrit :Comtois> Truc qui me gonfle, la fenêtre passe à l'arrière-plan 9 fois sur 10. Et le truc de mettre 0 dans createentity() pour charger le material par défaut n'est pas indiqué dans la doc. D'ailleurs, ça devrait être un paramètre optionnel, non ?
Quelle fenêtre ?
Ah oui pardon, il s'agit de la fenêtre du programme quand on le lance en mode fenêtré plutôt qu'en plein écran.

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 14:27
par Dudule
Non, y'a rien à faire, pas moyen de charger mon fichu plane.mesh
Le log de PureBasic ne donne rien :
[14:22:34] Waiting for executable to start...
[14:22:34] Executable type: Windows - x64 (64bit, Unicode)
[14:22:34] Executable started.
[14:22:36] [ERROR] OPCycle.pb (Line: 38)
[14:22:36] [ERROR] The specified #Mesh is not initialised.
Par contre, j'ai un fichier log d'OGRE dans mon dossier qui me dit :
14:19:19: Mesh: Loading plane.mesh.
14:19:19: OGRE EXCEPTION(7:InternalErrorException): Missing M_EDGE_GROUP stream in MeshSerializerImpl_v1_3::readEdgeListLodInfo at OgreMeshSerializerImpl.cpp (line 2985)
Bon, autant vous dire que je ne sais pas de quoi il s'agit, mais je vois bien que c'est au chargement de mon mesh.

Bizarre que ça fonctionne chez vous, ou plutôt que ça ne fonctionne pas chez moi.
Je ne mets pas de Parse3DScripts() parce que j'ai la version démo de PB. Mais je ne pense pas que ça vienne de là...

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 14:49
par comtois
Dudule a écrit : Par contre, j'ai un fichier log d'OGRE dans mon dossier qui me dit :
14:19:19: Mesh: Loading plane.mesh.
14:19:19: OGRE EXCEPTION(7:InternalErrorException): Missing M_EDGE_GROUP stream in MeshSerializerImpl_v1_3::readEdgeListLodInfo at OgreMeshSerializerImpl.cpp (line 2985)
C'est curieux ce message, fais une recherche sur le fichier engine3D.dll ,est-ce que tu utilises le bon ?

Je ne mets pas de Parse3DScripts() parce que j'ai la version démo de PB. Mais je ne pense pas que ça vienne de là...
Parse3DScripts() fonctionne aussi avec la version démo, mais c'est vrai que ça ne vient pas de là.

si tu ne mets pas le parsescript() tu as ce message
14:42:26: Can't assign material Material.001 to SubEntity of E0 because this Material does not exist. Have you forgotten to define it in a .material script?
Mais ça n'empêche pas de charger le mesh.
14:42:26: Mesh: Loading plane.mesh.
14:42:26: WARNING: plane.mesh is an older format ([MeshSerializer_v1.41]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 15:24
par Dudule
Je ne connais pas la version du engine3D.dll
Il s'est installé avec purebasic dans C:\Program Files\PureBasic\Compilers
J'imagine que c'est la dernière version.
Je vais essayer avec un autre mesh pris ailleurs. Où est-ce qu'on trouver des mesh tout simples ?

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 16:17
par djes
Je viens de tester avec la version démo (x64), ça fonctionne pour moi... 8O

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 17:02
par Ar-S
Vous avez remarqué que #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
donne : C:\Program Files (x86)\PB5.4x\examples/3d/Screen3DRequester.pb

Les slash et antislash ça pique les yeux.

J'arrive pas non plus à charger son mesh sur mon portable.

Re: Génération de fichiers mesh pour Purebasic

Publié : mer. 06/janv./2016 23:47
par comtois
Pouvez-vous faire l'essai avec la version x86 ? Si vous avez aussi le problème, est-ce que vous pouvez essayer avec cette dll (en version x86) ?
http://herved25.free.fr/sources/Engine3D.zip

Avant de tester allez dans les options du compilateur, et choisir 'Console' pour le format de l'exécutable.
si le mesh se charge bien la console affichera :
test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9

Sinon dites moi à quel numéro l'affichage s'arrête.