void WorldModelHandler::ProcessInternal( MapChunk* mcnk ) { if (!IsSane()) return; uint32 refCount = mcnk->Header.MapObjectRefs; FILE* stream = mcnk->Source->GetStream(); fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET); // Start looping at the last Doodad Ref index for (uint32 i = mcnk->Header.DoodadRefs; i < refCount; i++) { int32 index; if (fread(&index, sizeof(int32), 1, stream) != 1) printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n"); if (index < 0 || uint32(index) >= _definitions->size()) continue; WorldModelDefinition wmo = (*_definitions)[index]; if (_drawn.find(wmo.UniqueId) != _drawn.end()) continue; _drawn.insert(wmo.UniqueId); if (wmo.MwidIndex >= _paths->size()) continue; std::string path = (*_paths)[wmo.MwidIndex]; WorldModelRoot* model = Cache->WorldModelCache.Get(path); if (!model) { model = new WorldModelRoot(path); Cache->WorldModelCache.Insert(path, model); } Vertices.reserve(1000); Triangles.reserve(1000); InsertModelGeometry(Vertices, Triangles, wmo, model); } // Restore the stream position fseek(stream, mcnk->Source->Offset, SEEK_SET); }
void DoodadHandler::ProcessInternal( MapChunk* mcnk ) { if (!IsSane()) return; uint32 refCount = mcnk->Header.DoodadRefs; FILE* stream = mcnk->Source->GetStream(); fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET); for (uint32 i = 0; i < refCount; i++) { int32 index; int32 count; if ((count = fread(&index, sizeof(int32), 1, stream)) != 1) printf("DoodadHandler::ProcessInternal: Failed to read some data expected 1, read %d\n", count); if (index < 0 || uint32(index) >= _definitions->size()) continue; DoodadDefinition doodad = (*_definitions)[index]; if (_drawn.find(doodad.UniqueId) != _drawn.end()) continue; _drawn.insert(doodad.UniqueId); if (doodad.MmidIndex >= _paths->size()) continue; std::string path = (*_paths)[doodad.MmidIndex]; Model* model = Cache->ModelCache.Get(path); if (!model) { model = new Model(path); Cache->ModelCache.Insert(path, model); } if (!model->IsCollidable) continue; Vertices.reserve(refCount * model->Vertices.size() * 0.2); Triangles.reserve(refCount * model->Triangles.size() * 0.2); InsertModelGeometry(doodad, model); } // Restore the stream position fseek(stream, mcnk->Source->Offset, SEEK_SET); }
void WorldModelHandler::ProcessInternal( ChunkedData* subChunks ) { if (!IsSane()) return; Chunk* wmoReferencesChunk = subChunks->GetChunkByName("MCRW"); if (!wmoReferencesChunk) return; FILE* stream = wmoReferencesChunk->GetStream(); uint32 refCount = wmoReferencesChunk->Length / 4; for (uint32 i = 0; i < refCount; i++) { int32 index; if (fread(&index, sizeof(int32), 1, stream) != 1) printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n"); if (index < 0 || uint32(index) >= _definitions->size()) continue; WorldModelDefinition wmo = (*_definitions)[index]; if (_drawn.find(wmo.UniqueId) != _drawn.end()) continue; _drawn.insert(wmo.UniqueId); if (wmo.MwidIndex >= _paths->size()) continue; std::string path = (*_paths)[wmo.MwidIndex]; WorldModelRoot* model = Cache->WorldModelCache.Get(path); if (!model) { model = new WorldModelRoot(path); Cache->WorldModelCache.Insert(path, model); } Vertices.reserve(1000); Triangles.reserve(1000); InsertModelGeometry(Vertices, Triangles, wmo, model); } }
void WorldModelHandler::ProcessInternal( MapChunk* mcnk ) { if (!IsSane()) return; uint32 refCount = mcnk->Header.MapObjectRefs; Stream* stream = mcnk->Source->GetStream(); stream->Seek(mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET); // Start looping at the last Doodad Ref index for (uint32 i = mcnk->Header.DoodadRefs; i < refCount; i++) { int32 index = stream->Read<int32>(); if (index < 0 || uint32(index) >= _definitions->size()) continue; WorldModelDefinition wmo = (*_definitions)[index]; if (_drawn.find(wmo.UniqueId) != _drawn.end()) continue; _drawn.insert(wmo.UniqueId); if (wmo.MwidIndex >= _paths->size()) continue; std::string path = (*_paths)[wmo.MwidIndex]; WorldModelRoot const* model = Cache->WorldModelCache.Get(path); Vertices.reserve(1000); Triangles.reserve(1000); InsertModelGeometry(Vertices, Triangles, wmo, model); } // Restore the stream position stream->Seek(mcnk->Source->Offset, SEEK_SET); }