Dynamisches Cast bei vorher nicht bekannten Datentypen

Nagilo

Mitglied
Hallo,

die Überschrift ist vielleicht nicht so toll gewählt, aber ich versuche mal das Problem zu beschreiben.

Ich arbeite gerade mit DirectX und lade darin ein Mesh aus einem File. Das Mesh als Attribute u.a. den VertexBuffer, der alle Punkte des Mesh enthält und ein Flag, daß mir sagt von welchem Format die Vetices im Buffer sind. Nur zur Erklärung, es gibt Vertexformate, welche nur die Position beinhalten, aber auch welche, die eine Texture, Normalen, etc. haben.

Jedenfalls muss ich an einer Stelle einmal die Punkte durchlaufen, um darauf eine Berechnung durchzuführen. Dafür muss man den Vertexbuffer vom Mesh auslesen. Das geht ungefährt so (in C Sarp):

Code:
D3D.VertexBuffer meshVB = this.m_mesh.VertexBuffer;
	
D3D.CustomVertex.PositionNormalTextured[] data = (D3D.CustomVertex.PositionNormalTextured[]) meshVB.Lock(	0, typeof(D3D.CustomVertex.PositionNormalTextured), D3D.LockFlags.None, this.m_mesh.NumberVertices);

// do something

meshVB.Unlock();
meshVB.Dispose();

Mein Problem ist nun, daß das geladene Mesh je nach Datei unterschiedliche Vertex-Formate aufweisen kann. An dieser Stelle muss ich aber genau angeben, in welchem Vertex-Format er den Buffer auslesen bzw. locken soll. Tue ich das nicht, stimmen die Daten auf Grund des falschen Cast nicht. Also statt PositionNormalTextured muss ich ihm irgendwie beibringen immer genau auf das Format zu casten, was gerade tatsächlich im Buffer ist. Nur leider weiß ich nicht wie.

Danke für jeden Tip.

Matthias
 
Zuletzt bearbeitet:

Christian Kusmanow

Erfahrenes Mitglied
Hallo Nagilo!

Na Du schaust die die Objekte in deinem Buffer an und machst ein
Code:
objCurrentObj.GetType()
Dann bekommst den reellen Typ des Objekts. ;)

MfG, cosmo
 

Nagilo

Mitglied
Also statt die Elemente aus dem Buffer als D3D.CustomVertex.PositionNormalTextured nun als object auslesen und danach einen Switch oder was auch immer auf obj.GetType() laufen lassen? Und je nach Typ dann weiter arbeiten.

Matthias
 

Christian Kusmanow

Erfahrenes Mitglied
Das verursacht einen RIESEN Overhead. Switch ist zudem auch arschlangsam.
Wenn Du das so implementierst hast den gleichen Vorgang zig mal nur mit dem anderen Typ.

Schneller währe es "die Elemente aus dem Buffer als D3D.CustomVertex.PositionNormalTextured
nun als obj.GetType() auszulesen" ;)

//Edit: Dann ist es nämlich auch vollkommen dynamisch ;)

MfG, cosmo
 
Zuletzt bearbeitet:

Nagilo

Mitglied
Genau da verstehe ich nicht an welcher Stelle das sein sollte. Könntest Du mit kurz meinen Code von oben nehmen und korrigieren?

Danke

Matthias
 

Nagilo

Mitglied
PositionNormalTextured[] data = (PositionNormalTextured[]) meshVB.Lock( ...

Genau in er Zeile steht ja das Problem. Ich weiß ja nicht ob es PositionNormalTextured Typen sind. Daher kann ich dann auch nicht dieses Array anlegen, oder?

Matthias
 

Christian Kusmanow

Erfahrenes Mitglied
Ich hab mich vertan. :-(
Wirst es wohl doch mit dem switch machen müssen. :(
//Edit: Hab meinen Post wieder gelöscht.

MfG, cosmo
 
Zuletzt bearbeitet:

Nagilo

Mitglied
Dein Post ist jetzt genau der Ausgangs-Code. Ich glaube ich werde über einen Switch bestimmen müssen, welches Format die Daten im Buffer haben und dann eben entsprechend auslesen.

Matthias