Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Haxx0r

Treue Seele

  • »Haxx0r« ist der Autor dieses Themas

Beiträge: 209

Wohnort: Da!

Beruf: Rebell mit aktivem Lebensstil

  • Private Nachricht senden

1

04.09.2008, 06:36

In Objekt wird ohne offset gespeichert

Aloa,
so ich versteh da was nicht. Erstmal, es geht um den MD2-Modelloader
und für beispielsweise Skins, Triangles, TexCoords gibt es offset's, die bestimmen die Position im File, nun sind wir bei den Frames, nur da
wird nur das Objekt von MD2_Vertex gelesen und in ihm gespeichert.
Noch mal zum Vergleich, beim Offset:

C-/C++-Quelltext

1
2
3
4
5
fseek(ModelFile, m_pHeader->offsetTexCoords, SEEK_SET);
        for(int nTexCoord=0;nTexCoord < m_pHeader->offsetTexCoords; nTexCoord++)
        {
            fread(&m_pTexCoords,1, sizeof(MD2_TexCoord), ModelFile);
        }

Und jetzt die Speicherung die ich nicht verstehe (Ohne Offset!):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for(int nFrameID=0; nFrameID < m_pHeader->numFrames; nFrameID++)
    {
        fread(&m_pFrames[nFrameID],1, sizeof(MD2_Frame), ModelFile);

        m_pFrameData[nFrameID].pVertices = new MD2_Vertex[m_pHeader->numVertices];

//Jetzt kommt der Teil ohne Offset's

        for(int nVert=0;nVert < m_pHeader->numVertices;nVert++)
        {
            MD2_Vertex TempVertx;

            fread(&TempVertx,1, sizeof(MD2_Header), ModelFile);
            m_pFrameData[nFrameID].pVertices[nVert] = TempVertx;
        }
    }

Naja, wie gesagt, ich verstehe es einfach nicht. Was wird da im
Objekt 'TempVertx' genau gespeichert und woher weiss das
Programm welche Stelle da gesucht wird?
Hoffentlich versteht mich einer, ansonsten vielen Dank im Voraus!

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

04.09.2008, 07:17

Vorweg: ich kenne das MD2_Model-Format nicht selbst, darum kann ich nur was über die technischen Hintergründe der I/O Operationen sagen.

Du wirst schon davon ausgehen können, dass es auch für die Frames einen Offset gibt, aber man muss nur dann mit fseek in der Datei herumspringen, wenn man sie nicht linear von vorne bis hinten einlesen will.

Konkret: beim Lesen aus einer Datei wird ein Index verwaltet, der die aktuelle Leseposition speichert. Diesen Index kann man mit einem seek an eine andere Stelle in der Datei verbiegen. Wenn ich dann eine gewisse Zahl von Bytes gelesen habe, wird auch dieser Zeiger entsprechend weitergesetzt.

Sprich: Wenn ich schon an der richtigen Leseposition bin, brauche ich auch kein seek. Dieses weitersetzten ist auch der Grund, warum man die vorhandenen Vertices nacheinander einlesen kann. Ob die Position in deinem Fall stimmt, kann man nur dann bewerten, wenn man den gesamten Ladekomplex anschaut.


Sonst würde ich behaupten, dass in der Ladeschleife der MD2_TexCoords Bugs enthalten sind.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Verbiegt den Lesezeiger in der Datei.

fseek(ModelFile, m_pHeader->offsetTexCoords, SEEK_SET); 

#if 0
        for(int nTexCoord=0;nTexCoord < m_pHeader->offsetTexCoords; nTexCoord++) 
        { 
            // immer an die selbe Stelle ...

            fread(&m_pTexCoords,1, sizeof(MD2_TexCoord), ModelFile); 
        }
#else
        // Lieber nur die Anzahl lesen, sonst werden es viel zu viele. Ausserdem muss evtl. auch noch das Array angefordert werden.

        m_pTexCoords = new MD2_TexCoord[m_pHeader->numTexCoords];
        for(int nTexCoord=0;nTexCoord < m_pHeader->numTexCoords; nTexCoord++) 
        { 
            // Array von Koordinaten füllen ...

            fread (&(m_pTextCoords[nTextCoord]), 1, sizeof (MD2_TexCoord), ModelFile);
        }
#endif

Das habe ich aber in Unkenntnis des Formats nur aus der Schleife für die Frames abgeleitet.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Haxx0r

Treue Seele

  • »Haxx0r« ist der Autor dieses Themas

Beiträge: 209

Wohnort: Da!

Beruf: Rebell mit aktivem Lebensstil

  • Private Nachricht senden

3

04.09.2008, 07:26

Also ich glaub ich versteh da was nicht ganz, dann wäre es ja sogesehen Zufall welchen Teil des Indexes ich gerade einlese... :?:

Komplette Ladeschleife:

