Autor Beitrag
Lazarus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 19.08.07 04:05 
Original C-Code:

ausblenden volle Höhe 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

WinXP Pro SP2, WinVista x32
Delphi 7 Enterprise
BeitragVerfasst: So 19.08.07 06:09 
Hallo

schaue dir am besten mal

www.gamedev.net/comm....asp?topic_id=193846
oder
www.gamedev.net/comm...Reply.asp?id=2634070

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

Moderiert von user profile iconmatze: Links lesbar gemacht.
Lazarus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 19.08.07 11:05 
:cry: Ich verstehe das Stück mit dem pVerts++ einfach nicht....
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 19.08.07 11:24 
Ich habe den Code doch hingeschrieben ;-).
user profile iconjaenicke hat folgendes geschrieben:
In Delphi einfach Inc(pVerts);
Lazarus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 19.08.07 11:30 
jaenicke,
oops, so einfach war das ??? :oops: Es funktioniert...

Danke euch allen :lol: