aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2013-12-29 18:19:33 -0500
committerSubv <subv2112@gmail.com>2013-12-29 18:19:33 -0500
commit55936274e9cdf3d985588ecbae1c9845a1a9705e (patch)
tree53e6c4ccbf30fded043cce9aa091f892b8eedc36
parentd30eecf4e4b7766b7f46b9ca3f0c6741b08d79af (diff)
Fixed a few memory leaks.
-rw-r--r--src/tools/mesh_extractor/DBC.cpp2
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.cpp5
-rw-r--r--src/tools/mesh_extractor/Utils.cpp75
-rw-r--r--src/tools/mesh_extractor/Utils.h22
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.cpp4
-rw-r--r--src/tools/mesh_extractor/WorldModelRoot.cpp2
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);
}