aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastian Valle <s.v.h21@hotmail.com>2013-09-29 02:04:55 -0500
committerSebastian Valle <s.v.h21@hotmail.com>2013-09-29 02:05:28 -0500
commita68c29e15c83bc7be1910083b26d152e2a6c80b3 (patch)
treedfd5e259bedaae1d1a767c13fcea52c693b2b7ca /src
parent7ca6f56a065a666fc605d2fa402a2eea14bc40c0 (diff)
Tools/MeshExtractor: Fixed a lot of stuff, finally made the Doodads render, the WMO's have been disabled for now.
ToDo: * Fix the doodads positions. * Review and re-implement some code. P.D: Help me please.
Diffstat (limited to 'src')
-rw-r--r--src/tools/mesh_extractor/ADT.cpp6
-rw-r--r--src/tools/mesh_extractor/ADT.h5
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.cpp4
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.cpp40
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.h2
-rw-r--r--src/tools/mesh_extractor/Geometry.cpp4
-rw-r--r--src/tools/mesh_extractor/MPQ.cpp8
-rw-r--r--src/tools/mesh_extractor/MPQManager.cpp7
-rw-r--r--src/tools/mesh_extractor/MapChunk.cpp2
-rw-r--r--src/tools/mesh_extractor/MeshExtractor.cpp17
-rw-r--r--src/tools/mesh_extractor/ObjectDataHandler.cpp16
-rw-r--r--src/tools/mesh_extractor/ObjectDataHandler.h2
-rw-r--r--src/tools/mesh_extractor/TileBuilder.cpp6
-rw-r--r--src/tools/mesh_extractor/Utils.cpp29
-rw-r--r--src/tools/mesh_extractor/Utils.h13
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.cpp2
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.cpp43
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.h2
18 files changed, 138 insertions, 70 deletions
diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp
index c2ac19d5be0..7adf3625022 100644
--- a/src/tools/mesh_extractor/ADT.cpp
+++ b/src/tools/mesh_extractor/ADT.cpp
@@ -3,11 +3,11 @@
#include "LiquidHandler.h"
#include "WorldModelHandler.h"
-ADT::ADT( std::string file ) : ObjectData(NULL), Data(NULL), HasObjectData(false),
- _DoodadHandler(NULL), _WorldModelHandler(NULL), _LiquidHandler(NULL)
+ADT::ADT( std::string file, int x, int y ) : ObjectData(NULL), Data(NULL), HasObjectData(false),
+ _DoodadHandler(NULL), _WorldModelHandler(NULL), _LiquidHandler(NULL), X(x), Y(y)
{
Data = new ChunkedData(file);
- ObjectData = new ChunkedData(Utils::Replace(file, ".adt", "_obj0.adt"));
+ ObjectData = new ChunkedData(/*Utils::Replace(file, ".adt", "_obj0.adt")*/file);
if (ObjectData->Stream)
HasObjectData = true;
else
diff --git a/src/tools/mesh_extractor/ADT.h b/src/tools/mesh_extractor/ADT.h
index 133596eb024..6f9973f7cde 100644
--- a/src/tools/mesh_extractor/ADT.h
+++ b/src/tools/mesh_extractor/ADT.h
@@ -10,7 +10,7 @@ class LiquidHandler;
class ADT
{
public:
- ADT(std::string file);
+ ADT(std::string file, int x, int y);
~ADT();
void Read();
@@ -25,5 +25,8 @@ public:
DoodadHandler* _DoodadHandler;
WorldModelHandler* _WorldModelHandler;
LiquidHandler* _LiquidHandler;
+
+ int X;
+ int Y;
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp
index a6b4e3763a0..8e2c8da18e9 100644
--- a/src/tools/mesh_extractor/ContinentBuilder.cpp
+++ b/src/tools/mesh_extractor/ContinentBuilder.cpp
@@ -114,7 +114,7 @@ void ContinentBuilder::Build(bool debug)
for (uint32 i = 0; i < NumberOfThreads; ++i)
Threads.push_back(new BuilderThread(this, debug, params));
printf("Map %s ( %u ) has %u tiles. Building them with %u threads\n", Continent.c_str(), MapId, uint32(TileMap->TileTable.size()), NumberOfThreads);
- for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
+ //for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
{
bool next = false;
while (!next)
@@ -123,7 +123,7 @@ void ContinentBuilder::Build(bool debug)
{
if ((*_th)->Free)
{
- (*_th)->SetData(itr->X, itr->Y, MapId, Continent);
+ (*_th)->SetData(40/*itr->X*/, 29/*itr->Y*/, MapId, Continent);
(*_th)->activate();
next = true;
break;
diff --git a/src/tools/mesh_extractor/DoodadHandler.cpp b/src/tools/mesh_extractor/DoodadHandler.cpp
index ed683d70520..98515008636 100644
--- a/src/tools/mesh_extractor/DoodadHandler.cpp
+++ b/src/tools/mesh_extractor/DoodadHandler.cpp
@@ -6,8 +6,8 @@
DoodadHandler::DoodadHandler( ADT* adt ) : ObjectDataHandler(adt), _definitions(NULL), _paths(NULL)
{
- if (!adt->HasObjectData)
- return;
+ /*if (!adt->HasObjectData)
+ return;*/
Chunk* mddf = adt->ObjectData->GetChunkByName("MDDF");
if (mddf)
ReadDoodadDefinitions(mddf);
@@ -18,15 +18,14 @@ DoodadHandler::DoodadHandler( ADT* adt ) : ObjectDataHandler(adt), _definitions(
ReadDoodadPaths(mmid, mmdx);
}
-void DoodadHandler::ProcessInternal( ChunkedData* subChunks )
+void DoodadHandler::ProcessInternal( MapChunk* mcnk )
{
if (!IsSane())
return;
- Chunk* doodadReferencesChunk = subChunks->GetChunkByName("MCRD");
- if (!doodadReferencesChunk)
- return;
- FILE* stream = doodadReferencesChunk->GetStream();
- uint32 refCount = doodadReferencesChunk->Length / 4;
+
+ 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;
@@ -57,6 +56,8 @@ void DoodadHandler::ProcessInternal( ChunkedData* subChunks )
InsertModelGeometry(doodad, model);
}
+ // Restore the stream position
+ fseek(stream, mcnk->Source->Offset, SEEK_SET);
}
void DoodadHandler::ReadDoodadDefinitions( Chunk* chunk )
@@ -91,13 +92,32 @@ void DoodadHandler::ReadDoodadPaths( Chunk* id, Chunk* data )
}
}
+Vector3 TransformDoodadVertex(const DoodadDefinition& def, Vector3& vec)
+{
+ float mapOffset = 17066.0f + (2 / 3.0f);
+ Vector3 MapPos = Vector3(mapOffset, 0, mapOffset);
+ G3D::Matrix4 rot = G3D::Matrix4::identity();
+ rot = rot.pitchDegrees(def.Rotation.y - 90);
+ rot = rot.yawDegrees(-def.Rotation.x);
+ rot = rot.rollDegrees(def.Rotation.z - 90);
+
+ Vector3 offset = def.Position - MapPos;
+
+ // Because homoMul wants a G3D::Vector3
+ G3D::Vector3 g3dvec(vec.x, vec.y, vec.z);
+ G3D::Vector3 g3dOffset(offset.x, offset.y, offset.z);
+ G3D::Vector3 ret = (rot.homoMul(g3dvec, 1) * def.Scale()) + g3dOffset;
+ Vector3 ret2 = (Utils::VectorTransform(vec, rot) * def.Scale()) + def.Position - MapPos;
+ return ret2; //Vector3(ret.x, ret.y, ret.z);
+}
+
void DoodadHandler::InsertModelGeometry(const DoodadDefinition& def, Model* model)
{
G3D::Matrix4 transformation = Utils::GetTransformation(def);
uint32 vertOffset = Vertices.size();
-
+
for (std::vector<Vector3>::iterator itr = model->Vertices.begin(); itr != model->Vertices.end(); ++itr)
- Vertices.push_back(Utils::VectorTransform(*itr, transformation));
+ Vertices.push_back(TransformDoodadVertex(def, *itr)/*Utils::VectorTransform(*itr, transformation)*/);
for (std::vector<Triangle<uint16> >::iterator itr = model->Triangles.begin(); itr != model->Triangles.end(); ++itr)
Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_DOODAD, itr->V0 + vertOffset, itr->V1 + vertOffset, itr->V2 + vertOffset));
diff --git a/src/tools/mesh_extractor/DoodadHandler.h b/src/tools/mesh_extractor/DoodadHandler.h
index 96aecbcce27..45b302a9c20 100644
--- a/src/tools/mesh_extractor/DoodadHandler.h
+++ b/src/tools/mesh_extractor/DoodadHandler.h
@@ -44,7 +44,7 @@ public:
protected:
- void ProcessInternal(ChunkedData* chunk);
+ void ProcessInternal(MapChunk* chunk);
private:
void ReadDoodadDefinitions(Chunk* chunk);
diff --git a/src/tools/mesh_extractor/Geometry.cpp b/src/tools/mesh_extractor/Geometry.cpp
index 2fc470e8e9f..3ac52a9287d 100644
--- a/src/tools/mesh_extractor/Geometry.cpp
+++ b/src/tools/mesh_extractor/Geometry.cpp
@@ -117,7 +117,7 @@ void Geometry::AddAdt( ADT* adt )
if (!adt->_DoodadHandler->Triangles.empty())
AddData(adt->_DoodadHandler->Vertices, adt->_DoodadHandler->Triangles);
- if (!adt->_WorldModelHandler->Triangles.empty())
- AddData(adt->_WorldModelHandler->Vertices, adt->_WorldModelHandler->Triangles);
+ /*if (!adt->_WorldModelHandler->Triangles.empty())
+ AddData(adt->_WorldModelHandler->Vertices, adt->_WorldModelHandler->Triangles);*/
}
diff --git a/src/tools/mesh_extractor/MPQ.cpp b/src/tools/mesh_extractor/MPQ.cpp
index 18a9eb0f0e3..c930685c073 100644
--- a/src/tools/mesh_extractor/MPQ.cpp
+++ b/src/tools/mesh_extractor/MPQ.cpp
@@ -111,7 +111,13 @@ void MPQFile::close()
FILE* MPQFile::GetFileStream()
{
- FILE* file = tmpfile();
+ FILE* file = NULL;
+ tmpfile_s(&file);
+ if (!file)
+ {
+ printf("Could not create temporary file. Please run as Administrator or root\n");
+ exit(1);
+ }
fwrite(buffer, sizeof(char), size, file);
fseek(file, 0, SEEK_SET);
return file;
diff --git a/src/tools/mesh_extractor/MPQManager.cpp b/src/tools/mesh_extractor/MPQManager.cpp
index c95179f2680..3c63aed97d0 100644
--- a/src/tools/mesh_extractor/MPQManager.cpp
+++ b/src/tools/mesh_extractor/MPQManager.cpp
@@ -57,7 +57,7 @@ void MPQManager::InitializeDBC()
Archives.push_front(_baseLocale);
if (BaseLocale == -1)
{
- printf("No locale data detected\n");
+ printf("No locale data detected. Please make sure that the executable is in the same folder as your WoW installation.\n");
ASSERT(false);
}
else
@@ -103,6 +103,11 @@ FILE* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file )
// Pack the return into a FILE stream
FILE* ret = tmpfile();
+ if (!ret)
+ {
+ printf("Could not create temporary file. Please run as Administrator or root\n");
+ exit(1);
+ }
fwrite(buffer, sizeof(uint8), size, ret);
return ret;
}
diff --git a/src/tools/mesh_extractor/MapChunk.cpp b/src/tools/mesh_extractor/MapChunk.cpp
index 8fe40773d43..789166d5c9b 100644
--- a/src/tools/mesh_extractor/MapChunk.cpp
+++ b/src/tools/mesh_extractor/MapChunk.cpp
@@ -66,6 +66,8 @@ void MapChunk::GenerateVertices( FILE* stream )
Vertices.push_back(vert);
}
}
+ // Restore stream position.
+ fseek(stream, Source->Offset, SEEK_SET);
}
bool MapChunk::HasHole( uint32 map, int x, int y )
diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp
index e2550eec25a..a6ab4aab98f 100644
--- a/src/tools/mesh_extractor/MeshExtractor.cpp
+++ b/src/tools/mesh_extractor/MeshExtractor.cpp
@@ -51,11 +51,13 @@ void ExtractDBCs()
std::string baseDBCPath = "dbc/";
Utils::CreateDir(baseDBCPath);
- // Populate list of DBC files
std::set<std::string> DBCFiles;
const size_t extLen = strlen(".dbc");
+ // Populate list of DBC files
+ // We get the DBC names by going over the (guaranteed to exist) default locale files
+ // Then we look in other locale files in case that they are available.
for (std::vector<std::string>::iterator itr = MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.begin(); itr != MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.end(); ++itr)
- if (itr->rfind(".dbc") == itr->length() - extLen)
+ if (itr->rfind(".dbc") == itr->length() - extLen) // Check if the extension is ".dbc"
DBCFiles.insert(*itr);
const size_t folderLen = strlen("DBFilesClient\\");
@@ -228,7 +230,7 @@ void ExtractGameobjectModels()
fwrite(MobaEx, 4, k, output);
delete[] MobaEx;
- // Note: still not finished
+ //@TODO: Finish this.
}
fclose(output);
@@ -338,6 +340,8 @@ void LoadTile(dtNavMesh*& navMesh, const char* tile)
int main(int argc, char* argv[])
{
+ system("pause");
+ _setmaxstdio(2048);
uint32 threads = 4, extractFlags = 0;
std::set<uint32> mapIds;
bool debug = false;
@@ -348,6 +352,13 @@ int main(int argc, char* argv[])
return -1;
}
+ if (extractFlags == 0)
+ {
+ printf("You must provide a valid extractflag.\n");
+ PrintUsage();
+ return -1;
+ }
+
Cache = new CacheClass();
MPQHandler = new MPQManager();
MPQHandler->Initialize();
diff --git a/src/tools/mesh_extractor/ObjectDataHandler.cpp b/src/tools/mesh_extractor/ObjectDataHandler.cpp
index 789efc6d62c..87b24588299 100644
--- a/src/tools/mesh_extractor/ObjectDataHandler.cpp
+++ b/src/tools/mesh_extractor/ObjectDataHandler.cpp
@@ -5,17 +5,7 @@
void ObjectDataHandler::ProcessMapChunk( MapChunk* chunk )
{
- if (!Source->HasObjectData)
- return;
- // fuck it blizzard, why is this crap necessary?
- int32 firstIndex = Source->ObjectData->GetFirstIndex("MCNK");
- if (firstIndex == -1)
- return;
- if (uint32(firstIndex + chunk->Index) > Source->ObjectData->Chunks.size())
- return;
- Chunk* ourChunk = Source->ObjectData->Chunks[firstIndex + chunk->Index];
- if (ourChunk->Length == 0)
- return;
- ChunkedData* subChunks = new ChunkedData(ourChunk->GetStream(), ourChunk->Length, 2);
- ProcessInternal(subChunks);
+ /*if (!Source->HasObjectData)
+ return;*/
+ ProcessInternal(chunk);
}
diff --git a/src/tools/mesh_extractor/ObjectDataHandler.h b/src/tools/mesh_extractor/ObjectDataHandler.h
index 75b4e45700c..9b347ef418a 100644
--- a/src/tools/mesh_extractor/ObjectDataHandler.h
+++ b/src/tools/mesh_extractor/ObjectDataHandler.h
@@ -9,7 +9,7 @@ public:
ObjectDataHandler(ADT* _adt) : Source(_adt) {}
void ProcessMapChunk(MapChunk* chunk);
- virtual void ProcessInternal(ChunkedData* data) = 0;
+ virtual void ProcessInternal(MapChunk* data) = 0;
ADT* Source;
};
#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp
index fa50b85caaf..04cf87e0b58 100644
--- a/src/tools/mesh_extractor/TileBuilder.cpp
+++ b/src/tools/mesh_extractor/TileBuilder.cpp
@@ -77,7 +77,7 @@ uint8* TileBuilder::Build(bool dbg, dtNavMeshParams& navMeshParams)
{
_Geometry = new Geometry();
_Geometry->Transform = true;
- ADT* adt = new ADT(Utils::GetAdtPath(World, X, Y));
+ ADT* adt = new ADT(Utils::GetAdtPath(World, X, Y), X, Y);
adt->Read();
_Geometry->AddAdt(adt);
delete adt;
@@ -94,7 +94,7 @@ uint8* TileBuilder::Build(bool dbg, dtNavMeshParams& navMeshParams)
if (tx == X && ty == Y)
continue;
- ADT* _adt = new ADT(Utils::GetAdtPath(World, tx, ty));
+ ADT* _adt = new ADT(Utils::GetAdtPath(World, tx, ty), tx, ty);
// If this condition is met, it means that this wdt does not contain the ADT
if (!_adt->Data->Stream)
{
@@ -124,7 +124,7 @@ uint8* TileBuilder::Build(bool dbg, dtNavMeshParams& navMeshParams)
}
fclose(debug);
}
-
+ return NULL;
uint32 numVerts = _Geometry->Vertices.size();
uint32 numTris = _Geometry->Triangles.size();
float* vertices;
diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp
index 49df7e20eba..9b07aeebe96 100644
--- a/src/tools/mesh_extractor/Utils.cpp
+++ b/src/tools/mesh_extractor/Utils.cpp
@@ -49,13 +49,12 @@ void Utils::Reverse(char word[])
std::string Utils::ReadString( FILE* file )
{
std::string ret;
- int i = 0;
while (true)
{
char b;
if (fread(&b, sizeof(char), 1, file) != 1 || b == 0)
break;
- ret[i++] = b;
+ ret.push_back(b);
}
return ret;
}
@@ -92,10 +91,10 @@ G3D::Matrix4 Utils::RotationX(float angle)
float _cos = cos(angle);
float _sin = sin(angle);
G3D::Matrix4 ret = G3D::Matrix4::identity();
+ ret[1][1] = _cos;
+ ret[2][1] = _sin;
+ ret[1][2] = -_sin;
ret[2][2] = _cos;
- ret[2][3] = _sin;
- ret[3][2] = -_sin;
- ret[3][3] = _cos;
return ret;
}
@@ -119,10 +118,10 @@ G3D::Matrix4 Utils::RotationY( float angle )
float _cos = cos(angle);
float _sin = sin(angle);
G3D::Matrix4 ret = G3D::Matrix4::identity();
- ret[1][1] = _cos;
- ret[1][3] = -_sin;
- ret[3][1] = _sin;
- ret[3][3] = _cos;
+ ret[0][0] = _cos;
+ ret[3][0] = -_sin;
+ ret[0][3] = _sin;
+ ret[2][2] = _cos;
return ret;
}
@@ -131,10 +130,10 @@ G3D::Matrix4 Utils::RotationZ( float angle )
float _cos = cos(angle);
float _sin = sin(angle);
G3D::Matrix4 ret = G3D::Matrix4::identity();
+ ret[0][0] = _cos;
+ ret[1][0] = _sin;
+ ret[0][1] = -_sin;
ret[1][1] = _cos;
- ret[1][2] = _sin;
- ret[2][1] = -_sin;
- ret[2][2] = _cos;
return ret;
}
@@ -146,9 +145,9 @@ float Utils::ToRadians( float degrees )
Vector3 Utils::VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix )
{
Vector3 ret;
- ret.x = vec.x * matrix[1][1] + vec.y * matrix[2][1] + vec.z * matrix[3][1] + matrix[4][1];
- ret.y = vec.x * matrix[1][2] + vec.y * matrix[2][2] + vec.z * matrix[3][2] + matrix[4][2];
- ret.z = vec.x * matrix[1][3] + vec.y * matrix[2][3] + vec.z * matrix[3][3] + matrix[4][3];
+ ret.x = vec.x * matrix[0][0] + vec.y * matrix[1][0] + vec.z * matrix[2][0] + matrix[3][0];
+ ret.y = vec.x * matrix[0][1] + vec.y * matrix[1][1] + vec.z * matrix[2][1] + matrix[3][1];
+ ret.z = vec.x * matrix[0][2] + vec.y * matrix[1][2] + vec.z * matrix[2][2] + matrix[3][2];
return ret;
}
diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h
index e6bb6a59bda..b1f5bfb71be 100644
--- a/src/tools/mesh_extractor/Utils.h
+++ b/src/tools/mesh_extractor/Utils.h
@@ -25,11 +25,22 @@ struct Vector3
float y;
float z;
- Vector3 operator +(Vector3 const& other)
+ Vector3 operator +(Vector3 const& other) const
{
return Vector3(x + other.x, y + other.y, z + other.z);
}
+ Vector3 operator -(Vector3 const& other) const
+ {
+ return Vector3(x - other.x, y - other.y, z - other.z);
+ }
+
+ template<typename T>
+ Vector3 operator *(T s) const
+ {
+ return Vector3(x * s, y * s, z * s);
+ }
+
static Vector3 Read(FILE* file);
};
diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp
index 21e1c1e63e1..f76df73aaa6 100644
--- a/src/tools/mesh_extractor/WorldModelGroup.cpp
+++ b/src/tools/mesh_extractor/WorldModelGroup.cpp
@@ -3,7 +3,7 @@
#include "Chunk.h"
#include "Utils.h"
-WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false)
+WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false), HasLiquidData(false)
{
Data = new ChunkedData(path);
if (!Data->Stream)
diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp
index cc011b298eb..f069341e375 100644
--- a/src/tools/mesh_extractor/WorldModelHandler.cpp
+++ b/src/tools/mesh_extractor/WorldModelHandler.cpp
@@ -30,22 +30,22 @@ WorldModelDefinition WorldModelDefinition::Read( FILE* file )
WorldModelHandler::WorldModelHandler( ADT* adt ) : ObjectDataHandler(adt), _definitions(NULL), _paths(NULL)
{
- if (!adt->HasObjectData)
- return;
+ /*if (!adt->HasObjectData)
+ return;*/
ReadModelPaths();
ReadDefinitions();
}
-void WorldModelHandler::ProcessInternal( ChunkedData* subChunks )
+void WorldModelHandler::ProcessInternal( MapChunk* mcnk )
{
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++)
+
+ 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)
@@ -76,6 +76,27 @@ void WorldModelHandler::ProcessInternal( ChunkedData* subChunks )
InsertModelGeometry(Vertices, Triangles, wmo, model);
}
+ // Restore the stream position
+ fseek(stream, mcnk->Source->Offset, SEEK_SET);
+}
+
+Vector3 TransformDoodadVertex(const IDefinition& def, Vector3& vec)
+{
+ float mapOffset = 17066.0f + (2 / 3.0f);
+ Vector3 MapPos = Vector3(mapOffset, 0, mapOffset);
+ G3D::Matrix4 rot = G3D::Matrix4::identity();
+ rot = rot.pitchDegrees(def.Rotation.y - 90);
+ rot = rot.yawDegrees(-def.Rotation.x);
+ rot = rot.rollDegrees(def.Rotation.z - 90);
+
+ Vector3 offset = def.Position - MapPos;
+
+ // Because homoMul wants a G3D::Vector3
+ G3D::Vector3 g3dvec(vec.x, vec.y, vec.z);
+ G3D::Vector3 g3dOffset(offset.x, offset.y, offset.z);
+ G3D::Vector3 ret = (rot.homoMul(g3dvec, 1) * def.Scale()) + g3dOffset;
+ Vector3 ret2 = (Utils::VectorTransform(vec, rot) + def.Position - MapPos) * def.Scale();
+ return ret2; //Vector3(ret.x, ret.y, ret.z);
}
void WorldModelHandler::InsertModelGeometry( std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, WorldModelDefinition& def, WorldModelRoot* root )
@@ -85,7 +106,7 @@ void WorldModelHandler::InsertModelGeometry( std::vector<Vector3>& verts, std::v
{
uint32 vertOffset = verts.size();
for (std::vector<Vector3>::iterator itr2 = group->Vertices.begin(); itr2 != group->Vertices.end(); ++itr2)
- verts.push_back(Utils::VectorTransform(*itr2, transformation));
+ verts.push_back(TransformDoodadVertex(def, *itr2)/*Utils::VectorTransform(*itr2, transformation)*/);
for (uint32 i = 0; i < group->Triangles.size(); ++i)
{
@@ -123,7 +144,7 @@ void WorldModelHandler::InsertModelGeometry( std::vector<Vector3>& verts, std::v
G3D::Matrix4 doodadTransformation = Utils::GetWmoDoodadTransformation(*instance, def);
int vertOffset = verts.size();
for (std::vector<Vector3>::iterator itr2 = model->Vertices.begin(); itr2 != model->Vertices.end(); ++itr2)
- verts.push_back(Utils::VectorTransform(*itr2, doodadTransformation));
+ verts.push_back(TransformDoodadVertex(def, *itr2)/*Utils::VectorTransform(*itr2, doodadTransformation)*/);
for (std::vector<Triangle<uint16> >::iterator itr2 = model->Triangles.begin(); itr2 != model->Triangles.end(); ++itr2)
tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WMO, itr2->V0 + vertOffset, itr2->V1 + vertOffset, itr2->V2 + vertOffset));
}
diff --git a/src/tools/mesh_extractor/WorldModelHandler.h b/src/tools/mesh_extractor/WorldModelHandler.h
index 29715ded696..d9da828da48 100644
--- a/src/tools/mesh_extractor/WorldModelHandler.h
+++ b/src/tools/mesh_extractor/WorldModelHandler.h
@@ -36,7 +36,7 @@ public:
bool IsSane() { return _definitions && _paths; }
void InsertModelGeometry(std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, WorldModelDefinition& def, WorldModelRoot* root);
protected:
- void ProcessInternal(ChunkedData* data);
+ void ProcessInternal(MapChunk* data);
private:
void ReadDefinitions();
void ReadModelPaths();