diff --git a/source/collada/Maths.cpp b/source/collada/Maths.cpp index 85383d2f16..42b4cfe909 100644 --- a/source/collada/Maths.cpp +++ b/source/collada/Maths.cpp @@ -4,6 +4,7 @@ #include "FCollada.h" +/* FMMatrix44 operator+ (const FMMatrix44& a, const FMMatrix44& b) { FMMatrix44 r; @@ -48,3 +49,4 @@ FMMatrix44 QuatToMatrix(float x, float y, float z, float w) return r; } +*/ \ No newline at end of file diff --git a/source/collada/Maths.h b/source/collada/Maths.h index d52fc63e90..1b92bbea75 100644 --- a/source/collada/Maths.h +++ b/source/collada/Maths.h @@ -3,8 +3,9 @@ class FMMatrix44; -extern FMMatrix44 operator+ (const FMMatrix44& a, const FMMatrix44& b); -extern FMMatrix44 operator/ (const FMMatrix44& a, const float b); -extern FMMatrix44 QuatToMatrix(float x, float y, float z, float w); +// (None of these are used any more) +// extern FMMatrix44 operator+ (const FMMatrix44& a, const FMMatrix44& b); +// extern FMMatrix44 operator/ (const FMMatrix44& a, const float b); +// extern FMMatrix44 QuatToMatrix(float x, float y, float z, float w); #endif // MATHS_H__ diff --git a/source/collada/PMDConvert.cpp b/source/collada/PMDConvert.cpp index 4bee568c09..e74878c1b4 100644 --- a/source/collada/PMDConvert.cpp +++ b/source/collada/PMDConvert.cpp @@ -4,12 +4,14 @@ #include "CommonConvert.h" #include "FCollada.h" +#include "FCDocument/FCDAsset.h" #include "FCDocument/FCDocument.h" #include "FCDocument/FCDController.h" #include "FCDocument/FCDControllerInstance.h" #include "FCDocument/FCDGeometry.h" #include "FCDocument/FCDGeometryMesh.h" #include "FCDocument/FCDGeometryPolygons.h" +#include "FCDocument/FCDGeometryPolygonsTools.h" #include "FCDocument/FCDGeometrySource.h" #include "FCDocument/FCDSceneNode.h" #include "FCDocument/FCDSkinController.h" @@ -75,6 +77,9 @@ public: assert(instance); Log(LOG_INFO, "Converting '%s'", instance->GetEntity()->GetName().c_str()); + FMVector3 upAxis = doc->GetAsset()->GetUpAxis(); + bool yUp = (upAxis.y != 0); // assume either Y_UP or Z_UP (TODO: does anyone ever do X_UP?) + if (instance->GetEntity()->GetType() == FCDEntity::GEOMETRY) { Log(LOG_INFO, "Found static geometry"); @@ -98,7 +103,7 @@ public: FloatList& dataNormal = sourceNormal ->GetSourceData(); FloatList& dataTexcoord = sourceTexcoord->GetSourceData(); - TransformVertices(dataPosition, dataNormal, transform); + TransformVertices(dataPosition, dataNormal, transform, yUp); std::vector boneWeights; std::vector boneTransforms; @@ -378,16 +383,26 @@ public: { REQUIRE(geom->IsMesh(), "geometry is mesh"); FCDGeometryMesh* mesh = geom->GetMesh(); + +// if (! mesh->IsTriangles()) +// FCDGeometryPolygonsTools::Triangulate(mesh); + // disabled for now - just let the exporter triangulate the mesh + REQUIRE(mesh->IsTriangles(), "mesh is made of triangles"); REQUIRE(mesh->GetPolygonsCount() == 1, "mesh has single set of polygons"); - return mesh->GetPolygons(0); + FCDGeometryPolygons* polys = mesh->GetPolygons(0); + REQUIRE(polys->FindIndices(polys->FindInput(FUDaeGeometryInput::POSITION)) != NULL, "mesh has vertex positions"); + REQUIRE(polys->FindIndices(polys->FindInput(FUDaeGeometryInput::NORMAL)) != NULL, "mesh has vertex normals"); + REQUIRE(polys->FindIndices(polys->FindInput(FUDaeGeometryInput::TEXCOORD)) != NULL, "mesh has vertex tex coords"); + return polys; } /** * Applies world-space transform to vertex data, and flips into other-handed * coordinate space. */ - static void TransformVertices(FloatList& position, FloatList& normal, const FMMatrix44& transform) + static void TransformVertices(FloatList& position, FloatList& normal, + const FMMatrix44& transform, bool yUp) { for (size_t i = 0; i < position.size(); i += 3) { @@ -398,15 +413,28 @@ public: pos = transform.TransformCoordinate(pos); norm = transform.TransformVector(norm).Normalize(); - // Copy back to array, while switching the coordinate system around + // Convert from Y_UP or Z_UP to the game's coordinate system + + if (yUp) + { + pos.z = -pos.z; + norm.z = -norm.z; + } + else + { + std::swap(pos.y, pos.z); + std::swap(norm.y, norm.z); + } + + // Copy back to array position[i+0] = pos.x; - position[i+1] = pos.z; - position[i+2] = pos.y; + position[i+1] = pos.y; + position[i+2] = pos.z; normal[i+0] = norm.x; - normal[i+1] = norm.z; - normal[i+2] = norm.y; + normal[i+1] = norm.y; + normal[i+2] = norm.z; } } @@ -426,6 +454,7 @@ public: norm = transform.TransformVector(norm).Normalize(); // Switch from Max's coordinate system into the game's: + // (TODO: handle Y_UP mode too) std::swap(pos.y, pos.z); std::swap(norm.y, norm.z); diff --git a/source/collada/precompiled.h b/source/collada/precompiled.h index e89d803b0c..9b2ab329b9 100644 --- a/source/collada/precompiled.h +++ b/source/collada/precompiled.h @@ -13,14 +13,17 @@ extern void Log(int severity, const char* fmt, ...); #endif #include "FCollada.h" +#include "FCDocument/FCDAsset.h" #include "FCDocument/FCDocument.h" #include "FCDocument/FCDAnimated.h" #include "FCDocument/FCDAnimationCurve.h" #include "FCDocument/FCDController.h" #include "FCDocument/FCDControllerInstance.h" +#include "FCDocument/FCDExtra.h" #include "FCDocument/FCDGeometry.h" #include "FCDocument/FCDGeometryMesh.h" #include "FCDocument/FCDGeometryPolygons.h" +#include "FCDocument/FCDGeometryPolygonsTools.h" #include "FCDocument/FCDGeometrySource.h" #include "FCDocument/FCDSceneNode.h" #include "FCDocument/FCDSkinController.h" diff --git a/source/tools/atlas/AtlasUI/ActorEditor/ActorEditorListCtrl.cpp b/source/tools/atlas/AtlasUI/ActorEditor/ActorEditorListCtrl.cpp index 90ab8e03e6..e57200c979 100644 --- a/source/tools/atlas/AtlasUI/ActorEditor/ActorEditorListCtrl.cpp +++ b/source/tools/atlas/AtlasUI/ActorEditor/ActorEditorListCtrl.cpp @@ -30,7 +30,7 @@ ActorEditorListCtrl::ActorEditorListCtrl(wxWindow* parent) AddColumnType(_("Variant"), 90, "@name", new FieldEditCtrl_Text()); AddColumnType(_("Ratio"), 50, "@frequency", new FieldEditCtrl_Text()); - AddColumnType(_("Model"), 140, "mesh", new FieldEditCtrl_File(_T("art/meshes/"), _("Mesh files (*.pmd)|*.pmd|All files (*.*)|*.*"))); + AddColumnType(_("Model"), 140, "mesh", new FieldEditCtrl_File(_T("art/meshes/"), _("Mesh files (*.pmd, *.dae)|*.pmd;*.dae|All files (*.*)|*.*"))); AddColumnType(_("Texture"), 140, "texture", new FieldEditCtrl_File(_T("art/textures/skins/"), _("All files (*.*)|*.*"))); // could be dds, or tga, or png, or bmp, etc, so just allow * AddColumnType(_("Animations"), 250, "animations", new FieldEditCtrl_Dialog(&AnimListEditor::Create)); AddColumnType(_("Props"), 220, "props", new FieldEditCtrl_Dialog(&PropListEditor::Create)); diff --git a/source/tools/atlas/AtlasUI/ActorEditor/AnimListEditor.cpp b/source/tools/atlas/AtlasUI/ActorEditor/AnimListEditor.cpp index 696d598a2c..3ac78b0d5c 100644 --- a/source/tools/atlas/AtlasUI/ActorEditor/AnimListEditor.cpp +++ b/source/tools/atlas/AtlasUI/ActorEditor/AnimListEditor.cpp @@ -46,7 +46,7 @@ AnimListEditorListCtrl::AnimListEditorListCtrl(wxWindow* parent) wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_SINGLE_SEL) { AddColumnType(_("Anim name"), 100, "@name", new FieldEditCtrl_List("animations")); - AddColumnType(_("File"), 200, "@file", new FieldEditCtrl_File(_T("art/animation/"), _("Animation files (*.psa)|*.psa|All files (*.*)|*.*"))); + AddColumnType(_("File"), 200, "@file", new FieldEditCtrl_File(_T("art/animation/"), _("Animation files (*.psa, *.dae)|*.psa;*.dae|All files (*.*)|*.*"))); AddColumnType(_("Speed"), 50, "@speed", new FieldEditCtrl_Text()); AddColumnType(_("Load"), 40, "@load", new FieldEditCtrl_Text()); AddColumnType(_("Event"), 40, "@event", new FieldEditCtrl_Text());