diff --git a/tools/MayaExporter/MayaExporter/MayaIncludes.h b/tools/MayaExporter/MayaExporter/MayaIncludes.h index 9186bfe6..4a810787 100644 --- a/tools/MayaExporter/MayaExporter/MayaIncludes.h +++ b/tools/MayaExporter/MayaExporter/MayaIncludes.h @@ -33,6 +33,9 @@ #include #include #include +#include +#include +#include // Wrappers diff --git a/tools/MayaExporter/MayaExporter/Menu.cpp b/tools/MayaExporter/MayaExporter/Menu.cpp index 06c115c8..410e0fa3 100644 --- a/tools/MayaExporter/MayaExporter/Menu.cpp +++ b/tools/MayaExporter/MayaExporter/Menu.cpp @@ -190,25 +190,44 @@ void Menu::GetSkeletonData() MTime startFrame = MAnimControl::animationStartTime(); MTime endFrame = MAnimControl::animationEndTime(); - std::vector*> AllSkeletons; + std::vector> allSkeletons; + + std::vector allBindPoses; + allBindPoses = m_SkeletonHandler->GetBindPoses(); for (int i = startFrame.value(); i < endFrame.value();i++) { MAnimControl::setCurrentTime(MTime(i, MTime::kNTSCField)); // Traverse scene and return vector with all materials - AllSkeletons.push_back(m_SkeletonHandler->DoIt()); + allSkeletons.push_back(m_SkeletonHandler->DoIt()); + } + + //print out all bind poses + for (auto aBindPose : allBindPoses) + { + MGlobal::displayInfo(MString() + "BindPose Skeleton name: " + aBindPose.Name.c_str()); + for (int i = 0; i < aBindPose.Joints.size(); i++) + { + //MGlobal::displayInfo(MString() + aBindPose.JointNames[i].c_str()); + //MGlobal::displayInfo(MString() + aBindPose.ParentIDs[i]); + //MGlobal::displayInfo(MString() + aBindPose.Joints[i].Translation[0] + " " + aBindPose.Joints[i].Translation[1] + " " + aBindPose.Joints[i].Translation[2]); + //MGlobal::displayInfo(MString() + aBindPose.Joints[i].Rotation[0] + " " + aBindPose.Joints[i].Rotation[1] + " " + aBindPose.Joints[i].Rotation[2]); + //MGlobal::displayInfo(MString() + aBindPose.Joints[i].Scale[0] + " " + aBindPose.Joints[i].Scale[1] + " " + aBindPose.Joints[i].Scale[2]); + } } - MGlobal::displayInfo(MString() + AllSkeletons.size()); - - for (int i = 0; i < AllSkeletons.size(); i++) + //Print out all skeletons for all frames + MGlobal::displayInfo(MString() + allSkeletons.size()); + for (auto frameSkeletons : allSkeletons) { - std::vector*& thisSkeleton = AllSkeletons.at(i); - for (int k = 0; k < thisSkeleton->size(); k++) + for (auto aSkeleton : frameSkeletons) { - for (int j = 0; j < thisSkeleton->at(k).Joints.size(); j++) + MGlobal::displayInfo(MString() + aSkeleton.Name.c_str()); + for (auto joint : aSkeleton.Joints) { - MGlobal::displayInfo(MString() + thisSkeleton->at(k).Joints.at(j).Name.c_str()); + //MGlobal::displayInfo(MString() + joint.Translation[0] + " " + joint.Translation[1] + " " + joint.Translation[2]); + //MGlobal::displayInfo(MString() + joint.Rotation[0] + " " + joint.Rotation[1] + " " + joint.Rotation[2]); + //MGlobal::displayInfo(MString() + joint.Scale[0] + " " + joint.Scale[1] + " " + joint.Scale[2]); } } } diff --git a/tools/MayaExporter/MayaExporter/Skeleton.cpp b/tools/MayaExporter/MayaExporter/Skeleton.cpp index 3e95b817..030c17dd 100644 --- a/tools/MayaExporter/MayaExporter/Skeleton.cpp +++ b/tools/MayaExporter/MayaExporter/Skeleton.cpp @@ -1,13 +1,14 @@ #include "Skeleton.h" -std::vector* Skeleton::DoIt() +std::vector Skeleton::DoIt() { - MItDependencyNodes jointIt(MFn::kJoint); + std::vector m_AllSkeletons; + + MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint); SkeletonNode SkeletonStorage; while (!jointIt.isDone()) { - MFnDependencyNode SkeletonFnDN(jointIt.thisNode()); - MFnTransform TransformNode(SkeletonFnDN.object()); + MFnTransform TransformNode(jointIt.currentItem()); Joint NewJoint; if (MFnDependencyNode(TransformNode.parent(0)).name() == "world") { @@ -20,24 +21,27 @@ std::vector* Skeleton::DoIt() SkeletonStorage.Name = TransformNode.name().asChar(); - NewJoint.ParentIndex = -1; // This joint is root - } - else { - auto it = std::find(m_Hierarchy.begin(), m_Hierarchy.end(), TransformNode.parent(0)); - if (it != m_Hierarchy.end()) { - NewJoint.ParentIndex = it - m_Hierarchy.begin(); - } - else { - MGlobal::displayError(MString() + "Could not find joint parent for: " + TransformNode.name()); - } + //NewJoint.ParentIndex = -1; // This joint is root } - m_Hierarchy.push_back(TransformNode.object()); - - NewJoint.Name = TransformNode.name().asChar(); + //NewJoint.Name = TransformNode.name().asChar(); MMatrix Matrix = TransformNode.transformationMatrix(); + //double tmp[3]; + //((MTransformationMatrix)Matrix).eulerRotation().asVector().get(tmp); + //NewJoint.Rotation[0] = tmp[0]; + //NewJoint.Rotation[1] = tmp[1]; + //NewJoint.Rotation[2] = tmp[2]; + //((MTransformationMatrix)Matrix).getScale(tmp, MSpace::Space::kTransform); + //NewJoint.Scale[0] = tmp[0]; + //NewJoint.Scale[1] = tmp[1]; + //NewJoint.Scale[2] = tmp[2]; + //((MTransformationMatrix)Matrix).getTranslation(MSpace::Space::kTransform).get(tmp); + //NewJoint.Translation[0] = tmp[0]; + //NewJoint.Translation[1] = tmp[1]; + //NewJoint.Translation[2] = tmp[2]; + for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { NewJoint.OffsetMatrix[i][j] = Matrix.matrix[i][j]; @@ -51,5 +55,79 @@ std::vector* Skeleton::DoIt() m_AllSkeletons.push_back(SkeletonStorage); - return &m_AllSkeletons; + return m_AllSkeletons; +} + +std::vector Skeleton::GetBindPoses() +{ + std::vector m_AllSkeletons; + std::vector m_Hierarchy; + + MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint); + BindPoseSkeletonNode SkeletonStorage; + + while (!jointIt.isDone()) { + MFnTransform MayaJoint(jointIt.currentItem()); + + if (MFnDependencyNode(MayaJoint.parent(0)).name() == "world") { + if (SkeletonStorage.Joints.size() != 0) { + m_AllSkeletons.push_back(SkeletonStorage); + + SkeletonStorage.Joints.clear(); + SkeletonStorage.Name.clear(); + SkeletonStorage.ParentIDs.clear(); + SkeletonStorage.Name.clear(); + } + + SkeletonStorage.Name = MayaJoint.name().asChar(); + SkeletonStorage.ParentIDs.push_back(-1); // This joint is root + } + else { + auto it = std::find(m_Hierarchy.begin(), m_Hierarchy.end(), MayaJoint.parent(0)); + if (it != m_Hierarchy.end()) { + SkeletonStorage.ParentIDs.push_back(it - m_Hierarchy.begin()); + } + else { + MGlobal::displayError(MString() + "Could not find joint parent for: " + MayaJoint.name()); + } + } + m_Hierarchy.push_back(MayaJoint.object()); + + Joint NewJoint; + + MPlug BindPose = MayaJoint.findPlug("bindPose"); + MDataHandle DataHandle; + BindPose.getValue(DataHandle); + MFnMatrixData MartixFn(DataHandle.data()); + MMatrix Matrix = MartixFn.matrix(); + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + NewJoint.OffsetMatrix[i][j] = Matrix.matrix[i][j]; + } + } + + /*double tmp[3]; + ((MTransformationMatrix)Matrix).eulerRotation().asVector().get(tmp); + NewJoint.Rotation[0] = tmp[0]; + NewJoint.Rotation[1] = tmp[1]; + NewJoint.Rotation[2] = tmp[2]; + ((MTransformationMatrix)Matrix).getScale(tmp, MSpace::Space::kTransform); + NewJoint.Scale[0] = tmp[0]; + NewJoint.Scale[1] = tmp[1]; + NewJoint.Scale[2] = tmp[2]; + ((MTransformationMatrix)Matrix).getTranslation(MSpace::Space::kTransform).get(tmp); + NewJoint.Translation[0] = tmp[0]; + NewJoint.Translation[1] = tmp[1]; + NewJoint.Translation[2] = tmp[2];*/ + + SkeletonStorage.Joints.push_back(NewJoint); + SkeletonStorage.JointNames.push_back(MayaJoint.name().asChar()); + + jointIt.next(); + } + + m_AllSkeletons.push_back(SkeletonStorage); + + return m_AllSkeletons; } \ No newline at end of file diff --git a/tools/MayaExporter/MayaExporter/Skeleton.h b/tools/MayaExporter/MayaExporter/Skeleton.h index 26e99d4b..3ee01224 100644 --- a/tools/MayaExporter/MayaExporter/Skeleton.h +++ b/tools/MayaExporter/MayaExporter/Skeleton.h @@ -7,12 +7,11 @@ #include "MayaIncludes.h" struct Joint { - int ParentIndex; + //int ParentIndex; //std::array Rotation; //std::array Translation; //std::array Scale; std::array, 4> OffsetMatrix; - std::string Name; }; struct SkeletonNode { @@ -20,12 +19,16 @@ struct SkeletonNode { std::vector Joints; }; +struct BindPoseSkeletonNode : SkeletonNode { + std::vector ParentIDs; + std::vector JointNames; +}; + class Skeleton { public: - std::vector* DoIt(); + std::vector DoIt(); + std::vector GetBindPoses(); private: - std::vector m_AllSkeletons; - std::vector m_Hierarchy; }; #endif //Skeleton_Skeleton_h__ \ No newline at end of file