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
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
bool E_CModel::Load(char* pcFilename, char* pcTexturePrefix, char* pcTexturePostfix, D3DPOOL VBPool, // = D3DPOOL_DEFAULT DWORD dwVBUsage, // = 0 D3DPOOL IBPool, // = D3DPOOL_DEFAULT DWORD dwIBUsage) // = 0 { E_SModelChunkHeader ChunkHeader; E_SModelIndicesChunkHeader IndexChunk; E_SModelVerticesChunkHeader VertexChunk; void* m_pBuffer; void* pVertices; DWORD dwFirstVertex; DWORD dwLastVertex; __int64 pos; FILE* pFile; Exit(); if(pcFilename == NULL) return false; pFile = fopen(pcFilename, "r"); if(pFile == NULL) return false; while(!feof(pFile)) { // Chunk Header lesen fread(&ChunkHeader, sizeof(E_SModelChunkHeader), 1, pFile); g_CLog.TextPara("ChunkType: %d", ChunkHeader.ChunkType); g_CLog.TextPara("ChunkSize: %d", ChunkHeader.dwDataSize); switch(ChunkHeader.ChunkType) { case E_CT_MODEL_VERTICES: g_CLog.Info("VertexDatenChunk wird gelesen..."); fgetpos(pFile, &pos); g_CLog.Info("POSITION BEFORE VCHUNK READING: %d.", pos); fread(&VertexChunk, sizeof(E_SModelVerticesChunkHeader), 1, pFile); fgetpos(pFile, &pos); g_CLog.Info("POSITION AFTER VCHUNK READING: %d.", pos); m_dwFVF = VertexChunk.dwFVF; m_dwNumVertices = VertexChunk.dwNumVertices; m_fBoundingSphereRadius = VertexChunk.fBoundingSphereRadius; m_vBoundingBoxMin = VertexChunk.vBoundingBoxMin; m_vBoundingBoxMax = VertexChunk.vBoundingBoxMax; g_CLog.TextPara("NumVertices: %d", m_dwNumVertices); g_CLog.TextPara("SizeOf VertexChunk: %d", sizeof(E_SModelVerticesChunkHeader)); g_CLog.TextPara("VertexSize: %d", VertexChunk.dwVertexSize); g_CLog.TextPara("Sizeof all VertexData: %d", VertexChunk.dwVertexSize * m_dwNumVertices); // Vertex Buffer erstellen if(FAILED(GetD3DDevice()->CreateVertexBuffer(VertexChunk.dwNumVertices * VertexChunk.dwVertexSize, dwVBUsage, VertexChunk.dwFVF, VBPool, &m_pVertexBuffer, NULL))) { g_CLog.Error("Fehler beim Erstellen des Vertex Buffers!"); return false; } dwFirstVertex = 0; dwLastVertex = VertexChunk.dwNumVertices - 1; m_pBuffer = ::operator new(VertexChunk.dwNumVertices * VertexChunk.dwVertexSize); fgetpos(pFile, &pos); g_CLog.Info("POSITION BEFORE VERTEX READING: %d.", pos); // Die Vertex Daten lesen, hier msus ein fehler sein fread(m_pBuffer, VertexChunk.dwNumVertices * VertexChunk.dwVertexSize, 1, pFile); fgetpos(pFile, &pos); g_CLog.Info("POSITION AFTER READING: %d.", pos); g_CLog.TextPara("BufferSize: %d", &m_pBuffer); // Den Vertex-Buffer sperren. // Die Sperrflags sind 0 bei statischen Vertex-Buffern und // D3DLOCK_DISCARD bei dynamischen. if(FAILED(m_pVertexBuffer->Lock(0, (dwLastVertex - dwFirstVertex + 1) * VertexChunk.dwVertexSize, &pVertices, (dwVBUsage & D3DUSAGE_DYNAMIC) ? D3DLOCK_DISCARD : 0))) { // Fehler beim Sperren! g_CLog.Error("Fehler beim Sperren des Vertex Buffers!"); return false; } // Die Daten in den Puffer kopieren memcpy(pVertices, (BYTE*)(m_pBuffer) + dwFirstVertex * VertexChunk.dwVertexSize, (dwLastVertex - dwFirstVertex + 1) * VertexChunk.dwVertexSize); // Vertex-Buffer entsperren m_pVertexBuffer->Unlock(); SAFE_DELETE_ARRAY(m_pBuffer); g_CLog.Info("VertexDatenChunk fertig gelesen."); break; case E_CT_MODEL_INDICES: g_CLog.Info("IndexDatenChunk"); break; case E_CT_MODEL_EFFECTS: g_CLog.Info("EffektDatenChunk"); break; default: if(fseek(pFile, ChunkHeader.dwDataSize, SEEK_CUR) != 0) { g_CLog.Error("Fehler beim Überspringen eines Chunks"); g_CLog.TextPara("%d", ChunkHeader.ChunkType); return false; } else g_CLog.TextPara("%d", ChunkHeader.ChunkType); break; } } fclose(pFile); return true; |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 |
ChunkType: 0 ChunkSize: 39752 > INFO VertexDatenChunk wird gelesen... > INFO POSITION BEFORE VCHUNK READING: 3592. > INFO POSITION AFTER VCHUNK READING: 3632. NumVertices: 1241 SizeOf VertexChunk: 40 VertexSize: 32 Sizeof all VertexData: 39712 > INFO POSITION BEFORE VERTEX READING: 3632. > INFO POSITION AFTER READING: 40960. |