Page 1 sur 2

Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 15:06
par falsam
Bonjour

Dans une application d'édition de scéne(s), je charge des meshs manuellement et je les dispose ou je veux sur le grid d’édition.

Ces meshes ne sont pas référencés au lancement de l'application.

Le souci est que si le mesh est bien pris en compte lors du LoadMesh(), les dépendances associés par contre ne sont pas pris en compte.

En pratique : Add3DArchive() fonctionne correctement mais pas Parse3DScripts().

Code : Tout sélectionner

EnableExplicit

Global Camera, Mesh, Entity, NewMap Archive3D()

Declare SelectMesh()

InitEngine3D(#PB_Engine3D_DebugLog) 
InitSprite() 
InitKeyboard()

OpenWindow(0, 0, 0, 1024, 768, "Basic Scene", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, 0, 0, 0)

; Archive par defaut dans mon application
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Water/", #PB_3DArchive_FileSystem)

;Decommentez les ligne suivantes pour voir apparaitre les materials des meshes
;Add3DArchive(GetCurrentDirectory() + "assets\models\sinbad\", #PB_3DArchive_FileSystem)
;Add3DArchive(GetCurrentDirectory() + "assets\models\LibertyStatue\", #PB_3DArchive_FileSystem)
;Add3DArchive(GetCurrentDirectory() + "assets\models\Skull\", #PB_3DArchive_FileSystem)

Parse3DScripts()

Camera = CreateCamera(#PB_Any, 0, 0, 100, 100) 
CameraBackColor(Camera, RGB(128, 128, 128))
MoveCamera(Camera, 0, 50, 50)
CameraLookAt(Camera, 0, 0, 0)

CreateLight(#PB_Any, RGB(255, 255, 255), 1000, 1000, -500)
WorldShadows(#PB_Shadow_Modulative, 1024, RGB(150, 150, 150))

Repeat
  ExamineKeyboard()
  
  If KeyboardReleased(#PB_Key_F3)
    SelectMesh()
  EndIf
  
  RenderWorld()  
  FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)

Procedure SelectMesh()
  Protected fileName.s
  Protected filePath.s 
  
  fileName.s = OpenFileRequester("Select mesh ...", "assets\models\*.mesh", "Ogre3D (mesh)|*.mesh", 0)
  filePath = GetPathPart(filename)
  
  If FileName <> ""
    If Not FindMapElement(Archive3D(), filePath)
      AddMapElement(Archive3D(), filePath)
      Add3DArchive(filePath, #PB_3DArchive_FileSystem) ; Fonctionne       
      Parse3DScripts() ; fonctionne pas      
    EndIf
    
    If IsEntity(Entity)
      FreeEntity(Entity)
    EndIf
    
    Mesh = LoadMesh(#PB_Any, GetFilePart(FileName))
    Entity = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, -10, 0)
    RotateEntity(Entity, 270, 35, 0)
  EndIf
EndProcedure
Touche F3 pour charger un mesh

Download : Sources + Assets - 10 mo
http://falsam.com/Download/purebasic/testparse.zip

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 16:15
par Ollivier
Juste une remarque qui n'a rien à voir avec ton problème : je vois des -1 pour les identifiants : tu devrais rester avec des #Pb_Any. Si Fred a besoin de modifier un jour #Pb_Any comme ça a déjà eu lieu pour d'autres constantes, tu seras embêté. Et faire des remplacements de sélection "-1", pour mettre à jour, c'est la catastrophe si le remplacement "collisionne" avec des extraits de calculs (<< qqch -1 >>).

Si tu restes avec les constantes même interprétées (#Any = #Pb_Any ou Any.I = #Pb_Any), les mises à jour avec modification de constantes passent ni vu ni connu sans la moindre contrainte à venir.

Pour le Parse3DScript(), est-ce que CreateEntity(#Pb_Any, MeshID, #Pb_Material_None) fonctionne seul, sans le décalage XYZ (Ici 0, -10, 0) ?

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 16:21
par falsam
Ollivier a écrit :je vois des -1 pour les identifiants : tu devrais rester avec des #Pb_Any.
Tu as raison c'est corrigé.
Ollivier a écrit :est-ce que CreateEntity(#Pb_Any, MeshID, #Pb_Material_None) fonctionne seul, sans le décalage XYZ (Ici 0, -10, 0)
Oui. Ce point de coordonnée 0, -10, 0 n'est là que pour être certain de voir chacun des meshes.

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 17:06
par G-Rom
C'est un bug, d'ailleurs , comtois & guillot devrais revoir le gestionnaire de ressource , la 2 fonctions qui se battent en duel...
il manque le chargement asynchrone , savoir ou en est le chargement de tel ou tel ressource ( pratique pour un loading screen ), pouvoir déchargé une ressource , etc...
tu ne peu donc absolument rien faire à part bidouiller le bouzin, ajoute un InitEngine3D() après ton Add3DArchive() et avant le parse() foireux , ca devrait marché , j'ai plus les sources pour te dire si c'est ok ou pas, mais de mémoire, ca devrais le faire.

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 17:16
par falsam
J'ai essayé de cette manière

Code : Tout sélectionner

Add3DArchive(filePath, #PB_3DArchive_FileSystem)       
InitEngine3D()
Parse3DScripts()    
Malheureusement sans aucun changement ......

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 17:22
par Ollivier
Je vais dire une connerie : le log de IntEngine3D() ne donne rien?

Sinon, sans insérer InitEngine3D(), si on laisse le décalage à zéro (puisque ça semble fonctionner comme ça) et qu'on modifie le décalage après coup avec MoveEntity(), ça fonctionne ?

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 17:30
par falsam
@Ollivier : Le décalage du mesh n'a aucune incidence comme je te l'ai dit précédment. C'est juste un confort visuel.

Quand au log il me dit qu'il n'a pas pu charger le material ce qui est normal puisque Parse3DScripts() ne fonctionne pas dans ce cas .

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 17:54
par G-Rom
pardon, essaye un init avant le add.

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 17:56
par falsam
G-Rom a écrit :pardon, essaye un init avant le add.
Je l'avais fait. Sans aucun effet .....

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 17:57
par falsam
Je crois que la seule solution sera de demander à l'utilisateur final de préparer les medias dans un seul dossier ou un zip.

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 18:22
par G-Rom
je viens d'essayer, ca marche en 5.70 x86 :

Code : Tout sélectionner

EnableExplicit

Global Camera, Mesh, Entity, NewMap Archive3D()

Declare SelectMesh()

InitEngine3D(#PB_Engine3D_DebugLog) 
InitSprite() 
InitKeyboard()

OpenWindow(0, 0, 0, 1024, 768, "Basic Scene", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, 0, 0, 0)

; Archive par defaut dans mon application
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Water/", #PB_3DArchive_FileSystem)

;Decommentez les ligne suivantes pour voir apparaitre les materials des meshes
; Add3DArchive(GetCurrentDirectory() + "assets\models\sinbad\", #PB_3DArchive_FileSystem)
;Add3DArchive(GetCurrentDirectory() + "assets\models\LibertyStatue\", #PB_3DArchive_FileSystem)
;Add3DArchive(GetCurrentDirectory() + "assets\models\Skull\", #PB_3DArchive_FileSystem)

; Parse3DScripts()

Camera = CreateCamera(#PB_Any, 0, 0, 100, 100) 
CameraBackColor(Camera, RGB(128, 128, 128))
MoveCamera(Camera, 0, 50, 50)
CameraLookAt(Camera, 0, 0, 0)

CreateLight(#PB_Any, RGB(255, 255, 255), 1000, 1000, -500)
WorldShadows(#PB_Shadow_Modulative, 1024, RGB(150, 150, 150))

Repeat
  ExamineKeyboard()
  
  If KeyboardReleased(#PB_Key_F3)
    SelectMesh()
  EndIf
  
  RenderWorld()  
  FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)

Procedure SelectMesh()
  Protected fileName.s
  Protected filePath.s 
  
  fileName.s = OpenFileRequester("Select mesh ...", "assets\models\*.mesh", "Ogre3D (mesh)|*.mesh", 0)
  filePath = GetPathPart(filename)
  
  If FileName <> ""
    If Not FindMapElement(Archive3D(), filePath)
      AddMapElement(Archive3D(), filePath)
      InitEngine3D()
       Add3DArchive(filePath, #PB_3DArchive_FileSystem) ; Fonctionne       
       Parse3DScripts()                                 ; fonctionne 

    EndIf
    
    If IsEntity(Entity)
      FreeEntity(Entity)
    EndIf
    
    Mesh = LoadMesh(-1, GetFilePart(FileName))
    Entity = CreateEntity(-1, MeshID(Mesh), #PB_Material_None, 0, -10, 0)
    RotateEntity(Entity, 270, 35, 0)
  EndIf
EndProcedure

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 18:28
par falsam
Tu as réussi à en voir deux à la suite ?

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 18:33
par G-Rom
je viens de test, non...

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 18:46
par Ollivier
Et avec CloseScreen() (vu que t'es en WindowedScreen, c'est camouflable de le faire disjoncter) ?

Re: Souci de Parse3DScripts() consécutifs

Publié : jeu. 13/juin/2019 18:49
par falsam
Pour charger plusieurs scènes consécutives, j'ai tenté la solution de fermer le screen entre chaque scène et de relancer la séquence d'initialisation 3D mais ca ne fonctionne pas non plus !

Code : Tout sélectionner

EnableExplicit

Global Screen, Camera, Mesh, Entity

Declare NewScreen()
Declare Render()
Declare SelectMesh()

OpenWindow(0, 0, 0, 1024, 768, "Basic Scene", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
NewScreen()
Render()

Procedure NewScreen()
  InitEngine3D(#PB_Engine3D_DebugLog) 
  InitSprite() 
  InitKeyboard()
  
  OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, 0, 0, 0)
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Water/", #PB_3DArchive_FileSystem)
  
  Camera = CreateCamera(#PB_Any, 0, 0, 100, 100) 
  CameraBackColor(Camera, RGB(128, 128, 128))
  MoveCamera(Camera, 0, 50, 50)
  CameraLookAt(Camera, 0, 0, 0)
  
  CreateLight(#PB_Any, RGB(255, 255, 255), 1000, 1000, -500)
  WorldShadows(#PB_Shadow_Modulative, 1024, RGB(150, 150, 150))
  
  Screen = #True
EndProcedure

Procedure Render()
  Repeat
    
    If Screen
      ExamineKeyboard()
      
      If KeyboardReleased(#PB_Key_F3)
        SelectMesh()
      EndIf
      
      RenderWorld()  
      FlipBuffers()
    EndIf
    
  Until WindowEvent() = #PB_Event_CloseWindow Or KeyboardReleased(#PB_Key_Escape)
EndProcedure

Procedure SelectMesh()
  Protected fileName.s
  Protected filePath.s 
  
  fileName.s = OpenFileRequester("Select mesh ...", "assets\models\*.mesh", "Ogre3D (mesh)|*.mesh", 0)
  filePath = GetPathPart(filename)
  
  If FileName <> ""
    Screen = #False
    CloseScreen()
    NewScreen()
    
    Add3DArchive(filePath, #PB_3DArchive_FileSystem) ; Fonctionne       
    Parse3DScripts()                                 ; fonctionne pas      
        
    Mesh = LoadMesh(#PB_Any, GetFilePart(FileName))
    Entity = CreateEntity(#PB_Any, MeshID(Mesh), #PB_Material_None, 0, -10, 0)
    RotateEntity(Entity, 270, 35, 0)    
  EndIf
EndProcedure