Assimp - Brainstorming zum Release

Hier kann über allgemeine Themen diskutiert werden, die sonst in kein Forum passen.
Insbesondere über Szene, Games, Kultur, Weltgeschehen, Persönliches, Recht, Hard- und Software.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Ich hab grade das Gefuehl, dass wir ein bisschen aneinender vorbei reden. Zugegebenermassen, nachdem du in letzter Zeit etwas verhindert warst (nachvollziehbarerweise :-)), hat ein Grossteil der diesbezueglichen Kommunikation zwischen Thomas und mir stattgefunden, weshalb wir beide nun eine relative aehnliche Vorstellung zu haben scheinen.

Grundsaetzlich geht es drum Exportsupport fuer die wichtigsten Formate anzubieten: aiScene rein, fertige Datei raus. Nun ist ja nicht gesagt, dass der Aufrufer die Daten tatsaechlich auf der Platte haben will – er koennte sie ja, wie du gesagt hast, ueber's Netzwerk streamen wollen oder noch eine Pruefsumme berechnen, oder oder oder. Daher die Blobs – de-fakto einfach die exportierten Daten im Zielformat (in den allermeisten Faellen somit augenscheinlich strukturlose Binaersuppe).
Wie erkennt man den Master-Blob
Die Export-Funktion gibt ihn zurueck - er enthaelt dann ggf. einen Link auf den naechsten Blob.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Schrompf »

Kimmi, ich habe den Eindruck, Du stellst Dir unter Exporter etwas ganz Anderes vor als wir. Der ganze Sinn eines Exporters ist es, eine Datei zu erstellen, die von einem anderen Programm (nicht bzw. wahrscheinlich nicht Assimp) gelesen werden kann. Daher DARF es keinen Header geben. Wenn das jeweilige Zielformat einen Header definiert, wird der dazugehörige Exporter einen schreiben. Wenn das Exportformat Big Endian verlangt, wird der Export Big Endian schreiben - egal ob auf PPC-Mac oder x86-Windows. Und das Schreiben des Blobs in eine Datei ist der ganze Sinn des Unterfangens. Wie soll denn sonst z.B. 3DStudioMax an die exportierte Szene rankommen?

Der Master-Blob ist der, den die Export-Funktion zurückgibt. Evtl. weitere Blobs werden von dem aus als einfach verbundene Liste referenziert.

Aber ich sehe gerade, dass Alex schneller war als ich. Und auch er ist ein wenig verwirrt darüber, was genau Du eigentlich unter "Export" verstehst :-) Ich hoffe, zusammen konnten wir die Unklarheiten beseitigen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

OK, aneinander vorbei geredet. So habe ich das verstanden:
  • Export schreibt zum Beispiel ein aiScene im Obj-Format hinaus.
  • Daten wurden zuvor zum Beispiel aus einem Collada-File gelesen.
  • Blobs sind die Datenhaufen zum Arbeiten, die die Daten von aiScene beinhalten, ein Blob pro File ( also gelesen von einem Obj mit 2 Mtl-Files -> 3 Blobs ).
  • Blobs sollen nicht zum Zwischenspeichen auf die Platte gebracht werden.
  • Blobs sollen dementsprechend keinen Header / Flag whatever haben oder ... <- darauf bezog sich meine Frage.
Meine Frage:
Wenn man einen Blob auf der Platte rumflaggen hat bzw. dort zwischenspeichern und den irgendwohin verteilt: wollen wir das zulassen? Welche Probleme würden auftreten, wenn wir das wollten. Sollen die ein reines In-Memory-Konstrukt sein, die unter gar keinen Umständen jemals auf der Platte landen?
Hintergrund dieser Frage: ich habe mal in einer Firma gearbeitet, wo wir genau so etwas gemacht haben, um die Datenverarbeitung zu beschleunigen, da man nun nicht alles im Speicher haben muss, was bei sehr großen Daten ( mehrere Gig's ) zu Problemen geführt hat.
Daher kam bei mir die Frage auf, die für Verwirrung gesorgt hat, sorry. Hätte das klarer sagen sollen.

Gruß Kimmi
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Schrompf »

kimmi hat geschrieben: [*]Blobs sollen nicht zum Zwischenspeichen auf die Platte gebracht werden.
Und da gehen die Meinungen auseinander. Natürlich soll der Blob auf Platte gespeichert werden! Das ist doch der ganze Sinn des "Exports". Wie soll denn sonst ein anderes Programm an die exportierten Daten kommen, wenn die nicht in einem File gespeichert sind?

Ablauf: man hat eine aiScene mit Nodes, Meshes, evtl. Anims, Materialien, Lichter, wasweißich. Woher die kommt, ist vollständig egal. Evtl. wurde die vorher aus einer Datei mit Assimp geladen, evtl. wurde sie im Programm aus anderen Daten erstellt. Diese Szene gibt man an aiExportScene(), wobei der zweite Parameter bestimmt, in welchem Format die Szene exportiert werden soll. Anhand des vorgegebenen Formats wird ein Exporter ausgewählt, der die Szene überreicht bekommt. Dieser Exporter schreibt jetzt die Daten in seinem Format raus. Heraus kommt ein Speicherblock, der die Szene im gewünschten Dateiformat enthält. Diesen Speicherblock muss man nur noch auf Platte schreiben und hat so eine Datei im gewünschten Dateiformat, die die gegebenen Szenendaten enthält. Und diese Datei kann dann wieder von irgendjemandem wieder geladen werden, der das Dateiformat versteht. Collada und OBJ verstehen einige, also lohnt sich der Export.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

Nein, die Meinungen gehen gerade nicht auseinander. Ich fände das auch super, wenn man die Blobs auf der Platte parkt. Daher habe ich das oben ja auch gefragt:
Wenn man einen Blob auf der Platte rumflaggen hat bzw. dort zwischenspeichern und den irgendwohin verteilt: wollen wir das zulassen? Welche Probleme würden auftreten, wenn wir das wollten. Sollen die ein reines In-Memory-Konstrukt sein, die unter gar keinen Umständen jemals auf der Platte landen?
Und da ich mit so etwas schon oft arbeiten musste und durch Probleme wie Streaming Probleme hatte, ich einem Blob zusätzlich zu dem reinen Daten-Buffer noch einen Info-Header spendieren:

Code: Alles auswählen

struct aiExportDataBlob 
{
        /// Data desc. ( flags like id of next blob etc. )
        unsigned int Header:

        /// Size of the data in bytes
        size_t size;
	
        /// The data. 
        void* data;
};
Das ist alles. Selbstredend muss man das nicht machen. Aber man kann und da wollte ich mal eine Meinung zu hören. Ich persönlich würde in einer Anwendung ganz konkret davon profitieren, wenn wir Daten in dieser Form vorliegen hätten ( mit oder ohne Header ist mir schnuppe ), da bei mir der Bottleneck das Vor-Verarbeiten der Modell-Daten darstellt und ich mir das dann sparen könnte. Momentan probiere ich da mit kd-Bäumen rum, um das Ganze etwas zu entschärfen.

Ich hoffe, langsam nähern sich unsere Sichtweisen einander an :).

Gruß Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Ich verstehe das Problem nicht. dass wir einen extra Flags-Member einfuehren, haben wir ja schon beschlossen. Der naechste Blob wird ueber einen Pointer referenziert denn wir hatten uns ja auch auf eine einfach verlinkte Liste geeinigt.

Wenn wir noch weitere Informationen im Blob speichern wollen, koennen wir die ja nach Bedarf hinzufuegen, insofern bleibt alles offen.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Schrompf »

Ich verstehe es immernoch nicht. Was sollte denn in dem Header drinstehen? Und was hat das mit der Datenübertragung zu tun, wenn wir hier doch von einer rein im Speicher gehaltenen Struktur reden? Soll der Header mit auf Platte geschrieben werden? Wenn ja, wie soll dann noch ein valides File des gegebenen Dateiformats rauskommen, das auch andere Programme lesen können? Wenn nein, warum soll es dann den Header geben?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

Arg! Ich hatte einige Postings nicht mitbekommen. Sorry! Ich stimme euch zu und bin nun still!

Gruß Kimmi

P.S.: Ich habe im wesentlichen eure Diskussion wiederholt...
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Passt schon - ich hoffe, wir sind uns damit insgesamt einig auch wenn das jetzt insgesamt relativ flott kam ;-)
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

Wer lesen kann, ist halt klar im Vorteil. Ich habe das alles noch mal gelesen und da fand ich einige ungelesene Statements von euch ^^. Das, was ich als Header bezeichnet habe, sind deine Flags. Ich bin genau wie Schrompf für auf Platte schreiben. Und da auch das mit Endian bereits vorgesehen ist, hab ich "etwas" an euch vorbei geredet. Wie gesagt, mir fehlten einige Posts. Ich gelobe Besserung.

Gruß Kimmi
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Schrompf »

Ok, dann passt ja alles :-)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Es faellt mir erst jetzt auf: wieso nutzen wir nicht das Stream/IOSystem-Interface zum Exportieren? Darauf aufbauend koennen wir immer noch eine Blob-IOSystem-Implementierung, die alles in unsere jetzigen Blobs hineinschreibt, anbieten.

Die meisten Exporter werden einfach von vorne nach hinten ihre Daten schreiben, wissen aber nicht von Anfang an, wie viel Platz sie benoetigen werden. Das riecht nach Stream - wenn 99.9% der User die Daten sowieso auf der Platte haben wollen, reicht die Default-Implementierung des IOSystem's im Normalfall aus und kommt von Haus aus mit mehreren Dateien klar (und sogar auch mit beliebig komplexen Ordnerstrukturen).

Kurz: machen wir es einfach umgekehrt - Exporter schreiben in ein IOSystem rein und darauf aufbauend eine Hilfsfunktion, die ein eigenes IOSystem setzt und den ganzen Kram in Blobs abfaengt.

Wir sparen uns damit Arbeit - kein Exporter muss sich mit Blobgroessen rumschlagen. Fuer den Grossteil der User wird das ganze flotter und die Ausgabedaten muessen nicht vollstaendig in den Speicher passen (Assimp ist ja sowieso nicht so sonderlich streaming-faehig, da die aiScene staendig im Speicher sein muss - trotzdem koennte man sich Faelle vorstellen, bei denen die aiScene + der schaetzungsweise nochmal genauso grosse Export-Blob den x86-Adressraum sprengten bzw. kein entsprechend grosser Block mehr verfuegbar ist).

Das ist mir eben erst aufgefallen - ich glaube, die Blobs als Primaerinterface sind auf Dauer der falsche Weg.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Schrompf »

Da könntest Du recht haben. Aber können wir denn Standard-Streams auf unser IO-System mappen? Ansonsten wäre das wirklich die Ideallösung für alle Dateisysteme: der Nutzer übergibt einen Start-Dateinamen und evtl. ein IOSystem (Defaultparameter NULL) und das Thema wird erledigt. Find ich gut.

Ich hab im ColladaExporter aktuell einen StringStream benutzt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

Das wäre klasse. So könnten wir Blobs zum Beispiel gleich gezippt speichern, wenn wir das wollen :).

Gruß Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Ok, Draft ist aktualisiert.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Kurze Info: ich habe die geltenden Limits fuer die UV-Channel- bzw. Vertexcolor-Kanal-Anzahl von 4 auf 8 erhoeht. An dieser Stelle ein Glueckwunsch an uns: scheinbar hat niemand je versucht, die Konstanten als gottgegeben anzusehen und sich auf ihren Wert zu verlassen - und wenn doch, wurde es jeweils sauber assert()ed ;-)

Woher ich diese Gewissheit nehme: Die Testsuite hat keine Probleme identifiziert und laedt immerhin ~260 Modelle mit jeweils 3 verschiedenen Postprocessing-Setups. Einzig die ganzen Objs und einige Blender-Files weichen aktuell vom Referenz-Dump ab, aber das liegt wohl an Kimmis letzten Fixes am Obj-Loader bzw. meiner Unfaehigkeit letzterem Loader ein paar noch verbliebene Nicklichkeiten auszutreiben. Trotzdem muessen wir uns auf jede Menge versteckter Regressionen gefasst machen. Ich denke aber, dass die Erhoehung des Limits ein lange ueberfaelliger Schritt war.

8 Channels should be enough for everyone.

Gruss, Alex
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: Assimp - Brainstorming zum Release

Beitrag von Eisflamme »

Ihr ladet mittlerweile Blender, das ist neu, oder? Ich hab gehört, das Format sei wirklich Mal eine Heidenarbeit, da das Format sehr... ich sag Mal heterogen speichert. Wenn das alles so stimmt, dickes Kompliment, da werde ich sicherlich auch noch das ein oder andere Mal testen. :)
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Ja, Assimp unterstuetzt Blender, wenngleich bislang noch ohne Animationen. Werde ich mich naechstens mal ranwagen.

Feedback zum Blender-Loader ist sehr erwuenscht. Wie du richtig feststellst, hat das Format so seine Tuecken. Als heterogen wuerde ich es nicht bezeichnen, eher als sehr, sehr Blender-zentrisch, soll heissen ex-zentrisch ;-)

Gruss, Alex
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

Ich habe die Änderungen im Obj-Loader auf dem Zettel, bin bisher aber noch nicht dazu gekommen. Ich kann mir im Zuge dessen den Rest auch anschauen.

Gruß Kimmi
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Krishty »

Ich hoffe, dieser Thread ist immernoch für Brainstorming da … mir fiel beim jammern ein:

Man kann Assertions nicht nur zum Debugging nutzen, sondern auch für Optimierungen – dafür #definiert man Assertions in Debug-Builds nicht leer, sondern (unter Visual C++) mit __assume(expr). Während man im Debug-Build also sagt: Diese Bedingung muss eintreten, und falls nicht, brich die Ausführung ab, damit ich korrigieren kann, bedeutet es in Release-Builds: Diese Bedingung muss eintreten, optimier daraufhin.

Bei mir bringt das ordentlich was, weil ich z.B. bei Funktionen, die allokierte Objekte zurückgeben müssen, assert(nullptr != result); vor den return-Ausdruck schreibe. Der Compiler weiß dann im weiteren Verlauf, dass das Ergebnis der Funktion und alle Zeiger, in denen es gespeichert wurde, nicht nullptr sein kann und optimiert jeden Text, der etwas anderes annehmen könnte oder Rückgabewerte testet, weg. Das schmeißt nochmal vieles raus, was LTCG nicht von allein rafft (wenn auch imo nicht genug). Wenn man assert() hingegen leer #definiert, bleiben diese Optimierungen aus.

Viel bringt das auch, wenn man per assert() Wertebereiche von Variablen festlegt.

Visual C++ kann nur einfache Ausdrücke, wie Vergleiche, verwerten. Sowas wie assert(0xFCBDA == computeCRC32of(mesh.header()->id())) würde ignoriert und nicht zur Optimierung herangezogen; würde es bei leerem Release-assert() aber ebenso.

Ihr könnt also mal darüber nachdenken, ob ihr ai_assert() in Release-Builds unter Visual C++ nicht zu #define ai_assert(expression) __assume(expression) ändert. Ich habe leider momentan kein Assimp-abhängiges Projekt, sonst hätte ich selber schon getestet, wie viel das bringen würde (wenn überhaupt – es hängt eben auch davon ab, wie oft und wie komplex man ai_assert() einsetzt). Aber ich glaube zumindest nicht, dass es schaden könnte.

Nachtrag: Gerade ausprobiert; 8 KiB bzw. 0,5 % weniger Maschinentext. Nicht viel, aber wenn man die beiden Speicherseiten schonmal fast gratis bekommt, kann man sie auch direkt mitnehmen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Krishty »

Mal ein Nachtrag zu __assume(), da habe ich noch ein paar Probleme gefunden:
  • In DefaultLogger.cpp müssen alle ai_assert(false) durch ai_assert(message.length() <= MAX_LOG_MESSAGE_LENGTH) ersetzt werden — ai_assert(false) bedeutet: „Dieser Befehl darf niemals erreicht werden“. Darum würde der Optimizer den kompletten Block wegoptimieren, wenn er auf __assume(false) träfe. Dasselbe gilt für SceneCombiner.cpp:67 und u.U. Subdivision.cpp:119.
  • In BlenderModifier.cpp:299, StreamReader.h:93 und Subdivision.cpp:564 müssen die ai_asserts so angepasst werden, dass sie boolesche Ausdrücke ergeben (NULL !=?)
Dann sind mit __assume() zwar viele Funktionen einige Bytes kleiner, aber die Gesamtgröße hat um 600 B zugenommen – scheinbar fast ausschließlich durch SceneCombiner::MergeScenes(), wo nun agressiver geinlinet wird.

Davon ab noch was, was man machen könnte:
  • In den Vergleichsoperatoren von aiString memcmp() statt strcmp() benutzen, weil an dieser Stelle sicher ist, dass die Strings gleich lang sind. Das ist bestenfalls doppelt so schnell.
  • Nachtrag: Wo nur Ausgabe-Funktionalität gefordert ist, kann man ::std::ostringstream statt ::std::stringstream benutzen. Ersteres hat eine flachere Vererbungshierarchie und umgeht Diamantvererbung, weshalb deutlich weniger Aufwand für K’toren und D’toren am Anfang und Ende der Nutzungszeit aufgewendet werden muss. Betroffen sind
    • code\BoostWorkaround\boost\format.hpp:34
    • code\LWOLoader.cpp:1100
    • code\OgreImporter.cpp:224
    • code\OgreImporter.cpp:245 und
    • code\Q3BSPFileImporter.cpp:71.
  • Assimp::Logger::debug()/info()/warn()/error() für const char * const überladen. Die Überladungen unterscheiden sich von den Originalen insofern, als dass sie nicht message.length() sondern strlen(message) für die Längenprüfung benutzen. Bringt: 2,9 % weniger Größe (manche Importierungsfunktionen werden um bis zu 2 KiB kompakter) und einen winzigen Laufzeitvorteil, weil bei den meisten Logger-Meldungen die Konstruktion eines temporären ::std::string entfällt und die Prüfung schon zur Kompilierzeit aufgelöst werden kann.
Bringt zwar nicht viel, aber all das kann man mit minimalem Aufwand an den Laderoutinen durchführen. Ich habe auch noch am Exception-Handling rumgefummelt, aber da kam kaum was Merkliches bei raus.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

Das würde dann aber nur für neuere Visual-Studio-Varianten funktionieren, richtig? Müßte man mal schauen, wie man das integriert.

Gruß Kimmi
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Krishty »

__assume funktioniert nur auf Visual C++ (ab .NET 2003 – aber was früheres unterstützt ihr eh nicht mehr); aber angesichts der minimalen Verbesserung ist es auch längst nicht mehr meine Lieblingsoptimierung. Im Zweifel doch lieber die anderen drei.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Nachdem ich ein bisschen am Assimp-Kern rumgebastelt habe, ist es wohl mal wieder Zeit fuer ein Status-Update.
  • Das Exportinterface ist mittlerweile vollstaendig implementiert. Auch das Sekundaerinterface ueber Blobs funktioniert und ist durch Test-Cases grob abgedeckt.
  • Das Export-Interface ist nun standardmaessig aktiviert, auch in CMAKE. NO_EXPORT deaktiviert es.
  • Sowohl AssimpCmd als auch AssimpView unterstuetzen nun das Exportieren. Thomas' sehr kreativer, hardgecodeter Collada-Export im Viewer ist dabei rausgeflogen. Wenigstens habe ich jetzt nicht mehr staendig eine test.dae auf dem Desktop :-)
  • Krishty's Tipps von oben sind, mit Ausnahme von __assume implementiert. Die Platzersparnis lag in der Tat im Bereich 2-3%.
  • Website ist auch auf dem neuesten Stand. Ihr muesst ggf. aktualisieren.
Mick-p's Deboneprocess ist ebenfalls bereit, ich warte nur noch auf ein Testmodell.

