Assimp aiNode Names
Verfasst: 05.10.2022, 21:39
'nAbend
Ich verzweifle gerade ein wenig an den Datenstrukturen von Assimp.
Nach einem Versionsupgrade hängt mein Loader in einer Endlosschleife. Ich kann nicht genau sagen, welcher Versionssprung dafür verantwortlich ist, ich kompiliere hier auf einem neuen PC und hab grad nicht den Nerv dutzende Versionen auszuchecken, zu kompilieren, meine Engine zu kompilieren, alles zu testen und dann wieder von vorne anzufangen. Egal, langfristig will ich ja eh mit der neusten Version kompatibel sein, also wird die jetzt einfach benutzt und meine Engine dazu kompatibel gemacht.
Konkret geht es darum, dass ich die Bone bzw. Node Struktur in meine Bones umsetze. Früher hab ich einfach den Namen von einem aiNode als Identifier genommen, aber jetzt habe ich hier ein Modell, dessen erster Node "Scene" heißt, dessen Child dann "carabiner01" (Name des Modells) aber dessen Child dann auch wieder "Scene". Zack, Endlosschleife. Auf den ersten Blick sahen die zwei "Scene"-Node Pointer unterschiedlich aus (es ist ja die Frage ob ein Zyklus in der Node-Hiearchie ist, oder einfach der Name gleich ist), aber das ist letztendlich auch egal, denn die Dokumentation sagt, dass der Name einfach kein Unique-Identifier ist und leer sein kann oder das auch zwei Bones den selben Namen haben können. Also muss ich meinen Code so oder so fixen.
Das Problem ist jetzt: aiNodes haben überhaupt keinen Unique-Identifier. Es gibt keinen Index oder ähnliches (es sind ja auch einfach nur Objekte, die nicht notwendigerweise hintereinander im Speicher stehen), d.h. wenn ich die Knochen in meiner Struktur nachbilden will bleibt mir nichts anderes übrig, als Pointer zu vergleichen. Was vermutlich ok ist, aber ich meine mich zu erinnern, dass es in C++ prinzipiell Fälle gibt, wo das schief gehen kann (bei Vererbungshierarchien und unterschiedlichen Pointertypen oder so), also ist es schonmal nicht unbedingt nett, das tun zu müssen.
Also fange ich an meinen Loader umzuschreiben, bis ich bei aiBone auf das nächste Problem stoße: Hier wird ein Node auf einmal anhand seines Namens referenziert, es gibt keinen Pointer mehr. Gut, laut Dokumentation ist der Node Name eindeutig, wenn ein Bone auf ihn zeigt, also sollte das prinzipiell funktionieren, aber hey mal ehrlich, das ist doch kacke. Um Nodes zu referenzieren brauche ich jetzt sowohl eine Abbildung von Pointer auf Node als auch von Name auf Node. Ist das einfach historisch irgendwie komisch gewachsen oder gibt es einen vernünftigen Grund dafür? Wieso haben aiNodes keinen Unique-Identifier? Das muss ja nicht der Name sein, der Name könnte ja auch eine Art optionaler Kommentar sein. Aber so ist das alles gerade irgendwie sehr unbefriedigend.
Die zweite, vielleicht interessantere Frage: Hat irgendjemand hier den Überblick über die Assimp Entwicklung und klingelt da bei meinem Problem gerade irgendetwas? Wie gesagt, ich hab nicht alles komplett systematisch durchgetestet, aber ich bin mir ziemlich sicher, dass ich jetzt andere Datenstrukturen von Assimp bekomme als früher, denn der entsprechende Code wurde lange nicht angefasst und hat zuvor immer "gut" funktioniert. Vermutlich war das Verhalten immer irgendwie falsch, weil ich davon ausging, Node-Namen seien Unique-Identifier, aber das ging trotzdem bisher immer gut.
Ich verzweifle gerade ein wenig an den Datenstrukturen von Assimp.
Nach einem Versionsupgrade hängt mein Loader in einer Endlosschleife. Ich kann nicht genau sagen, welcher Versionssprung dafür verantwortlich ist, ich kompiliere hier auf einem neuen PC und hab grad nicht den Nerv dutzende Versionen auszuchecken, zu kompilieren, meine Engine zu kompilieren, alles zu testen und dann wieder von vorne anzufangen. Egal, langfristig will ich ja eh mit der neusten Version kompatibel sein, also wird die jetzt einfach benutzt und meine Engine dazu kompatibel gemacht.
Konkret geht es darum, dass ich die Bone bzw. Node Struktur in meine Bones umsetze. Früher hab ich einfach den Namen von einem aiNode als Identifier genommen, aber jetzt habe ich hier ein Modell, dessen erster Node "Scene" heißt, dessen Child dann "carabiner01" (Name des Modells) aber dessen Child dann auch wieder "Scene". Zack, Endlosschleife. Auf den ersten Blick sahen die zwei "Scene"-Node Pointer unterschiedlich aus (es ist ja die Frage ob ein Zyklus in der Node-Hiearchie ist, oder einfach der Name gleich ist), aber das ist letztendlich auch egal, denn die Dokumentation sagt, dass der Name einfach kein Unique-Identifier ist und leer sein kann oder das auch zwei Bones den selben Namen haben können. Also muss ich meinen Code so oder so fixen.
Das Problem ist jetzt: aiNodes haben überhaupt keinen Unique-Identifier. Es gibt keinen Index oder ähnliches (es sind ja auch einfach nur Objekte, die nicht notwendigerweise hintereinander im Speicher stehen), d.h. wenn ich die Knochen in meiner Struktur nachbilden will bleibt mir nichts anderes übrig, als Pointer zu vergleichen. Was vermutlich ok ist, aber ich meine mich zu erinnern, dass es in C++ prinzipiell Fälle gibt, wo das schief gehen kann (bei Vererbungshierarchien und unterschiedlichen Pointertypen oder so), also ist es schonmal nicht unbedingt nett, das tun zu müssen.
Also fange ich an meinen Loader umzuschreiben, bis ich bei aiBone auf das nächste Problem stoße: Hier wird ein Node auf einmal anhand seines Namens referenziert, es gibt keinen Pointer mehr. Gut, laut Dokumentation ist der Node Name eindeutig, wenn ein Bone auf ihn zeigt, also sollte das prinzipiell funktionieren, aber hey mal ehrlich, das ist doch kacke. Um Nodes zu referenzieren brauche ich jetzt sowohl eine Abbildung von Pointer auf Node als auch von Name auf Node. Ist das einfach historisch irgendwie komisch gewachsen oder gibt es einen vernünftigen Grund dafür? Wieso haben aiNodes keinen Unique-Identifier? Das muss ja nicht der Name sein, der Name könnte ja auch eine Art optionaler Kommentar sein. Aber so ist das alles gerade irgendwie sehr unbefriedigend.
Die zweite, vielleicht interessantere Frage: Hat irgendjemand hier den Überblick über die Assimp Entwicklung und klingelt da bei meinem Problem gerade irgendetwas? Wie gesagt, ich hab nicht alles komplett systematisch durchgetestet, aber ich bin mir ziemlich sicher, dass ich jetzt andere Datenstrukturen von Assimp bekomme als früher, denn der entsprechende Code wurde lange nicht angefasst und hat zuvor immer "gut" funktioniert. Vermutlich war das Verhalten immer irgendwie falsch, weil ich davon ausging, Node-Namen seien Unique-Identifier, aber das ging trotzdem bisher immer gut.