Also wie oben schon steht habe ich Probs mit selbsterstellten TBM-Modellen beim späteren "kompilieren" mit dem Octree-Compiler....
ich habe eine Loader für Davids Terrain-Editor geschrieben und dieser speichert direkt die Daten als TBM-File ab.
Das funktioniert auch soweit sehr gut; (das Modell wird korrekt wiedergegeben) nur wenn ich diesen erzeugten TBM-File dann mit dem Octree-Compiler "kompiliere" entsteht ein ziemlich zerfetztes Terrain, also Schrägen die es nicht gibt, Teile fehlen,....
Eigentlich komisch, dass der erzeugte TBM-File aber dennoch korrekt angezeigt wird...
naja habe hier mal die Methode die den TBM-File schreibt,
vielleicht kann mir ja jmd helfen
besonders verwirrend finde ich die Variable <dwNumVertices> in <tbModelEffectHeader>, denn als Beschreibung steht dort in der tbModel.h im Grunde "Anzahl der
Indices", wenn ich aber diese Zahl (oder +-1) verwende wird das TBM-Modell gar nicht mehr angezeigt; verwende ich die Anzahl der Vertices, dann schon....
|
Quellcode
|
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
|
/*******************************************************************/
// TBM-Datei erstellen
int GenerateTBMFile(char* pcFilename)
{
FILE* pFile;
tbModelChunkHeader CH;
tbModelVerticesChunkHeader VerticesCH;
tbModelIndicesChunkHeader IndicesCH;
tbModelEffectHeader EffectHdr;
DWORD dwEffectsDataSize;
// Datei öffnen
pFile = fopen(pcFilename, "wb");
if(pFile == NULL) return 1;
// Vertexdaten-Chunk schreiben
CH.ChunkType = TB_CT_MODEL_VERTICES;
CH.dwDataSize = sizeof(tbModelVerticesChunkHeader) + g_dwNumVertices * g_dwVertexSize;
VerticesCH.dwFVF = g_dwVertexFormat;
VerticesCH.dwVertexSize = g_dwVertexSize;
VerticesCH.fBoundingSphereRadius = g_fBoundingSphereRadius;
VerticesCH.vBoundingBoxMin = g_vBoundingBoxMin;
VerticesCH.vBoundingBoxMax = g_vBoundingBoxMax;
VerticesCH.dwNumVertices = g_dwNumVertices;
fwrite(&CH, sizeof(tbModelChunkHeader), 1, pFile);
fwrite(&VerticesCH, sizeof(tbModelVerticesChunkHeader), 1, pFile);
fwrite(g_bufVertex->GetBuffer(), g_dwVertexSize, g_dwNumVertices, pFile);
// Indexdaten-Chunk schreiben
CH.ChunkType = TB_CT_MODEL_INDICES;
CH.dwDataSize = sizeof(tbModelIndicesChunkHeader) + g_dwNumIndices * g_dwIndexSize;
IndicesCH.IndexFormat = g_dwIndexSize == 2 ? D3DFMT_INDEX16 : D3DFMT_INDEX32;
IndicesCH.dwIndexSize = g_dwIndexSize;
IndicesCH.dwNumIndices = g_dwNumIndices;
fwrite(&CH, sizeof(tbModelChunkHeader), 1, pFile);
fwrite(&IndicesCH, sizeof(tbModelIndicesChunkHeader), 1, pFile);
fwrite(g_bufIndex->GetBuffer(), g_dwIndexSize, g_dwNumIndices, pFile);
// Effekte-Chunk schreiben
DWORD dwNumEffects = 1;
dwEffectsDataSize = sizeof(DWORD);
dwEffectsDataSize += sizeof(tbModelEffectHeader);
dwEffectsDataSize += (DWORD)(strlen(g_acEffectCode));
CH.ChunkType = TB_CT_MODEL_EFFECTS;
CH.dwDataSize = dwEffectsDataSize;
fwrite(&CH, sizeof(tbModelChunkHeader), 1, pFile);
fwrite(&dwNumEffects, sizeof(DWORD), 1, pFile);
strcpy(EffectHdr.acName, "genEff");
EffectHdr.bAlphaBlended = FALSE;
EffectHdr.PrimitiveType = D3DPT_TRIANGLELIST;
EffectHdr.dwStartIndex = 0;
EffectHdr.dwNumPrimitives = (m_Terrain.iHeightMapRes-1)* (m_Terrain.iHeightMapRes-1) * 2;
EffectHdr.dwMinIndex = 0;
EffectHdr.dwNumVertices = g_dwNumVertices;//(m_Terrain.iHeightMapRes) * (m_Terrain.iHeightMapRes);
EffectHdr.dwEffectCodeSize = (DWORD)(strlen(g_acEffectCode));
fwrite(&EffectHdr, sizeof(tbModelEffectHeader), 1, pFile);
fwrite(g_acEffectCode, 1, EffectHdr.dwEffectCodeSize, pFile);
// Datei schließen
fclose(pFile);
return 0;
}
|
ansonsten poste ich gerne auch mal mehr vom Code oder stelle das Projekt zum Download bereit (wird der ein oder andere ja auch gebrauchen können)