diff options
-rw-r--r-- | src/tools/mesh_extractor/ADT.cpp | 6 | ||||
-rw-r--r-- | src/tools/mesh_extractor/ADT.h | 5 | ||||
-rw-r--r-- | src/tools/mesh_extractor/ContinentBuilder.cpp | 4 | ||||
-rw-r--r-- | src/tools/mesh_extractor/DoodadHandler.cpp | 40 | ||||
-rw-r--r-- | src/tools/mesh_extractor/DoodadHandler.h | 2 | ||||
-rw-r--r-- | src/tools/mesh_extractor/Geometry.cpp | 4 | ||||
-rw-r--r-- | src/tools/mesh_extractor/MPQ.cpp | 8 | ||||
-rw-r--r-- | src/tools/mesh_extractor/MPQManager.cpp | 7 | ||||
-rw-r--r-- | src/tools/mesh_extractor/MapChunk.cpp | 2 | ||||
-rw-r--r-- | src/tools/mesh_extractor/MeshExtractor.cpp | 17 | ||||
-rw-r--r-- | src/tools/mesh_extractor/ObjectDataHandler.cpp | 16 | ||||
-rw-r--r-- | src/tools/mesh_extractor/ObjectDataHandler.h | 2 | ||||
-rw-r--r-- | src/tools/mesh_extractor/TileBuilder.cpp | 6 | ||||
-rw-r--r-- | src/tools/mesh_extractor/Utils.cpp | 29 | ||||
-rw-r--r-- | src/tools/mesh_extractor/Utils.h | 13 | ||||
-rw-r--r-- | src/tools/mesh_extractor/WorldModelGroup.cpp | 2 | ||||
-rw-r--r-- | src/tools/mesh_extractor/WorldModelHandler.cpp | 43 | ||||
-rw-r--r-- | src/tools/mesh_extractor/WorldModelHandler.h | 2 |
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(); |