C-/C++-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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    m_pHeader = new MD2_Header;

    fread(&m_pHeader,1,sizeof(MD2_Header), ModelFile);

    m_pTriangles = new MD2_Triangle[m_pHeader->numTriangles];
    m_pTexCoords = new MD2_TexCoord[m_pHeader->numTexCoords];
    m_pGLCmdVertices = new MD2_GlCommandVertex[m_pHeader->numGlCommands];
    m_pFrames = new MD2_Frame[m_pHeader->numFrames];
    m_pFrameData = new MD2_FrameData[m_pHeader->numFrames];
    m_pSkins = new MD2_Skin[m_pHeader->numSkins];

    fseek(ModelFile, m_pHeader->offsetFrames, SEEK_SET);
    for(int nFrameID=0; nFrameID < m_pHeader->numFrames; nFrameID++)
    {
        fread(&m_pFrames[nFrameID],1, sizeof(MD2_Frame), ModelFile);

        m_pFrameData[nFrameID].pVertices = new MD2_Vertex[m_pHeader->numVertices];

        for(int nVert=0;nVert < m_pHeader->numVertices;nVert++)
        {
            MD2_Vertex TempVertx;

            fread(&TempVertx,1, sizeof(MD2_Header), ModelFile);
            m_pFrameData[nFrameID].pVertices[nVert] = TempVertx;
        }
    }

        fseek(ModelFile, m_pHeader->numTriangles, SEEK_SET);
        for(int nPoly=0;nPoly < m_pHeader->numTriangles; nPoly++)
        {
            fread(&m_pTriangles[nPoly],1, sizeof(MD2_Triangle), ModelFile);
        }

        fseek(ModelFile, m_pHeader->offsetTexCoords, SEEK_SET);
        for(int nTexCoord=0;nTexCoord < m_pHeader->offsetTexCoords; nTexCoord++)
        {
            fread(&m_pTexCoords,1, sizeof(MD2_TexCoord), ModelFile);
        }

        fseek(ModelFile, m_pHeader->numSkins, SEEK_SET);
        for(int nSkins=0; nSkins < m_pHeader->numSkins; nSkins++)
        {
            fread(&m_pSkins, 1, sizeof(MD2_Skin), ModelFile);
        }

        fseek(ModelFile, m_pHeader->numGlCommands, SEEK_SET);
        for(int nGlCommands=0; nGlCommands < m_pHeader->numGlCommands; nGlCommands++)
        {
            fread(&m_pGLCmdVertices, 1, sizeof(MD2_GlCommandVertex), ModelFile);
        }

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

04.09.2008, 09:15

Du springst doch zum Offset der Frames:

C-/C++-Quelltext

1
fseek(ModelFile, m_pHeader->offsetFrames, SEEK_SET); 


Die Schleifen um deine Leseoperationen kannst du dir übrigens zum Großteil sparen. Der dritte Parameter von fread gibt an wie viel Elemente eingelesen werden sollen, z.B.:

C-/C++-Quelltext

1
fread(&m_pTriangles[nPoly],sizeof(MD2_Triangle),m_pHeader->numTriangles, ModelFile);  


Abgesehen davon hat der Code noch ein paar Bugs (man beachte die Abbruchbedingung):

C-/C++-Quelltext

1
for(int nTexCoord=0;nTexCoord < m_pHeader->offsetTexCoords; nTexCoord++) 
@D13_Dreinig

Haxx0r

Treue Seele

  • »Haxx0r« ist der Autor dieses Themas

Beiträge: 209

Wohnort: Da!

Beruf: Rebell mit aktivem Lebensstil

  • Private Nachricht senden

5

04.09.2008, 13:24

Nee nee nee,...die Frames selber haben ein offset-das ist klar.
Aber numVertices, sprich diese Ladeschleife:

C-/C++-Quelltext

1
2
3
4
5
6
7
        for(int nVert=0;nVert < m_pHeader->numVertices;nVert++)
        {
            MD2_Vertex TempVertx;

            fread(&TempVertx,1, sizeof(MD2_Header), ModelFile);
            m_pFrameData[nFrameID].pVertices[nVert] = TempVertx;
        }


Das Objekt von MD2_Vertex wird zur Speicherung genutzt, doch was genau wird das jetzt überhaupt gespeichert? Ich verstehe den Sinn davon nicht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

04.09.2008, 13:35

Der Weg über TempVertx ist nicht unbedingt notwendig. Funktionieren würde auch:

C-/C++-Quelltext

1
fread( &m_pFrameData[ nFrameID ].pVertices[ nVert ], sizeof( MD2_Vertex ), 1, ModelFile );


Übrigens sollte es wohl sizeof( MD2_Vertex ), nicht sizeof( MD2_Header ) heissen. An dieser Stelle.
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

04.09.2008, 13:35

Zitat von »"Haxx0r"«


C-/C++-Quelltext

1
2
3
// ...

fread(&TempVertx,1, sizeof(MD2_Header), ModelFile); 
// ...



hast du für deine structs da auch das padding ausgeschaltet? sonst könnte das probleme geben...

Haxx0r

Treue Seele

  • »Haxx0r« ist der Autor dieses Themas

Beiträge: 209

Wohnort: Da!

Beruf: Rebell mit aktivem Lebensstil

  • Private Nachricht senden

8

04.09.2008, 13:47

Ich wäre erstmal Froh, wenn mir erstmal meine Frage beantwortet
werden würde, padding interessiert mich jetzt noch nicht wirklich.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

04.09.2008, 13:49

Zitat von »"Haxx0r"«

Ich wäre erstmal Froh, wenn mir erstmal meine Frage beantwortet
werden würde, padding interessiert mich jetzt noch nicht wirklich.


Hab ich doch?!
@D13_Dreinig

Haxx0r

Treue Seele

  • »Haxx0r« ist der Autor dieses Themas

Beiträge: 209

Wohnort: Da!

Beruf: Rebell mit aktivem Lebensstil

  • Private Nachricht senden

10

04.09.2008, 14:02

@David
Du bist auf die Frames eingegangen, meine Frage hat sich auf die Objektspeicherung bezogen.

C-/C++-Quelltext

1
fread(&TempVertx,1, sizeof(MD2_Header), ModelFile); 

Werbeanzeige