Seite 1 von 1

ASSIMP auf iPhone und Binärformate

Verfasst: 22.03.2011, 18:58
von maxx2097
Hallo zusammen,

ich bin heute über ein Problem mit ASSIMP auf dem iPhone gestossen:

Textbasierte Formate (z.B. collada) funktionieren wunderbar. Allerdings habe ich ein Problem mit Binärformaten (getestet habe ich 3ds und lwo). Bei diesen Formaten funktioniert der Import im iPhone Simulator wunderbar... allerdings nicht auf einem echten Gerät.

Da der Simulator ja kein Emulator ist und direkt X86 Code ausführt ist das auch halbwegs nachvollziehbar. Ich vermute mal es könnte evtl. an einem Endian-Problem im Zusammenhang mit der ARM-CPU des iPhones liegen.

Konkret geht es z.B. bei der Ausführung an folgenden Stellen daneben (EXC_BAD_ACCESS):

bei 3ds in Streamreader.h

Code: Alles auswählen

// ---------------------------------------------------------------------
	/** Generic read method. ByteSwap::Swap(T*) *must* be defined */
	template <typename T>
	T Get()	{
		if (current + sizeof(T) > limit) {
			throw DeadlyImportError("End of file or stream limit was reached");
		}

		T f = *((const T*)current);
		Intern :: Getter<SwapEndianess,T,RuntimeSwitch>() (&f,le);

		current += sizeof(T);
		return f;
	}
und bei lwo in LWOLoader.h

Code: Alles auswählen

// ------------------------------------------------------------------------------------------------
inline float LWOImporter::GetF4()
{
	float f = *((float*)mFileBuffer);mFileBuffer += 4;
	AI_LSWAP4(f);
	return f;
}
Soweit ich sehen kann wird die aktuelle Architektur ja in aiDefines.h festgelegt. Ich habe dort auch mal ein wenig experimentiert, aber leider ohne Erfolg.

Hat jemand eine Idee?

Vielen Dank!

Maxx

Re: ASSIMP auf iPhone und Binärformate

Verfasst: 22.03.2011, 19:09
von Schrompf
Das klingt wirklich nach Endian-Problemen. Kannst Du mit Sicherheit sagen, dass der ARM ein BigEndian-Speichermodell nutzt? Wenn ja, müsste man die Plattformdefs entsprechend erweitern.

Re: ASSIMP auf iPhone und Binärformate

Verfasst: 22.03.2011, 19:23
von Aramis
BigEndian sollte theoretisch bereits funktionieren, nur haben wir es zum letzten Mal vor vielleicht 2 Jahren getestet. Allerdings nutzen etliche Loader (LWO wohl nicht, aber 3DS) den StreamReader, der die Endian-Konvertierung zentral eingebaut hat.

Re: ASSIMP auf iPhone und Binärformate

Verfasst: 22.03.2011, 19:41
von maxx2097
Schrompf hat geschrieben:Das klingt wirklich nach Endian-Problemen. Kannst Du mit Sicherheit sagen, dass der ARM ein BigEndian-Speichermodell nutzt? Wenn ja, müsste man die Plattformdefs entsprechend erweitern.
Der ARM kann wohl beides. Was ich so gelesen hab läuft der im iPhone angeblich auch auf Little-Endian... dann wäre es aber komisch, dass es nicht funktioniert.

Re: ASSIMP auf iPhone und Binärformate

Verfasst: 22.03.2011, 20:09
von maxx2097
Hmm... also ich kann soweit doch schon mal Entwarnung geben... in der Release-Konfiguration funktioniert es auch auf dem physikalischen iPhone. Warum es aber in der Debug-Config nicht geht erschliesst sich mir gerade nicht.
Evtl. liegt es an irgendwelchen Compiler-Flags die sich da unterscheiden... zumindest in XCode sehe ich da aber jetzt keinen Unterschied (bis auf die üblichen Optimierungen für Release).

Re: ASSIMP auf iPhone und Binärformate

Verfasst: 23.03.2011, 00:28
von Jörg
Welchen Wert haben current und mFileBuffer wenn es kracht?

Re: ASSIMP auf iPhone und Binärformate

Verfasst: 25.03.2011, 21:15
von maxx2097
Also der Wert von mFileBuffer (LWO Import) scheint zumindest nicht total ins Nirvana zu zeigen... zumindest ist der Wert immer gleich ">" (siehe screenshot).
Screen shot 2011-03-25 at 9.09.55 PM.png
Dass das Ganze nur in der Release-Konfiguration läuft wäre ja zumindest für den Moment noch zu verschmerzen... ein weiteres "Phänomen" ist allerdings, dass in der Release-Konfig anscheinend die Normals der Meshes nicht richtig gelesen, oder gespeichert werden (auch bei Textformaten wie Collada).

Somit ist bei mir im Moment die einzig lauffähige Kombination Debug + Textformat.

Jemand noch eine Idee? Bzw. hat es jemand erfolgreich auf dem iPhone laufen?

Prost!

Re: ASSIMP auf iPhone und Binärformate

Verfasst: 25.03.2011, 21:23
von Jörg
Auf allen nicht x86-Platformen wuerde ich davon abraten, floats aus nicht passend ausgerichteten Pointern zu lesen.
Wenn das der Wert ist, bei dem es kracht, dann ist er falsch ausgerichtet.
Also memcpy in eine float-Variable machen.