aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.cpp2
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.cpp24
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.h7
-rw-r--r--src/tools/mesh_extractor/Geometry.cpp4
-rw-r--r--src/tools/mesh_extractor/Utils.cpp38
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.cpp37
6 files changed, 59 insertions, 53 deletions
diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp
index 8e2c8da18e9..5065eaf74af 100644
--- a/src/tools/mesh_extractor/ContinentBuilder.cpp
+++ b/src/tools/mesh_extractor/ContinentBuilder.cpp
@@ -123,7 +123,7 @@ void ContinentBuilder::Build(bool debug)
{
if ((*_th)->Free)
{
- (*_th)->SetData(40/*itr->X*/, 29/*itr->Y*/, MapId, Continent);
+ (*_th)->SetData(29/*itr->X*/, 40/*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 98515008636..5e489681f51 100644
--- a/src/tools/mesh_extractor/DoodadHandler.cpp
+++ b/src/tools/mesh_extractor/DoodadHandler.cpp
@@ -94,21 +94,15 @@ 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;
+ // Rotate our Doodad vertex
+ G3D::Matrix4 rot = G3D::Matrix3::fromEulerAnglesXZY(Utils::ToRadians(-def.Rotation.z), Utils::ToRadians(def.Rotation.x), Utils::ToRadians(-def.Rotation.y + 180));
+ Vector3 ret = Utils::VectorTransform(vec, rot);
+
+ // Convert the rotated Doodad vector to our current coordinate system
+ ret = Vector3(ret.x, ret.z, -ret.y);
- // 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);
+ // And finally translate it to our origin
+ return ret + Vector3(Constants::MaxXY - def.Position.z, Constants::MaxXY - def.Position.x, def.Position.y);
}
void DoodadHandler::InsertModelGeometry(const DoodadDefinition& def, Model* model)
@@ -117,7 +111,7 @@ void DoodadHandler::InsertModelGeometry(const DoodadDefinition& def, Model* mode
uint32 vertOffset = Vertices.size();
for (std::vector<Vector3>::iterator itr = model->Vertices.begin(); itr != model->Vertices.end(); ++itr)
- Vertices.push_back(TransformDoodadVertex(def, *itr)/*Utils::VectorTransform(*itr, transformation)*/);
+ Vertices.push_back(TransformDoodadVertex(def, *itr));
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 45b302a9c20..51377f32d01 100644
--- a/src/tools/mesh_extractor/DoodadHandler.h
+++ b/src/tools/mesh_extractor/DoodadHandler.h
@@ -17,13 +17,18 @@ public:
virtual float Scale() const { return DecimalScale / 1024.0f; }
+ Vector3 FixCoords(Vector3& vec)
+ {
+ return Vector3(vec.z, vec.x, vec.y);
+ }
+
void Read(FILE* stream)
{
int count = 0;
count += fread(&MmidIndex, sizeof(uint32), 1, stream);
count += fread(&UniqueId, sizeof(uint32), 1, stream);
- Position = Vector3::Read(stream);
+ Position = (Vector3::Read(stream));
Rotation = Vector3::Read(stream);
count += fread(&DecimalScale, sizeof(uint16), 1, stream);
count += fread(&Flags, sizeof(uint16), 1, stream);
diff --git a/src/tools/mesh_extractor/Geometry.cpp b/src/tools/mesh_extractor/Geometry.cpp
index 3ac52a9287d..2fc470e8e9f 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/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp
index 9b07aeebe96..e92da1a86b8 100644
--- a/src/tools/mesh_extractor/Utils.cpp
+++ b/src/tools/mesh_extractor/Utils.cpp
@@ -86,18 +86,6 @@ std::string Utils::FixModelPath(const std::string& path )
return Utils::GetPathBase(path) + ".M2";
}
-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;
- return ret;
-}
-
G3D::Matrix4 Utils::GetTransformation(const IDefinition& def)
{
G3D::Matrix4 translation;
@@ -107,7 +95,8 @@ G3D::Matrix4 Utils::GetTransformation(const IDefinition& def)
translation = G3D::Matrix4::translation(-(def.Position.z - Constants::MaxXY),
-(def.Position.x - Constants::MaxXY), def.Position.y);
- G3D::Matrix4 rotation = RotationX(ToRadians(def.Rotation.z)) * RotationY(ToRadians(def.Rotation.x)) * RotationZ(ToRadians(def.Rotation.y + 180));
+ //G3D::Matrix4 rotation = RotationX(ToRadians(def.Rotation.z)) * RotationY(ToRadians(def.Rotation.x)) * RotationZ(ToRadians(def.Rotation.y + 180));
+ G3D::Matrix4 rotation = G3D::Matrix4::identity().rollDegrees(def.Rotation.z).pitchDegrees(def.Rotation.x).yawDegrees(def.Rotation.y + 180);
if (def.Scale() < 1.0f || def.Scale() > 1.0f)
return G3D::Matrix4::scale(def.Scale()) * rotation * translation;
return rotation * translation;
@@ -137,6 +126,18 @@ G3D::Matrix4 Utils::RotationZ( float angle )
return ret;
}
+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;
+ return ret;
+}
+
float Utils::ToRadians( float degrees )
{
return Constants::PI * degrees / 180.0f;
@@ -144,11 +145,12 @@ float Utils::ToRadians( float degrees )
Vector3 Utils::VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix )
{
- Vector3 ret;
- ret.x = vec.x * matrix[0][0] + vec.y * matrix[1][0] + vec.z * matrix[2][0] + matrix[3][0];
+ G3D::Vector3 ret(vec.x, vec.y, vec.z);
+ ret = matrix.homoMul(ret, 1);
+ /*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;
+ ret.z = vec.x * matrix[0][2] + vec.y * matrix[1][2] + vec.z * matrix[2][2] + matrix[3][2];*/
+ return Vector3(ret.x, ret.y, ret.z);
}
std::string Utils::GetPathBase(const std::string& path )
@@ -230,7 +232,7 @@ void Utils::SaveToDisk( FILE* stream, const std::string& path )
Vector3 Utils::ToWoWCoords(const Vector3& vec )
{
- return Vector3(vec.x, -vec.z, vec.y);
+ return Vector3(-vec.z, vec.x, vec.y);
}
std::string Utils::GetExtension( std::string path )
diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp
index f069341e375..faaf87019bd 100644
--- a/src/tools/mesh_extractor/WorldModelHandler.cpp
+++ b/src/tools/mesh_extractor/WorldModelHandler.cpp
@@ -5,6 +5,7 @@
#include "Model.h"
#include "Define.h"
#include "G3D/Matrix4.h"
+#include "G3D/Quat.h"
#include <cstdio>
WorldModelDefinition WorldModelDefinition::Read( FILE* file )
@@ -82,21 +83,25 @@ void WorldModelHandler::ProcessInternal( MapChunk* mcnk )
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);
+ // Rotate our Doodad vertex
+ G3D::Matrix4 rot = G3D::Matrix3::fromEulerAnglesXZY(Utils::ToRadians(-def.Rotation.z), Utils::ToRadians(def.Rotation.x), Utils::ToRadians(-def.Rotation.y + 180));
+ Vector3 ret = Utils::VectorTransform(vec, rot);
+
+ // Convert the rotated Doodad vector to our current coordinate system
+ ret = Vector3(ret.x, ret.z, -ret.y);
+
+ // And finally translate it to our origin
+ return ret + Vector3(Constants::MaxXY - def.Position.z, Constants::MaxXY - def.Position.x, def.Position.y);
+}
+
+Vector3 TransformDoodadToWMO(Vector3& vec, const DoodadInstance& inst, const WorldModelRoot& rootDef)
+{
+ Vector3 translation = Vector3(inst.Position.x, inst.Position.z, -inst.Position.y);
+ G3D::Quat quat = G3D::Quat(inst.QuatX, inst.QuatZ, -inst.QuatY, inst.QuatW);
+ G3D::Matrix3 rotM;
+ quat.toRotationMatrix(rotM);
+
+ return (Utils::VectorTransform(vec, G3D::Matrix4(rotM)) + translation) * (1.0f / inst.Scale);
}
void WorldModelHandler::InsertModelGeometry( std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, WorldModelDefinition& def, WorldModelRoot* root )
@@ -144,7 +149,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(TransformDoodadVertex(def, *itr2)/*Utils::VectorTransform(*itr2, doodadTransformation)*/);
+ verts.push_back(TransformDoodadToWMO(*itr2, *instance, *root)/*TransformDoodadVertex(instance, *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));
}