Souci de Parse3DScripts() consécutifs

Généralités sur la programmation 3D
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Souci de Parse3DScripts() consécutifs

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message 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) ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Souci de Parse3DScripts() consécutifs

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message par falsam »

J'ai essayé de cette manière

Code : Tout sélectionner

Add3DArchive(filePath, #PB_3DArchive_FileSystem)       
InitEngine3D()
Parse3DScripts()    
Malheureusement sans aucun changement ......
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message 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 ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message 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 .
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Souci de Parse3DScripts() consécutifs

Message par G-Rom »

pardon, essaye un init avant le add.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message par falsam »

G-Rom a écrit :pardon, essaye un init avant le add.
Je l'avais fait. Sans aucun effet .....
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Souci de Parse3DScripts() consécutifs

Message 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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message par falsam »

Tu as réussi à en voir deux à la suite ?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Souci de Parse3DScripts() consécutifs

Message par G-Rom »

je viens de test, non...
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message par Ollivier »

Et avec CloseScreen() (vu que t'es en WindowedScreen, c'est camouflable de le faire disjoncter) ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Souci de Parse3DScripts() consécutifs

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre