Problem mit dynamischen VertexBuffer und Zeigerarithmetik
-
Hi,
ich wollte meinem D3D9 Renderer eine Funktion zum auffüllen eines dynamischen VertexBuffers spendieren. So weit so gut... Den VertexBuffer zu locken und diesen mit den neuen Vertexinformationen aufzufüllen ist kein Problem, jedoch besitze ich noch einen Pointer(void*) welcher auf die Vertexinformationen im RAM zeigt um bei einem Lost-Device den VertexBuffer wiederherzustellen zu können. Nun zu meinem Problem, ich zeige einfach das problematische Quelltextfragment:
CopyMemory(&m_vVertexBuffer[idVertexBuffer].pData + (m_vVertexBuffer[idVertexBuffer].uiCurrentSize / uiStride), pVertexData, uiSize);Wie ihr seht versuche ich die Vertexinformationen einfach an das Ende des aktuellen Speicherbereiches schreiben. Nur leider funktioniert es nicht. Der Speicher wurde natürlich schon mit der richtigen Größe allokiert. Es wird auch alles korrekt angezeigt, nur sobald das D3DDevice verloren geht und die Ressourcen neu erzeugt werden sind die Vertexinformationen die ich angefügt habe nicht vorhanden. Ich habe den Verdacht das diese Zeigerarithmetik auf einem void* einfach nicht angewendet werden kann, jedoch weiss ich nicht wie ich es anders bewergstelligen soll. Wäre nett wenn mir jemand eine Möglichkeit nennen könnte mein Problem zu lösen.
DEADBEEF
-
Hab nun herausgefunden woran es lag, jedoch habe ich jetzt ein neues Problem. Es lag tatsächlich an der Zeigerarithmetik. Der erste Parameter muss in einen Datentyp gecastet werden mit derselben Größe wie das VertexFormat. In meinem Fall ist das VertexFormat zur Laufzeit 20 Byte groß, ist es vielleicht möglich eine Dummy Klasse zu erzeugen die genau diese Größe zur Laufzeit besitzt? Oder gibt es eine bessere Alternative? Brauche echt dringend Hilfe, wäre also nett wenn mir jemand helfen könnte.
DEADBEEF
-
na wenn du da vertexdaten kopierst, dann caste doch deien void-zeiger in einen zeiger auf deine vertexklasse. Eine Klasse pro Vertex finde ich aber auch übertrieben, wegen der (eventuellen) vtable. Also machs doch so:
struct Vertex { //... float x, y, z; float u, v; float nx, ny, nz; // und was da sonst noch so drin ist. }; CopyMemory((static_cast<Vertex*>(&m_vVertexBuffer[idVertexBuffer].pData)) + (m_vVertexBuffer[idVertexBuffer].uiCurrentSize / uiStride), pVertexData, uiSize);
-
Das ist ja eben mein Problem... Der Renderer kennt die SVertex Struktur nicht weil diese erst vom "Endbenutzer" definiert wird. Ich habe aber die Größe der Vertexstruktur in Bytes und möchte ein Objekt mit derselben Größe erzeugen.
Am liebsten würde ich es so machenstruct SDummy {
char blub[uiStride]; // Geht natürlich nicht
}CopyMemory(static_cast<SDummy*>(m_vVertexBuffer[idVertexBuffer].pData) +
uiVertexIndex,
pVertexData,
uiSize);Wenn ich in der Struktur das uiStride durch 20 erstetze wird alles korrekt compiliert und angezeigt. Aber leider funktioniert das ja nicht so einfach mit dem struct. Vielleicht ne Idee?
-
char ptr und dann +size drauf. simple zeiger arithmetic, soll ich dich lieber in c++ verschieben?

-
Wie meinst du das mit char pointer und size drauf??? Kannst du mir vielleicht ein bisschen Quelltext zeigen. Vielleicht bekomm ich dann ne Vorstellung was du meinst.
-
void* ptr = 0xdeadbeef; // jetzt willst du den zeiger um 10 vertex-strukturen verschieben: void* ptr2 = (char*)ptr + 10 * sizeof(Vertex);Die Größe der struktur hast du ja gegeben sagst du, also kannst du anstatt sizeof(Vertex) auch gleich size_t(groesse) nehmen.
-
Danke für die Antworten. Es funktioniert nun alles wie es soll und ich kann mich endlich auf die wichtigen Sachen in meiner Engine konzentrieren.