Seite 1 von 1

Add3DArchiv

Verfasst: 28.08.2023 07:02
von ProgOldie
Hallo,
ich habe mich als Einstieg in die Grafikprogrammierung mit dem Beispiel 'Bridge' aus dem Manual beschäftigt und bin ganz begeistert über die Möglichkeiten. Alles läuft prima, auch wenn ich eine .exe erzeuge und mit der Engine3D.dll in ein anderes Verzeichnis lege.
Mein Problem: Wenn ich diese Dateien auf einem anderen Rechner starte fehlen offenbar die Texturen, denn alle Objekte sind grau. Der Fehler liegt vermutlich darin, das die EXE-Datei die Texturen und Materialien nicht findet. Letzteres liegt wohl an meinem mangelnden Verständnis von Add3DArchiv().

Code: Alles auswählen

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts",#PB_3DArchive_FileSystem)
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/desert.zip", #PB_3DArchive_Zip)
  Parse3DScripts()
Wie schaffe ich es, dass die EXE auf dem anderen Rechner auch auf die Texturen und Materialien zugreifen kann?
Soll ich mir generell ein eigenes Verzeichnis mit Kopien der benötigten Dateien vor dem Übersetzen, darauf Bezug nehmen und dann diese Dateien mit auf den anderen Rechner kopieren?

Re: Add3DArchiv

Verfasst: 28.08.2023 08:24
von dige
Im Prinzip hast du deine Frage schon selbst beantwortet. Ein eigenes Projekt Verzeichnis anlegen und darin alle benötigten Dateien hineinkopieren und dann mit relativen Pfaden darauf zugreifen.

Re: Add3DArchiv

Verfasst: 05.09.2023 13:32
von Benubi
Vermutlich kennst Du schon die Zielverzeichnisstruktur, deine exe wirst Du vermutlich in einem /bin/win32 oder sowas hinterlegen. Bei Programmstart ermittelst Du den Executable-Namen mit ProgramFilename(), dann nimst du GetPathPart() und fügst "/.." bzw. "/../.." dem Verzeichnisnamen hinzu. Du kannst dann diesen relativen Pfad nehmen, ich gehe dann erstmal per GetCurrentDirectory() und SetCurrentDirectory() vor, damit ich einen absoluten Namen bekomme.

Auch das ist nützlich:

CompilerIf #PB_Debugger ;
; #PB_Compiler_Home benutzen
CompilerElse
; ProgramFilename() und Getpath() etc. benutzen
CompilerEndif


Wenn ich den Debugger benutze möchte ich auch manchmal weniger Objekte usw. in 3D generieren um Zeit zu sparen; also z.B. 50 entities generieren anstelle von 500.

Wenn es um die GUI geht, solltest Du alle abhängigen Add3DArchive() gemacht haben bevor Du ein erstes Renderworld() machst, weil sonst gibt es Probleme beim Nachladen oder wählen (man kann derzeit nicht on-the-fly den Style/Skin der GUI ändern).

Auch glaube ich, daß der Verzeichnisinhalt gepuffert wird. Daher wenn Du ein /temporary Verzeichnis hast, wo Du generierte Meshs ablegen möchtest, dann findet die Engine diese Meshs nicht wenn sie nach dem Einbinden des Verzeichnisses erstellt worden (jedenfalls bei mir ging das nicht); hier müsste man wohl wenn sich die Verzeichnisstruktur ändert das Verzeichnis wiederholt einbinden - habe ich aber noch nicht getestet.