Entwickler-Ecke
Multimedia / Grafik - Übersetzung C -> Delphi... Hilfeeee
Lazarus - So 19.08.07 04:05
Titel: Übersetzung C -> Delphi... Hilfeeee
Original C-Code:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| struct _VERTEX { D3DXVECTOR3 pos; // vertex position D3DXVECTOR3 norm; // vertex normal float tu; // texture coordinates float tv; } VERTEX,*LPVERTEX;
#define FVF_VERTEX D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1
// lock the vertex buffer LPVERTEX pVerts; if (SUCCEEDED(texMesh->LockVertexBuffer(0,(BYTE **) &pVerts))) {
// get vertex count int numVerts=texMesh->GetNumVertices();
// loop through the vertices for (int i=0;i<numVerts;i++) {
// calculate texture coordinates pVerts->tu=asinf(pVerts->norm.x)/D3DX_PI+0.5f; pVerts->tv=asinf(pVerts->norm.y)/D3DX_PI+0.5f; // go to next vertex pVerts++; <-- Das verstehe ich nicht !!! }
// unlock the vertex buffer texMesh->UnlockVertexBuffer(); } |
Ich habe daraus folgenden Delphi-Code gemacht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| const FVF_VERTEX = D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_TEX1;
type PMeshVertex = ^TMeshVertex; TMeshVertex = packed record Pos: TD3DXVector3; Norm: TD3DXVector3; tu, tv: Single; end;
var TempMesh: ID3DXMesh; pVerts: pMeshVertex; Loop: LongInt;
if Succeeded(TempMesh.LockVertexBuffer(0, Pointer(pVerts))) then begin for Loop := 0 to TempMesh.GetNumVertices do begin pVerts.tu := ArcSin(pVerts.Norm.x / Pi * 0.5); pVerts.tv := ArcSin(pVerts.Norm.y / Pi * 0.5); Hier fehlt nu irgendwie was :-)
end; end; TempMesh.UnlockVertexBuffer; |
Kann mir da jemand weiterhelfen ????
Moderiert von
matze: Code- durch Delphi-Tags ersetzt
Lazarus - So 19.08.07 10:19
Danke dir Kurzer :-)
Aber das bringt mir garnix, ich muss nur wissen, wie ich das eine Stück C-Code nach Felphi konvertiere ind die Geschichte mit pVerts++ verstehe ich nicht...
jaenicke - So 19.08.07 10:34
Wenn du den Inkrementor in C auf einem Pointer nutzt, dann kommst du zum nächsten Speicherbereich (abhängig vom Variablentyp). Bei einem Pointer auf ein Zeichen kannst du so z.B. eine Zeichenkette ablaufen.
Mit Inc (um die Größe der Datenstruktur) müsste in Delphi das selbe herauskommen, ich weiß aber nicht, ob das in Delphi nur mit einem untypisierten Pointer (also per Typecast nach Pointer und zurück) funktioniert.
Heiko - So 19.08.07 10:40
jaenicke hat folgendes geschrieben: |
Mit Inc (um die Größe der Datenstruktur) müsste in Delphi das selbe herauskommen, ich weiß aber nicht, ob das in Delphi nur mit einem untypisierten Pointer (also per Typecast nach Pointer und zurück) funktioniert. |
Es geht auch mit typisierten Pointern. Da springt er dann nicht um 4 Byte, sondern um die Größe des Types weiter. Bei Cardinal z.B. um 8 Bytes.
Lazarus - So 19.08.07 11:05
:cry: Ich verstehe das Stück mit dem pVerts++ einfach nicht....
jaenicke - So 19.08.07 11:10
Also:
Stell dir vor, im Arbeitsspeicher liegt eine Liste mit 5 Datensätzen hintereinander, wie in einem Array, nur eben einfach hintereinander.
Jetzt zeigt der Pointer auf das erste Element:
Nun wird der Zeiger um die Größe des Datensatzes inkrementiert (In Delphi einfach
Inc(pVerts);). Also zeigt der Pointer jetzt auf die Stelle direkt hinter dem ersten Datensatz. Und dort liegt der zweite Datensatz, der Pointer zeigt also auf das nächste Element:
Auf die Weise gehst du die Datensätze durch und hast jeweils den Pointer auf das aktuell bearbeitete Element in pVerts.
Lazarus - So 19.08.07 11:23
Sebastian, ich verstehe was du sagst, aber eben die Umsetzung im COde ganz oben gelingt mir nicht...
pVerts ist ja kein Array oder wie ist das ??
Irgendwie stelle ich mich zu blöd an :roll:
jaenicke - So 19.08.07 11:24
Ich habe den Code doch hingeschrieben ;-).
jaenicke hat folgendes geschrieben: |
In Delphi einfach Inc(pVerts); |
Lazarus - So 19.08.07 11:30
jaenicke,
oops, so einfach war das ??? :oops: Es funktioniert...
Danke euch allen :lol:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!