Naechste Schritte von meiner Seite:
  • Exporter-Doku
  • Die Export-Funktionalitaet verwenden um die Regressions-Suite zu erweitern (z.b. Ping-Pong Import/Export-Tests)
  • IGES
  • Blender-Animationen
  • 3DS-Export
  • Refactoring bei einigen grenzwertig implementierten Loadern
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Schrompf »

Gute Sache!
Aramis hat geschrieben: [*]Sowohl AssimpCmd als auch AssimpView unterstuetzen nun das Exportieren. Thomas' sehr kreativer, hardgecodeter Collada-Export im Viewer ist dabei rausgeflogen. Wenigstens habe ich jetzt nicht mehr staendig eine test.dae auf dem Desktop :-)
Oh, sorry. Hatte gar nicht bemerkt, dass ich das eingecheckt habe.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Debone von Mick-p ist drin. Hab bei der Gelegenheit etwas aufgeraeumt.

Der Step findet tatsaechlich bei fast allen animierten Testmodellen mindestens 1 oder 2 voellig unnoetige Bones.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Aramis »

Moin,

ich hab eine rudimentaere Testversion eines Obj-Exporters am laufen und hab mich dabei an Thomas' Collada-Code orientiert.

Der nutzt recht an zentraler Stelle einen std::stringstream und kopiert das Resultat in einen IOStream. Die zusaetzliche Kopie duerfte in den meisten Faellen schneller sein als direkt in den IOStream zu schreiben weil der ja bei jedem Write potentiell auf die Platte geht.

Was mir eher Sorgen macht ist die locale-Abhaengigkeit von stringstream. Bin ich falsch informiert oder bekomme ich auf einem System mit deutscher Locale Kommas als Fliesskomma-Separatoren? (mein System ist bedauerlicherweise rein en_us).

Sollte das der Fall sein, brauchen wir eine Alternative - weiss jemand ob ss.imbue(std::locale("en_US.UTF8")); ausreichend portabel ist und das gewuenschten Resultat bringt? Oder kennt jemand ein drop-in Replacement fuer stringstream, das nicht von einer Locale abhaengig ist? Dasselbe gilt natuerlich auch fuer boost::lexical_cast.


Ansonsten schlage ich vor, dass wir als Testkriterium fuer unsere Exporter folgendes festhalten:
  • Wenn ich ein File in einem beliebigen Quellformat nehme, lade und nach A im zu testenden Format exportiere
  • A erneut lade
  • und nach B im selben Format exportiere
  • muessen A und B vorbehaltlich Fliesskommadetails identisch sein.
Dieses Kriterium ist insbesondere nuetzlich wenn es um das Generieren von Namen und Identifiern beim Export geht (was zuweilen erforderlich sein kann, z.b. bei Obj).
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von Schrompf »

Nach meinem Wissen ist stringstream und Konsorten von Haus aus "en_us.UTF8", bis man eine andere Locale imbued. Was für ein phantastischer Satz.

Zum zweiten Teil stimme ich Dir zu: das Export->Import->Export-Kriterium müsste eigentlich immer gegeben sein, außer man erzeugt Identifier mit einem "Text%d" % rand() oder sowas :-)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Assimp - Brainstorming zum Release

Beitrag von kimmi »

Das Testkriterium halte ich für sinnig, zumindest als Wunschziel. Gerade beim Obj-Format enthalten die Modelle noch einiges an Groppierungsanweisungen, die ebenfalls beim Export nicht uninteressant wären, sofern der jeweilige Exporter diesbezüglich ein dazu passendes Gruppierungselement unterstützt.

Ein Problem sehe ich allerdings, wenn irgendwann einmal Curved Surfaces unterstützt werden sollen. Entweder tesseliert man diese gleich und arbeitet mit den Dreiecken weiter, was aber beim Export->Impoprt->Export zu Problemen in der Genauingkeit führen wird. Oder man hebt sich die Kurvenbeschreibungen auf.
Oder aber man entscheidet sich, komplett Curved-Surfaces außen vor zu lassen.

Gruß Kimmi
Antworten