Ich versuche seit einigen Tagen einen Exporter für MilkShape3D zu schreiben. Das klappte auch schnell sehr gut, doch bei grösseren Objekten traten Probleme beim Darstellen in der Engine auf (es wurden nur Teile des Objektes gerendert).
Daraufhin habe ich ein kleine Programm geschrieben, das alle Wert ausliest und per MessageBox ausgibt und habe festgestellt das die Indices ab einem bestimmten (von Modell zu Modell unterschiedlichen) Punkt -12851 betragen.
Danach habe ich beim Exporter eine MessageBox eingefügt, die die Indices unmittelbar vor dem Speichern ausgibt und da sind alle noch in Ordnung.
Der Fehler passiert aber irgendo zwischen Speichern und Lesen was ich mir nicht so recht erklären kann.
Ich weiss jetzt nicht welcher Teil des Codes für den Fehler verantwortlich ist, also poste ich hier den kompletten Kern des Exports (so lange ist er aber gar nicht):
|
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
for (i = 0; i < msModel_GetMeshCount (pModel); i++)
{
msMesh *pMesh = msModel_GetMeshAt (pModel, i);
HFListElement<HFVertex> *VertexElement;
HFList<HFVertex> VertexList;
HFList<SHORT> IndexList;
//Daten sammeln
for (j = 0; j < msMesh_GetTriangleCount (pMesh); j++)
{
msTriangle *pTriangle = msMesh_GetTriangleAt (pMesh, j);
word nIndices[3];
word nNormalIndices[3];
msTriangle_GetVertexIndices (pTriangle, nIndices);
msTriangle_GetNormalIndices (pTriangle, nNormalIndices);
for(v=0; v<3; v++)
{
msVertex *pVertex = msMesh_GetVertexAt(pMesh, nIndices[v]);
msVec3 Position;
msVec3 Normal;
msVec2 Texture;
SHORT Index;
msVertex_GetVertex(pVertex, Position);
msVertex_GetTexCoords(pVertex, Texture);
msMesh_GetVertexNormalAt(pMesh, nNormalIndices[v], Normal);
HFVertex SVertex;
SVertex.Position[0] = Position[0];
SVertex.Position[1] = Position[1];
SVertex.Position[2] = Position[2];
SVertex.Texture[0] = Texture[0];
SVertex.Texture[1] = Texture[1];
SVertex.Normal[0] = Normal[0];
SVertex.Normal[1] = Normal[1];
SVertex.Normal[2] = Normal[2];
VertexElement = VertexList.Search(VertexSearchFunc, &SVertex);
if(VertexElement==NULL)
{
Index = VertexList.GetElementCount();
VertexList.AddElement(&SVertex);
}
else
Index = VertexList.GetElementNumByPointer(VertexElement);
IndexList.AddElement(&Index);
}
}
//Daten schreiben
UINT VertexCount = VertexList.GetElementCount();
UINT IndexCount = IndexList.GetElementCount();
fwrite(&VertexCount, 4, 1, file);
for(j=0; j<VertexList.GetElementCount(); j++)
fwrite(VertexList.GetElementDataByInt(j), 32, 1, file);
fwrite(&IndexCount, 4, 1, file);
for(j=0; j<IndexList.GetElementCount(); j++)
fwrite(IndexList.GetElementDataByInt(j), 2, 1, file);
//Listen löschen
VertexList.Clear();
IndexList.Clear();
}
|
Der Code wurde teilweise aus den Beispiel-Exportern des MilkShape-SDKs geholt. (Das habe ich jetzt gesagt um alle Nöregleien am Codestyle, wie "Alle Variablen werden am Anfang der Funktion definiert", von mir weisen zu können
)
Einige Erklärungen zur Funktionsweise:
-Bei MilkShape liegen die Normalenvektoren pro Index vor und nicht pro Vertex. Deshalb die ganzen Umformungen über Listen. Mein Format ist schlussendlich so aufgebaut, dass man in der Engine nichts mehr umrechnen muss, sondern dass die Daten alle schon in der passenden Form vorliegen.
-HFList ist meine eigene Listenklasse und die hat bisher immer funktioniert
-VectorSearchFunc ist eine Funktion die TRUE zurückliefert wenn die 2 Vertices identisch sind
Ich hoffe das reicht, damit hier jemand den Fehler findet :?