diff options
-rw-r--r-- | src/tools/mesh_extractor/DBC.cpp | 2 | ||||
-rw-r--r-- | src/tools/mesh_extractor/LiquidHandler.cpp | 5 | ||||
-rw-r--r-- | src/tools/mesh_extractor/Utils.cpp | 75 | ||||
-rw-r--r-- | src/tools/mesh_extractor/Utils.h | 22 | ||||
-rw-r--r-- | src/tools/mesh_extractor/WorldModelGroup.cpp | 4 | ||||
-rw-r--r-- | src/tools/mesh_extractor/WorldModelRoot.cpp | 2 |
6 files changed, 60 insertions, 50 deletions
diff --git a/src/tools/mesh_extractor/DBC.cpp b/src/tools/mesh_extractor/DBC.cpp index eb3bed43fdb..1484864d7a3 100644 --- a/src/tools/mesh_extractor/DBC.cpp +++ b/src/tools/mesh_extractor/DBC.cpp @@ -21,7 +21,7 @@ DBC::DBC(Stream* stream) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true) { - stream->Read(4); // Read the magic "WDBC" + delete[] stream->Read(4); // Read the magic "WDBC" RecordCount = stream->Read<int>(); Records.reserve(RecordCount); diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp index ce9ea4fc84f..fa59d1bc7f0 100644 --- a/src/tools/mesh_extractor/LiquidHandler.cpp +++ b/src/tools/mesh_extractor/LiquidHandler.cpp @@ -113,5 +113,10 @@ void LiquidHandler::HandleNewLiquid() Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset + 2, vertOffset + 3, vertOffset + 1)); } } + + // At this stage, heights is no longer needed, so we deallocate it + for (int j = 0; j < 9; ++j) + delete[] heights[j]; + delete[] heights; } } diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp index 0591c121895..937de4b443a 100644 --- a/src/tools/mesh_extractor/Utils.cpp +++ b/src/tools/mesh_extractor/Utils.cpp @@ -219,7 +219,6 @@ void MapChunkHeader::Read(Stream* stream) AreaId = stream->Read<uint32>(); MapObjectRefs = stream->Read<uint32>(); Holes = stream->Read<uint32>(); - LowQualityTextureMap = new uint32[4]; stream->Read(LowQualityTextureMap, sizeof(uint32) * 4); PredTex = stream->Read<uint32>(); NumberEffectDoodad = stream->Read<uint32>(); @@ -233,8 +232,6 @@ void MapChunkHeader::Read(Stream* stream) void MHDR::Read(Stream* stream) { - int count = 0; - Flags = stream->Read<uint32>(); OffsetMCIN = stream->Read<uint32>(); OffsetMTEX = stream->Read<uint32>(); @@ -306,24 +303,20 @@ void ModelHeader::Read(Stream* stream) OffsetBoundingNormals = stream->Read<uint32>(); } -WorldModelHeader WorldModelHeader::Read(Stream* stream) +void WorldModelHeader::Read(Stream* stream) { - WorldModelHeader ret; - int count = 0; - ret.CountMaterials = stream->Read<uint32>(); - ret.CountGroups = stream->Read<uint32>(); - ret.CountPortals = stream->Read<uint32>(); - ret.CountLights = stream->Read<uint32>(); - ret.CountModels = stream->Read<uint32>(); - ret.CountDoodads = stream->Read<uint32>(); - ret.CountSets = stream->Read<uint32>(); - ret.AmbientColorUnk = stream->Read<uint32>(); - ret.WmoId = stream->Read<uint32>(); - ret.BoundingBox[0] = Vector3::Read(stream); - ret.BoundingBox[1] = Vector3::Read(stream); - ret.LiquidTypeRelated = stream->Read<uint32>(); - - return ret; + CountMaterials = stream->Read<uint32>(); + CountGroups = stream->Read<uint32>(); + CountPortals = stream->Read<uint32>(); + CountLights = stream->Read<uint32>(); + CountModels = stream->Read<uint32>(); + CountDoodads = stream->Read<uint32>(); + CountSets = stream->Read<uint32>(); + AmbientColorUnk = stream->Read<uint32>(); + WmoId = stream->Read<uint32>(); + BoundingBox[0] = Vector3::Read(stream); + BoundingBox[1] = Vector3::Read(stream); + LiquidTypeRelated = stream->Read<uint32>(); } DoodadInstance DoodadInstance::Read(Stream* stream) @@ -344,8 +337,9 @@ DoodadInstance DoodadInstance::Read(Stream* stream) DoodadSet DoodadSet::Read(Stream* stream) { DoodadSet ret; - - ret.Name = std::string(stream->Read(20), 20); + char* name = stream->Read(20); + ret.Name = std::string(name, 20); + delete[] name; ret.FirstInstanceIndex = stream->Read<uint32>(); ret.CountInstances = stream->Read<uint32>(); ret.UnknownZero = stream->Read<uint32>(); @@ -353,44 +347,41 @@ DoodadSet DoodadSet::Read(Stream* stream) return ret; } -LiquidHeader LiquidHeader::Read(Stream* stream) +void LiquidHeader::Read(Stream* stream) { - LiquidHeader ret; - ret.CountXVertices = stream->Read<uint32>(); - ret.CountYVertices = stream->Read<uint32>(); - ret.Width = stream->Read<uint32>(); - ret.Height = stream->Read<uint32>(); - ret.BaseLocation = Vector3::Read(stream); - ret.MaterialId = stream->Read<uint16>(); - - return ret; + CountXVertices = stream->Read<uint32>(); + CountYVertices = stream->Read<uint32>(); + Width = stream->Read<uint32>(); + Height = stream->Read<uint32>(); + BaseLocation = Vector3::Read(stream); + MaterialId = stream->Read<uint16>(); } -LiquidData LiquidData::Read(Stream* stream, LiquidHeader& header) +void LiquidData::Read(Stream* stream, LiquidHeader& header) { - LiquidData ret; - ret.HeightMap = new float*[header.CountXVertices]; + CountXVertices = header.CountXVertices; + Width = header.Width; + + HeightMap = new float*[header.CountXVertices]; for (uint32 i = 0; i < header.CountXVertices; ++i) - ret.HeightMap[i] = new float[header.CountYVertices]; + HeightMap[i] = new float[header.CountYVertices]; - ret.RenderFlags = new uint8*[header.Width]; + RenderFlags = new uint8*[header.Width]; for (uint32 i = 0; i < header.Width; ++i) - ret.RenderFlags[i] = new uint8[header.Height]; + RenderFlags[i] = new uint8[header.Height]; for (uint32 y = 0; y < header.CountYVertices; y++) { for (uint32 x = 0; x < header.CountXVertices; x++) { stream->Read<uint32>(); // Dummy value - ret.HeightMap[x][y] = stream->Read<float>(); + HeightMap[x][y] = stream->Read<float>(); } } for (uint32 y = 0; y < header.Height; y++) for (uint32 x = 0; x < header.Width; x++) - ret.RenderFlags[x][y] = stream->Read<uint8>(); - - return ret; + RenderFlags[x][y] = stream->Read<uint8>(); } H2ORenderMask H2ORenderMask::Read(Stream* stream) diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h index 87b6a40582a..00f89f717c4 100644 --- a/src/tools/mesh_extractor/Utils.h +++ b/src/tools/mesh_extractor/Utils.h @@ -102,7 +102,7 @@ public: uint32 AreaId; uint32 MapObjectRefs; uint32 Holes; - uint32* LowQualityTextureMap; + uint32 LowQualityTextureMap[4]; uint32 PredTex; uint32 NumberEffectDoodad; uint32 OffsetMCSE; @@ -208,7 +208,7 @@ public: Vector3 BoundingBox[2]; uint32 LiquidTypeRelated; - static WorldModelHeader Read(Stream* stream); + void Read(Stream* stream); }; class DoodadInstance @@ -251,22 +251,36 @@ public: Vector3 BaseLocation; uint16 MaterialId; - static LiquidHeader Read(Stream* stream); + void Read(Stream* stream); }; class LiquidData { public: LiquidData() {} + + ~LiquidData() + { + for (uint32 i = 0; i < CountXVertices; ++i) + delete[] HeightMap[i]; + delete[] HeightMap; + + for (uint32 i = 0; i < Width; ++i) + delete[] RenderFlags[i]; + delete[] RenderFlags; + } + float** HeightMap; uint8** RenderFlags; + uint32 CountXVertices; + uint32 Width; bool ShouldRender(int x, int y) { return RenderFlags[x][y] != 0x0F; } - static LiquidData Read(Stream* stream, LiquidHeader& header); + void Read(Stream* stream, LiquidHeader& header); }; class H2ORenderMask diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp index 2e4d31086b2..2864edb23f2 100644 --- a/src/tools/mesh_extractor/WorldModelGroup.cpp +++ b/src/tools/mesh_extractor/WorldModelGroup.cpp @@ -70,8 +70,8 @@ void WorldModelGroup::ReadLiquid() HasLiquidData = true; Stream* stream = chunk->GetStream(); - LiquidDataHeader = LiquidHeader::Read(stream); - LiquidDataGeometry = LiquidData::Read(stream, LiquidDataHeader); + LiquidDataHeader.Read(stream); + LiquidDataGeometry.Read(stream, LiquidDataHeader); } void WorldModelGroup::ReadVertices() diff --git a/src/tools/mesh_extractor/WorldModelRoot.cpp b/src/tools/mesh_extractor/WorldModelRoot.cpp index 360a8dfed59..32ff2923c75 100644 --- a/src/tools/mesh_extractor/WorldModelRoot.cpp +++ b/src/tools/mesh_extractor/WorldModelRoot.cpp @@ -92,5 +92,5 @@ void WorldModelRoot::ReadHeader() return; Stream* stream = chunk->GetStream(); - Header = WorldModelHeader::Read(stream); + Header.Read(stream); } |