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 user profile iconmatze: Code- durch Delphi-Tags ersetzt


Kurzer_18 - So 19.08.07 06:09

Hallo

schaue dir am besten mal

http://www.gamedev.net/community/forums/topic.asp?topic_id=193846
oder
http://www.gamedev.net/community/forums/ViewReply.asp?id=2634070

An.. vielleicht hilft es dir ja ein stück weiter!

Moderiert von user profile iconmatze: Links lesbar gemacht.


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

user profile iconjaenicke 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:

Quelltext
1:
2:
E1   E2   E3   E4   E5
^

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:

Quelltext
1:
2:
E1   E2   E3   E4   E5
     ^

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 ;-).
user profile iconjaenicke 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: