aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/mesh_extractor/ADT.cpp5
-rw-r--r--src/tools/mesh_extractor/ChunkedData.cpp2
-rw-r--r--src/tools/mesh_extractor/Geometry.cpp4
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.cpp26
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.h1
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.cpp4
6 files changed, 38 insertions, 4 deletions
diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp
index 39b600d21b7..ee7e1b12b44 100644
--- a/src/tools/mesh_extractor/ADT.cpp
+++ b/src/tools/mesh_extractor/ADT.cpp
@@ -33,6 +33,11 @@ ADT::ADT( std::string file, int x, int y ) : ObjectData(NULL), Data(NULL), HasOb
ADT::~ADT()
{
+ // Temporarily delete the underlying streams, they are guaranteed to be different
+ // @TODO: Remove this code once the ChunkedData destructor properly releases _Stream
+ delete ObjectData->_Stream;
+ delete Data->_Stream;
+
delete ObjectData;
delete Data;
diff --git a/src/tools/mesh_extractor/ChunkedData.cpp b/src/tools/mesh_extractor/ChunkedData.cpp
index a3c3ec4b92c..8237449191a 100644
--- a/src/tools/mesh_extractor/ChunkedData.cpp
+++ b/src/tools/mesh_extractor/ChunkedData.cpp
@@ -85,7 +85,7 @@ ChunkedData::~ChunkedData()
delete *itr;
Chunks.clear();
- /* WorldModelGroup Data and SubData share the same _Stream so it's deleted twice and it crahes
+ /* WorldModelGroup Data and SubData share the same _Stream so it's deleted twice and it crashes
if (_Stream)
delete _Stream;*/
}
diff --git a/src/tools/mesh_extractor/Geometry.cpp b/src/tools/mesh_extractor/Geometry.cpp
index a11dda85659..62a10a65c16 100644
--- a/src/tools/mesh_extractor/Geometry.cpp
+++ b/src/tools/mesh_extractor/Geometry.cpp
@@ -20,6 +20,7 @@
#include "ADT.h"
#include "WorldModelHandler.h"
#include "DoodadHandler.h"
+#include "LiquidHandler.h"
#include <limits.h>
Geometry::Geometry() : Transform(false)
@@ -142,5 +143,8 @@ void Geometry::AddAdt( ADT* adt )
if (!adt->_WorldModelHandler->Triangles.empty())
AddData(adt->_WorldModelHandler->Vertices, adt->_WorldModelHandler->Triangles);
+
+ if (!adt->_LiquidHandler->Triangles.empty())
+ AddData(adt->_LiquidHandler->Vertices, adt->_LiquidHandler->Triangles);
}
diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp
index 6800cb773f7..7d93275f283 100644
--- a/src/tools/mesh_extractor/LiquidHandler.cpp
+++ b/src/tools/mesh_extractor/LiquidHandler.cpp
@@ -21,6 +21,7 @@
LiquidHandler::LiquidHandler( ADT* adt ) : Source(adt)
{
HandleNewLiquid();
+ HandleOldLiquid();
}
LiquidHandler::~LiquidHandler()
@@ -66,7 +67,7 @@ void LiquidHandler::HandleNewLiquid()
}
H2ORenderMask renderMask;
- if (information.LiquidType != 2)
+ if (information.LiquidType != 2 && information.LiquidType != 6 && information.LiquidType != 10) // Skip Ocean, Slow Ocean and Fast Ocean
{
stream->Seek(chunk->Offset + h.OffsetRender, SEEK_SET);
renderMask = H2ORenderMask::Read(stream);
@@ -123,13 +124,21 @@ void LiquidHandler::HandleNewLiquid()
{
case 1: // Water
case 2: // Ocean
+ case 5: // Slow Water
+ case 6: // Slow Ocean
+ case 9: // Fast Water
+ case 10: // Fast Ocean
default:
type = Constants::TRIANGLE_TYPE_WATER;
break;
- case 3:
+ case 3: // Magma
+ case 7: // Slow Magma
+ case 11: // Fast Magma
type = Constants::TRIANGLE_TYPE_MAGMA;
break;
- case 4:
+ case 4: // Slime
+ case 8: // Slow Slime
+ case 12: // Fast Slime
type = Constants::TRIANGLE_TYPE_SLIME;
break;
}
@@ -140,3 +149,14 @@ void LiquidHandler::HandleNewLiquid()
}
}
}
+
+void LiquidHandler::HandleOldLiquid()
+{
+ for (uint32 i = 0; i < 256; ++i)
+ {
+ MapChunk* mapChunk = Source->MapChunks[i];
+ if (!mapChunk->Header.OffsetMCLQ || mapChunk->Header.SizeMCLQ <= 8)
+ continue;
+ printf("Found old liquid");
+ }
+}
diff --git a/src/tools/mesh_extractor/LiquidHandler.h b/src/tools/mesh_extractor/LiquidHandler.h
index 2bb503cc7e7..d7f493e2719 100644
--- a/src/tools/mesh_extractor/LiquidHandler.h
+++ b/src/tools/mesh_extractor/LiquidHandler.h
@@ -35,5 +35,6 @@ public:
std::vector<MCNKLiquidData*> MCNKData;
private:
void HandleNewLiquid();
+ void HandleOldLiquid();
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp
index 57d1126a239..3e16894ced6 100644
--- a/src/tools/mesh_extractor/WorldModelGroup.cpp
+++ b/src/tools/mesh_extractor/WorldModelGroup.cpp
@@ -39,6 +39,10 @@ WorldModelGroup::WorldModelGroup(Stream* stream, std::string path, int groupInde
WorldModelGroup::~WorldModelGroup()
{
+ // Temporarily delete the underlying stream, it is the same pointer for both Data and SubData.
+ // @TODO: Remove this code once the ChunkedData destructor properly releases _Stream
+ delete Data->_Stream;
+
delete Data;
delete SubData;
delete[] MOBA;