[Assimp] Modell kopieren

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
chewbo
Beiträge: 7
Registriert: 17.09.2009, 15:15

[Assimp] Modell kopieren

Beitrag von chewbo »

Hallo,
ich probiere zur Zeit Assimp aus und stehe vor folgendem Problem:

Ich möchte eine Klasse schreiben in der ich die benötigten OpenGL Routinen zum Zeichnen des Modells aufrufe. Mein Problem ist folgendes:
Im Konstruktor leses ich das Modell ein und setze einen Pointer drauf. Jetzt ist es logisch, dass beim verlassen des Konstruktor der Destruktor des eingelesenen Modells sich einschaltet und alles war umsonst.
Setze ich keinen Zeiger drauf, sondern kopiere ich es, werden die Zeiger die innerhalb der Klasse sind mitkopiert. Logisch ist, dass die Daten somit wiederum futsch sind, wenn sich der Konstruktor meiner Klasse beendet, da beide Zeiger auf den gleichen Speicher zeigen. Ich bräuchte also eine Tiefenkopie. Sowas liefert aber die Klasse nicht mit und selbst schreiben und alle Daten somit kopieren ist aufwendig und nicht umbedingt meine erste Wahl.

Hier mein Code um besser zu verstehen was ich meine:

Code: Alles auswählen

Model::Model(const std::string& pFile)
{
	 
	  Assimp::Importer importer;

		m_pAIScene=importer.ReadFile( pFile, 
        aiProcess_CalcTangentSpace       | 
        aiProcess_Triangulate            |
        aiProcess_JoinIdenticalVertices  |
        aiProcess_SortByPType);
		
		
}
Und die Klasse

Code: Alles auswählen

class Model
{
private:
	const aiScene* m_pAIScene;
	

public:
	Model(const std::string& File);
	~Model(void);
};
Die Frage ist also, wie ihr das Problem lösen würdet oder löst. Ladet ihr alle Modelle global? Oder ladet ihr die immer vorm Zeichnen neu ein? Beide Sachen kann ich mir kaum vorstellen.

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

Re: [Assimp] Modell kopieren

Beitrag von Schrompf »

Das Assimp-Szenenformat ist eigentlich nicht direkt zum Rendern gedacht, sondern nur ein temporäres Format, aus dem man sich die benötigten Daten rausziehen kann. Bei uns läuft Assimp also einmalig im Editor, wenn ein neues Modell von den Grafikern reinkommt. Die Funktion sieht dann so aus:

Code: Alles auswählen

void Lesen()
{
  Assimp::Importer importer;
  importer.ReadFile(...);

  ErstelleEngineDatenAusAssimp( importer.GetScene());
}
So sinngemäß. Was ich damit sagen will: die Assimp-Szene war nicht dazu gedacht, längerfristig behalten zu werden.

Wenn Du das jetzt erreichen willst, kannst Du ja erstmal pro Modell eine Importer-Instanz per new erzeugen. Die und damit auch die damit gelesene Szene hat dann Bestand, solange Deine Model-Instanz besteht.

Code: Alles auswählen

class Model
{
protected:
  Assimp::Importer* mStoff;
};

Model::Model( const std::string& pFile)
{
  mStoff = new Assimp::Importer;
  mStoff->ReadFile( pFile, ...);
}

Model::~Model()
{
  delete mStoff;
}
So könnte es erstmal klappen. Im Normalfall lädt man aber die Assimp-Daten in die Strukturen der jeweiligen Engine um und die Engine kümmert sich dann um die Verwaltung. Die Assimp-Szene ist nur ein temporäres Zwischenformat.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8267
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [Assimp] Modell kopieren

Beitrag von Krishty »

Sry für die potenziell dumme Frage, aber – warum per new und nicht einfach als Member? new birgt schließlich so einige Fallstricke im Verbund mit RAII.

Weiterhin: könnte man nicht einen Importer als statisches Member anlegen, so dass er für alle Modelle nur einmal erzeugt wird?

Gruß, Ky
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] Modell kopieren

Beitrag von Aramis »

Weiterhin: könnte man nicht einen Importer als statisches Member anlegen, so dass er für alle Modelle nur einmal erzeugt wird?
Ja, das ist möglich sofern eine Assimp::Importer-Instanz von nur einem Thread gleichzeitig benutzt wird.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4879
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Assimp] Modell kopieren

Beitrag von Schrompf »

Stimmt, als schlichte Membervar und mit dem Member-Constructor-Syntax geht das auch.

Eine einzelne Instanz für alle geht auch. Allerdings wird bei jedem Aufruf von ReadFile() dann (hoffentlich, habs grad nicht im Kopf) die vorherige Szene zerstört. Wenn ein Außenstehender die Lebensdauer der vom Importer erzeugten Resourcen bestimmen könnte, knallt es wegen der verschiedenen Heaps von DLL und Hauptprogramm bei der Freigabe.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten