Changed the way we're exporting animations.

This commit is contained in:
antc13
2016-02-02 14:47:22 +01:00
parent 210e11e659
commit e8186a7062
4 changed files with 267 additions and 219 deletions
+1 -1
View File
@@ -89,7 +89,7 @@ private:
void ReadAnimationJoint(unsigned int &offset, char* fileData, unsigned int& fileByteSize); void ReadAnimationJoint(unsigned int &offset, char* fileData, unsigned int& fileByteSize);
void ReadAnimationClips(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int numberOfClips); void ReadAnimationClips(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int numberOfClips);
void ReadAnimationClipSingle(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int clipIndex); void ReadAnimationClipSingle(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int clipIndex);
void ReadAnimationKeyFrame(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int numberOfJoints, Skeleton::Animation& animation); void ReadAnimationKeyFrame(unsigned int &offset, char* fileData, unsigned int& fileByteSize, Skeleton::Animation& animation);
//void CreateSkeleton(std::vector<std::tuple<std::string, glm::mat4>> &boneInfo, std::map<std::string, int> &boneNameMapping, aiNode* node, int parentID); //void CreateSkeleton(std::vector<std::tuple<std::string, glm::mat4>> &boneInfo, std::map<std::string, int> &boneNameMapping, aiNode* node, int parentID);
}; };
+8 -8
View File
@@ -327,22 +327,16 @@ void RawModelCustom::ReadAnimationClipSingle(unsigned int &offset, char* fileDat
unsigned int nrOfKeyframes = *(unsigned int*)(fileData + offset); unsigned int nrOfKeyframes = *(unsigned int*)(fileData + offset);
offset += sizeof(unsigned int); offset += sizeof(unsigned int);
if (offset + sizeof(unsigned int) > fileByteSize) {
throw Resource::FailedLoadingException("Reading AnimationClip NrOfJoints failed");
}
unsigned int nrOfJoints = *(unsigned int*)(fileData + offset);
offset += sizeof(unsigned int);
newAnimation.Keyframes.reserve(nrOfKeyframes); newAnimation.Keyframes.reserve(nrOfKeyframes);
for (unsigned int i = 0; i < nrOfKeyframes; i++) { for (unsigned int i = 0; i < nrOfKeyframes; i++) {
ReadAnimationKeyFrame(offset, fileData, fileByteSize, nrOfJoints, newAnimation); ReadAnimationKeyFrame(offset, fileData, fileByteSize, newAnimation);
} }
m_Skeleton->Animations[newAnimation.Name] = newAnimation; m_Skeleton->Animations[newAnimation.Name] = newAnimation;
#else #else
#endif #endif
} }
void RawModelCustom::ReadAnimationKeyFrame(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int nrOfJoints, Skeleton::Animation& animation) void RawModelCustom::ReadAnimationKeyFrame(unsigned int &offset, char* fileData, unsigned int& fileByteSize, Skeleton::Animation& animation)
{ {
Skeleton::Animation::Keyframe newKeyFrame; Skeleton::Animation::Keyframe newKeyFrame;
@@ -358,6 +352,12 @@ void RawModelCustom::ReadAnimationKeyFrame(unsigned int &offset, char* fileData,
newKeyFrame.Time = *(float*)(fileData + offset); newKeyFrame.Time = *(float*)(fileData + offset);
offset += sizeof(float); offset += sizeof(float);
if (offset + sizeof(unsigned int) > fileByteSize) {
throw Resource::FailedLoadingException("Reading AnimationKeyFrame NrOfJoints failed");
}
unsigned int nrOfJoints = *(unsigned int*)(fileData + offset);
offset += sizeof(unsigned int);
if (offset + sizeof(Skeleton::Animation::Keyframe::BoneProperty) * nrOfJoints> fileByteSize) { if (offset + sizeof(Skeleton::Animation::Keyframe::BoneProperty) * nrOfJoints> fileByteSize) {
throw Resource::FailedLoadingException("Reading AnimationKeyFrame joints failed"); throw Resource::FailedLoadingException("Reading AnimationKeyFrame joints failed");
} }
+254 -206
View File
@@ -68,92 +68,92 @@ Animation Skeleton::GetAnimData(std::string animationName, int startFrame, int e
std::vector<MObject> animatedJoints; std::vector<MObject> animatedJoints;
std::vector<MObject> m_Hierarchy; std::vector<MObject> m_Hierarchy;
Animation returnData; Animation returnData;
double oneDivSixty = 1 / 60.0; double oneDivSixty = 1 / 60.0;
returnData.Name = animationName; returnData.Name = animationName;
returnData.nameLength = animationName.size() + 1; returnData.nameLength = animationName.size() + 1;
returnData.Duration = (endFrame - startFrame) * oneDivSixty; returnData.Duration = (endFrame - startFrame) * oneDivSixty;
std::map<std::string, std::array<std::array<double, 4>, 4>> joinCheckMap; std::map<std::string, std::array<std::array<double, 4>, 4>> joinCheckMap;
std::map<std::string, bool> exportJoint; std::map<std::string, bool> exportJoint;
MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint); //MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint);
for (unsigned int i = startFrame; i <= endFrame; i++) //for (unsigned int i = startFrame; i <= endFrame; i++)
{ //{
MAnimControl::setCurrentTime(MTime(i, MTime::kNTSCField)); // MAnimControl::setCurrentTime(MTime(i, MTime::kNTSCField));
while (!jointIt.isDone()) // while (!jointIt.isDone())
{ // {
m_Hierarchy.push_back(jointIt.item()); // m_Hierarchy.push_back(jointIt.item());
MFnTransform MayaJoint(jointIt.item()); // MFnTransform MayaJoint(jointIt.item());
MMatrix transformationMatrix = MayaJoint.transformationMatrix(); // MMatrix transformationMatrix = MayaJoint.transformationMatrix();
if (i == startFrame) // if (i == startFrame)
{ // {
double doubleMat[4][4]; // double doubleMat[4][4];
transformationMatrix.get(doubleMat); // transformationMatrix.get(doubleMat);
joinCheckMap[MayaJoint.name().asChar()][0][0] = doubleMat[0][0]; // joinCheckMap[MayaJoint.name().asChar()][0][0] = doubleMat[0][0];
joinCheckMap[MayaJoint.name().asChar()][0][1] = doubleMat[0][1]; // joinCheckMap[MayaJoint.name().asChar()][0][1] = doubleMat[0][1];
joinCheckMap[MayaJoint.name().asChar()][0][2] = doubleMat[0][2]; // joinCheckMap[MayaJoint.name().asChar()][0][2] = doubleMat[0][2];
joinCheckMap[MayaJoint.name().asChar()][0][3] = doubleMat[0][3]; // joinCheckMap[MayaJoint.name().asChar()][0][3] = doubleMat[0][3];
joinCheckMap[MayaJoint.name().asChar()][1][0] = doubleMat[1][0]; // joinCheckMap[MayaJoint.name().asChar()][1][0] = doubleMat[1][0];
joinCheckMap[MayaJoint.name().asChar()][1][1] = doubleMat[1][1]; // joinCheckMap[MayaJoint.name().asChar()][1][1] = doubleMat[1][1];
joinCheckMap[MayaJoint.name().asChar()][1][2] = doubleMat[1][2]; // joinCheckMap[MayaJoint.name().asChar()][1][2] = doubleMat[1][2];
joinCheckMap[MayaJoint.name().asChar()][1][3] = doubleMat[1][3]; // joinCheckMap[MayaJoint.name().asChar()][1][3] = doubleMat[1][3];
joinCheckMap[MayaJoint.name().asChar()][2][0] = doubleMat[2][0]; // joinCheckMap[MayaJoint.name().asChar()][2][0] = doubleMat[2][0];
joinCheckMap[MayaJoint.name().asChar()][2][1] = doubleMat[2][1]; // joinCheckMap[MayaJoint.name().asChar()][2][1] = doubleMat[2][1];
joinCheckMap[MayaJoint.name().asChar()][2][2] = doubleMat[2][2]; // joinCheckMap[MayaJoint.name().asChar()][2][2] = doubleMat[2][2];
joinCheckMap[MayaJoint.name().asChar()][2][3] = doubleMat[2][3]; // joinCheckMap[MayaJoint.name().asChar()][2][3] = doubleMat[2][3];
joinCheckMap[MayaJoint.name().asChar()][3][0] = doubleMat[3][0]; // joinCheckMap[MayaJoint.name().asChar()][3][0] = doubleMat[3][0];
joinCheckMap[MayaJoint.name().asChar()][3][1] = doubleMat[3][1]; // joinCheckMap[MayaJoint.name().asChar()][3][1] = doubleMat[3][1];
joinCheckMap[MayaJoint.name().asChar()][3][2] = doubleMat[3][2]; // joinCheckMap[MayaJoint.name().asChar()][3][2] = doubleMat[3][2];
joinCheckMap[MayaJoint.name().asChar()][3][3] = doubleMat[3][3]; // joinCheckMap[MayaJoint.name().asChar()][3][3] = doubleMat[3][3];
exportJoint[MayaJoint.name().asChar()] = false; // exportJoint[MayaJoint.name().asChar()] = false;
} // }
else if(!exportJoint[MayaJoint.name().asChar()])//!exportJoint[MayaJoint.name().asChar()]) // else if(!exportJoint[MayaJoint.name().asChar()])//!exportJoint[MayaJoint.name().asChar()])
{ // {
double doubleMat[4][4]; // double doubleMat[4][4];
doubleMat[0][0] = joinCheckMap[MayaJoint.name().asChar()][0][0]; // doubleMat[0][0] = joinCheckMap[MayaJoint.name().asChar()][0][0];
doubleMat[0][1] = joinCheckMap[MayaJoint.name().asChar()][0][1]; // doubleMat[0][1] = joinCheckMap[MayaJoint.name().asChar()][0][1];
doubleMat[0][2] = joinCheckMap[MayaJoint.name().asChar()][0][2]; // doubleMat[0][2] = joinCheckMap[MayaJoint.name().asChar()][0][2];
doubleMat[0][3] = joinCheckMap[MayaJoint.name().asChar()][0][3]; // doubleMat[0][3] = joinCheckMap[MayaJoint.name().asChar()][0][3];
doubleMat[1][0] = joinCheckMap[MayaJoint.name().asChar()][1][0]; // doubleMat[1][0] = joinCheckMap[MayaJoint.name().asChar()][1][0];
doubleMat[1][1] = joinCheckMap[MayaJoint.name().asChar()][1][1]; // doubleMat[1][1] = joinCheckMap[MayaJoint.name().asChar()][1][1];
doubleMat[1][2] = joinCheckMap[MayaJoint.name().asChar()][1][2]; // doubleMat[1][2] = joinCheckMap[MayaJoint.name().asChar()][1][2];
doubleMat[1][3] = joinCheckMap[MayaJoint.name().asChar()][1][3]; // doubleMat[1][3] = joinCheckMap[MayaJoint.name().asChar()][1][3];
doubleMat[2][0] = joinCheckMap[MayaJoint.name().asChar()][2][0]; // doubleMat[2][0] = joinCheckMap[MayaJoint.name().asChar()][2][0];
doubleMat[2][1] = joinCheckMap[MayaJoint.name().asChar()][2][1]; // doubleMat[2][1] = joinCheckMap[MayaJoint.name().asChar()][2][1];
doubleMat[2][2] = joinCheckMap[MayaJoint.name().asChar()][2][2]; // doubleMat[2][2] = joinCheckMap[MayaJoint.name().asChar()][2][2];
doubleMat[2][3] = joinCheckMap[MayaJoint.name().asChar()][2][3]; // doubleMat[2][3] = joinCheckMap[MayaJoint.name().asChar()][2][3];
doubleMat[3][0] = joinCheckMap[MayaJoint.name().asChar()][3][0]; // doubleMat[3][0] = joinCheckMap[MayaJoint.name().asChar()][3][0];
doubleMat[3][1] = joinCheckMap[MayaJoint.name().asChar()][3][1]; // doubleMat[3][1] = joinCheckMap[MayaJoint.name().asChar()][3][1];
doubleMat[3][2] = joinCheckMap[MayaJoint.name().asChar()][3][2]; // doubleMat[3][2] = joinCheckMap[MayaJoint.name().asChar()][3][2];
doubleMat[3][3] = joinCheckMap[MayaJoint.name().asChar()][3][3]; // doubleMat[3][3] = joinCheckMap[MayaJoint.name().asChar()][3][3];
MMatrix tmp(doubleMat); // MMatrix tmp(doubleMat);
if (!tmp.isEquivalent(transformationMatrix)) { // if (!tmp.isEquivalent(transformationMatrix)) {
MGlobal::displayInfo(MString() + MayaJoint.name() + " is exported"); // MGlobal::displayInfo(MString() + MayaJoint.name() + " is exported");
exportJoint[MayaJoint.name().asChar()] = true; // exportJoint[MayaJoint.name().asChar()] = true;
animatedJoints.push_back(MayaJoint.object()); // animatedJoints.push_back(MayaJoint.object());
} // }
} // }
/*for (int i = 0; i < 9; i++) /*for (int i = 0; i < 9; i++)
{ {
MStatus tmp; MStatus tmp;
MPlug plug = depNode.findPlug(attr[i].c_str(), &tmp); MPlug plug = depNode.findPlug(attr[i].c_str(), &tmp);
MPlugArray connections; MPlugArray connections;
plug.connectedTo(connections, true, false, 0); plug.connectedTo(connections, true, false, 0);
for (int j = 0; j != connections.length(); j++) { for (int j = 0; j != connections.length(); j++) {
MObject connected = connections[j].node(); MObject connected = connections[j].node();
if (connected.hasFn(MFn::kAnimCurve)) { if (connected.hasFn(MFn::kAnimCurve)) {
MFnAnimCurve jointAnim(connected); MFnAnimCurve jointAnim(connected);
//MGlobal::displayInfo(MString() + "curve : " + jointAnim.name()); //MGlobal::displayInfo(MString() + "curve : " + jointAnim.name());
//MGlobal::displayInfo(MString() + "curve keys : " + jointAnim.numKeys()); //MGlobal::displayInfo(MString() + "curve keys : " + jointAnim.numKeys());
@@ -161,89 +161,133 @@ Animation Skeleton::GetAnimData(std::string animationName, int startFrame, int e
//MGlobal::displayInfo(MString() + "startFrame : " + startFrame); //MGlobal::displayInfo(MString() + "startFrame : " + startFrame);
//MGlobal::displayInfo(MString() + "endFrame : " + endFrame); //MGlobal::displayInfo(MString() + "endFrame : " + endFrame);
unsigned int startKeyFrameIndex = jointAnim.findClosest(MTime(startFrame, MTime::kNTSCField), &tmp); unsigned int startKeyFrameIndex = jointAnim.findClosest(MTime(startFrame, MTime::kNTSCField), &tmp);
if (tmp == MStatus::kFailure) if (tmp == MStatus::kFailure)
MGlobal::displayInfo(MString() + "Fail :c"); MGlobal::displayInfo(MString() + "Fail :c");
if (startFrame * oneDivSixty <= jointAnim.time(startKeyFrameIndex).value() && jointAnim.time(startKeyFrameIndex).value() <= endFrame * oneDivSixty) { if (startFrame * oneDivSixty <= jointAnim.time(startKeyFrameIndex).value() && jointAnim.time(startKeyFrameIndex).value() <= endFrame * oneDivSixty) {
//MGlobal::displayInfo(MString() + "Start key time : " + jointAnim.time(startKeyFrameIndex).value()); //MGlobal::displayInfo(MString() + "Start key time : " + jointAnim.time(startKeyFrameIndex).value());
if (startFrame <= jointAnim.time(startKeyFrameIndex).value() && jointAnim.time(startKeyFrameIndex).value() <= endFrame ) { if (startFrame <= jointAnim.time(startKeyFrameIndex).value() && jointAnim.time(startKeyFrameIndex).value() <= endFrame ) {
animatedJoints.push_back(jointIt.item()); animatedJoints.push_back(jointIt.item());
i = 9; i = 9;
break; break;
} }
unsigned int endKeyFrameIndex = jointAnim.findClosest(MTime(endFrame, MTime::kNTSCField)); unsigned int endKeyFrameIndex = jointAnim.findClosest(MTime(endFrame, MTime::kNTSCField));
MGlobal::displayInfo(MString() + startKeyFrameIndex + " " + endKeyFrameIndex); MGlobal::displayInfo(MString() + startKeyFrameIndex + " " + endKeyFrameIndex);
MGlobal::displayInfo(MString() + "Fail!!!!!!!!!!!!!!!!!!!!!!!!!"); MGlobal::displayInfo(MString() + "Fail!!!!!!!!!!!!!!!!!!!!!!!!!");
if (startFrame * oneDivSixty <= jointAnim.time(endKeyFrameIndex).value() && jointAnim.time(endKeyFrameIndex).value() <= endFrame * oneDivSixty || endKeyFrameIndex - startKeyFrameIndex > 0) { if (startFrame * oneDivSixty <= jointAnim.time(endKeyFrameIndex).value() && jointAnim.time(endKeyFrameIndex).value() <= endFrame * oneDivSixty || endKeyFrameIndex - startKeyFrameIndex > 0) {
//MGlobal::displayInfo(MString() + "End key index : " + endKeyFrameIndex); //MGlobal::displayInfo(MString() + "End key index : " + endKeyFrameIndex);
//MGlobal::displayInfo(MString() + "end key time : " + jointAnim.time(endKeyFrameIndex).value()); //MGlobal::displayInfo(MString() + "end key time : " + jointAnim.time(endKeyFrameIndex).value());
/*MGlobal::displayInfo(MString() + "start keyfram index: " + startKeyFrameIndex + ". End keyfram index: " + endKeyFrameIndex + ".");*/ /*MGlobal::displayInfo(MString() + "start keyfram index: " + startKeyFrameIndex + ". End keyfram index: " + endKeyFrameIndex + ".");*/
if (startFrame <= jointAnim.time(endKeyFrameIndex).value() && jointAnim.time(endKeyFrameIndex).value() <= endFrame || endKeyFrameIndex - startKeyFrameIndex > 0) { /*if (startFrame <= jointAnim.time(endKeyFrameIndex).value() && jointAnim.time(endKeyFrameIndex).value() <= endFrame || endKeyFrameIndex - startKeyFrameIndex > 0) {
animatedJoints.push_back(jointIt.item()); animatedJoints.push_back(jointIt.item());
i = 9; i = 9;
break; break;
} }
MFnTransform MayaJoint(jointIt.item()); MFnTransform MayaJoint(jointIt.item());
MPlug BindPose = MayaJoint.findPlug("bindPose"); MPlug BindPose = MayaJoint.findPlug("bindPose");
MDataHandle DataHandle; MDataHandle DataHandle;
BindPose.getValue(DataHandle); BindPose.getValue(DataHandle);
MFnMatrixData MartixFn(DataHandle.data()); MFnMatrixData MartixFn(DataHandle.data());
MMatrix BindPoseMatrix = MartixFn.matrix(); MMatrix BindPoseMatrix = MartixFn.matrix();
if (!BindPoseMatrix.isEquivalent(MayaJoint.transformationMatrix())) if (!BindPoseMatrix.isEquivalent(MayaJoint.transformationMatrix()))
{ {
MGlobal::displayError(MString() + animationName.c_str() + " is using " + MayaJoint.name() + " that is not in bind pose nor is it key framed in the animation, the exported animation will NOT correspond to the animation in Maya"); MGlobal::displayError(MString() + animationName.c_str() + " is using " + MayaJoint.name() + " that is not in bind pose nor is it key framed in the animation, the exported animation will NOT correspond to the animation in Maya");
} }
} }
} }
}*/ }
} // end of int i loop } // end of int i loop*/
jointIt.next(); /* jointIt.next();
} }
jointIt.reset(); jointIt.reset();
} }*/
int currentFrame = startFrame; int currentFrame = startFrame;
while (currentFrame <= endFrame) { // ANDREAS while (currentFrame <= endFrame) { // ANDREAS
Animation::Keyframe thisKeyFrame; Animation::Keyframe thisKeyFrame;
thisKeyFrame.Index = currentFrame - startFrame; thisKeyFrame.Index = currentFrame - startFrame;
thisKeyFrame.Time = thisKeyFrame.Index * oneDivSixty; thisKeyFrame.Time = thisKeyFrame.Index * oneDivSixty;
MAnimControl::setCurrentTime(MTime(currentFrame, MTime::kNTSCField)); MAnimControl::setCurrentTime(MTime(currentFrame, MTime::kNTSCField));
MTime time = MAnimControl::currentTime(); MTime time = MAnimControl::currentTime();
for (auto aJoint : animatedJoints){ MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint);
MFnTransform thisJoint(aJoint); unsigned int jointID = 0;
Animation::Keyframe::JointProperty joint; while (!jointIt.isDone()) {
MFnTransform thisJoint(jointIt.currentItem());
MMatrix transformationMatrix = thisJoint.transformationMatrix();
double doubleMat[4][4];
auto it = std::find(m_Hierarchy.begin(), m_Hierarchy.end(), thisJoint.object()); if (currentFrame != startFrame){
if (it != m_Hierarchy.end()) { Animation::Keyframe::JointProperty joint;
joint.ID = it - m_Hierarchy.begin();
} doubleMat[0][0] = joinCheckMap[thisJoint.name().asChar()][0][0];
else { doubleMat[0][1] = joinCheckMap[thisJoint.name().asChar()][0][1];
MGlobal::displayError(MString() + "Could not find joint ID for: " + thisJoint.name()); doubleMat[0][2] = joinCheckMap[thisJoint.name().asChar()][0][2];
} doubleMat[0][3] = joinCheckMap[thisJoint.name().asChar()][0][3];
doubleMat[1][0] = joinCheckMap[thisJoint.name().asChar()][1][0];
MTransformationMatrix Matrix = thisJoint.transformation(); doubleMat[1][1] = joinCheckMap[thisJoint.name().asChar()][1][1];
doubleMat[1][2] = joinCheckMap[thisJoint.name().asChar()][1][2];
doubleMat[1][3] = joinCheckMap[thisJoint.name().asChar()][1][3];
doubleMat[2][0] = joinCheckMap[thisJoint.name().asChar()][2][0];
doubleMat[2][1] = joinCheckMap[thisJoint.name().asChar()][2][1];
doubleMat[2][2] = joinCheckMap[thisJoint.name().asChar()][2][2];
doubleMat[2][3] = joinCheckMap[thisJoint.name().asChar()][2][3];
doubleMat[3][0] = joinCheckMap[thisJoint.name().asChar()][3][0];
doubleMat[3][1] = joinCheckMap[thisJoint.name().asChar()][3][1];
doubleMat[3][2] = joinCheckMap[thisJoint.name().asChar()][3][2];
doubleMat[3][3] = joinCheckMap[thisJoint.name().asChar()][3][3];
MMatrix LastJointMatrix(doubleMat);
//Is same as last KeyFrame
if (LastJointMatrix.isEquivalent(transformationMatrix)) {
jointID++;
jointIt.next();
continue;
}
}
transformationMatrix.get(doubleMat);
joinCheckMap[thisJoint.name().asChar()][0][0] = doubleMat[0][0];
joinCheckMap[thisJoint.name().asChar()][0][1] = doubleMat[0][1];
joinCheckMap[thisJoint.name().asChar()][0][2] = doubleMat[0][2];
joinCheckMap[thisJoint.name().asChar()][0][3] = doubleMat[0][3];
joinCheckMap[thisJoint.name().asChar()][1][0] = doubleMat[1][0];
joinCheckMap[thisJoint.name().asChar()][1][1] = doubleMat[1][1];
joinCheckMap[thisJoint.name().asChar()][1][2] = doubleMat[1][2];
joinCheckMap[thisJoint.name().asChar()][1][3] = doubleMat[1][3];
joinCheckMap[thisJoint.name().asChar()][2][0] = doubleMat[2][0];
joinCheckMap[thisJoint.name().asChar()][2][1] = doubleMat[2][1];
joinCheckMap[thisJoint.name().asChar()][2][2] = doubleMat[2][2];
joinCheckMap[thisJoint.name().asChar()][2][3] = doubleMat[2][3];
joinCheckMap[thisJoint.name().asChar()][3][0] = doubleMat[3][0];
joinCheckMap[thisJoint.name().asChar()][3][1] = doubleMat[3][1];
joinCheckMap[thisJoint.name().asChar()][3][2] = doubleMat[3][2];
joinCheckMap[thisJoint.name().asChar()][3][3] = doubleMat[3][3];
MTransformationMatrix Matrix = thisJoint.transformation();
MPlug BindPose = thisJoint.findPlug("bindPose"); MPlug BindPose = thisJoint.findPlug("bindPose");
MDataHandle DataHandle; MDataHandle DataHandle;
BindPose.getValue(DataHandle); BindPose.getValue(DataHandle);
MFnMatrixData MartixFn(DataHandle.data()); MFnMatrixData MartixFn(DataHandle.data());
MMatrix BindPoseMatrix = MartixFn.matrix(); MMatrix BindPoseMatrix = MartixFn.matrix();
Matrix = Matrix.asMatrix(); Matrix = Matrix.asMatrix();
MObject jointOrientObj = thisJoint.attribute("jointOrient"); MObject jointOrientObj = thisJoint.attribute("jointOrient");
MFnNumericAttribute jointOrient(jointOrientObj); MFnNumericAttribute jointOrient(jointOrientObj);
double jointOrientDouble[3]; double jointOrientDouble[3];
@@ -257,79 +301,83 @@ Animation Skeleton::GetAnimData(std::string animationName, int startFrame, int e
MEulerRotation joEuler(jointOrientDouble[0], jointOrientDouble[1], jointOrientDouble[2]); MEulerRotation joEuler(jointOrientDouble[0], jointOrientDouble[1], jointOrientDouble[2]);
MQuaternion jo = joEuler.asQuaternion(); MQuaternion jo = joEuler.asQuaternion();
double tmp[4]; double tmp[4];
Matrix.getRotationQuaternion(tmp[0], tmp[1], tmp[2], tmp[3]); Matrix.getRotationQuaternion(tmp[0], tmp[1], tmp[2], tmp[3]);
MQuaternion rotation(tmp); MQuaternion rotation(tmp);
rotation = rotation * jo; rotation = rotation * jo;
rotation.get(tmp); rotation.get(tmp);
joint.Rotation[0] = tmp[0]; Animation::Keyframe::JointProperty joint;
joint.Rotation[1] = tmp[1]; joint.ID = jointID;
joint.Rotation[2] = tmp[2];
joint.Rotation[3] = tmp[3];
Matrix.getTranslation(MSpace::kTransform).get(tmp);
joint.Position[0] = tmp[0];
joint.Position[1] = tmp[1];
joint.Position[2] = tmp[2];
Matrix.getScale(tmp, MSpace::kTransform);
joint.Scale[0] = tmp[0];
joint.Scale[1] = tmp[1];
joint.Scale[2] = tmp[2];
thisKeyFrame.JointProperties.push_back(joint); joint.Rotation[0] = tmp[0];
} joint.Rotation[1] = tmp[1];
returnData.Keyframes.push_back(thisKeyFrame); joint.Rotation[2] = tmp[2];
currentFrame++; joint.Rotation[3] = tmp[3];
} Matrix.getTranslation(MSpace::kTransform).get(tmp);
joint.Position[0] = tmp[0];
joint.Position[1] = tmp[1];
joint.Position[2] = tmp[2];
Matrix.getScale(tmp, MSpace::kTransform);
joint.Scale[0] = tmp[0];
joint.Scale[1] = tmp[1];
joint.Scale[2] = tmp[2];
thisKeyFrame.JointProperties.push_back(joint);
jointID++;
jointIt.next();
}
thisKeyFrame.NumberOfJoints = thisKeyFrame.JointProperties.size();
returnData.Keyframes.push_back(thisKeyFrame);
currentFrame++;
}
returnData.NumKeyFrames = returnData.Keyframes.size(); returnData.NumKeyFrames = returnData.Keyframes.size();
returnData.NumberOfJoints = animatedJoints.size();
return returnData; return returnData;
} }
std::vector<BindPoseSkeletonNode> Skeleton::GetBindPoses() std::vector<BindPoseSkeletonNode> Skeleton::GetBindPoses()
{ {
MStatus status; MStatus status;
std::vector<BindPoseSkeletonNode> m_AllSkeletons; std::vector<BindPoseSkeletonNode> m_AllSkeletons;
std::vector<MObject> m_Hierarchy; std::vector<MObject> m_Hierarchy;
MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint); MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint);
BindPoseSkeletonNode SkeletonStorage; BindPoseSkeletonNode SkeletonStorage;
while (!jointIt.isDone()) { while (!jointIt.isDone()) {
MFnTransform MayaJoint(jointIt.currentItem()); MFnTransform MayaJoint(jointIt.currentItem());
BindPoseSkeletonNode::BindPoseJoint NewJoint; BindPoseSkeletonNode::BindPoseJoint NewJoint;
if (MFnDependencyNode(MayaJoint.parent(0)).object().apiType() != MFn::kJoint) { if (MFnDependencyNode(MayaJoint.parent(0)).object().apiType() != MFn::kJoint) {
if (SkeletonStorage.Joints.size() != 0) { if (SkeletonStorage.Joints.size() != 0) {
m_AllSkeletons.push_back(SkeletonStorage); m_AllSkeletons.push_back(SkeletonStorage);
SkeletonStorage.Joints.clear(); SkeletonStorage.Joints.clear();
SkeletonStorage.Name.clear(); SkeletonStorage.Name.clear();
} }
SkeletonStorage.Name = std::string(MayaJoint.name().asChar()); SkeletonStorage.Name = std::string(MayaJoint.name().asChar());
NewJoint.ParentID = -1; // This joint is root NewJoint.ParentID = -1; // This joint is root
} } else {
else { auto it = std::find(m_Hierarchy.begin(), m_Hierarchy.end(), MayaJoint.parent(0));
auto it = std::find(m_Hierarchy.begin(), m_Hierarchy.end(), MayaJoint.parent(0)); if (it != m_Hierarchy.end()) {
if (it != m_Hierarchy.end()) { NewJoint.ParentID = it - m_Hierarchy.begin();
NewJoint.ParentID = it - m_Hierarchy.begin(); } else {
} MGlobal::displayError(MString() + "Could not find joint parent for: " + MayaJoint.name());
else { }
MGlobal::displayError(MString() + "Could not find joint parent for: " + MayaJoint.name()); }
} m_Hierarchy.push_back(MayaJoint.object());
}
m_Hierarchy.push_back(MayaJoint.object());
MPlug BindPose = MayaJoint.findPlug("bindPose", &status); MPlug BindPose = MayaJoint.findPlug("bindPose", &status);
if (status != MS::kSuccess) { if (status != MS::kSuccess) {
MGlobal::displayError(MString() + "Could not find bindPose plug: " + status.errorString()); MGlobal::displayError(MString() + "Could not find bindPose plug: " + status.errorString());
} }
MDataHandle DataHandle; MDataHandle DataHandle;
BindPose.getValue(DataHandle); BindPose.getValue(DataHandle);
MFnMatrixData MartixFn(DataHandle.data()); MFnMatrixData MartixFn(DataHandle.data());
MMatrix Matrix = MartixFn.matrix(); MMatrix Matrix = MartixFn.matrix();
MVector tmp = MayaJoint.transformation().getTranslation(MSpace::kObject); MVector tmp = MayaJoint.transformation().getTranslation(MSpace::kObject);
@@ -342,7 +390,7 @@ std::vector<BindPoseSkeletonNode> Skeleton::GetBindPoses()
MTransformationMatrix::RotationOrder order = MTransformationMatrix::RotationOrder::kXYZ; MTransformationMatrix::RotationOrder order = MTransformationMatrix::RotationOrder::kXYZ;
MayaJoint.transformation().getRotation(test, order); MayaJoint.transformation().getRotation(test, order);
//----- test //----- test
@@ -389,33 +437,33 @@ std::vector<BindPoseSkeletonNode> Skeleton::GetBindPoses()
Matrix = Matrix.inverse(); Matrix = Matrix.inverse();
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) { for (int j = 0; j < 4; j++) {
NewJoint.OffsetMatrix[i][j] = Matrix.matrix[i][j]; NewJoint.OffsetMatrix[i][j] = Matrix.matrix[i][j];
} }
} }
NewJoint.Name = MayaJoint.name().asChar(); NewJoint.Name = MayaJoint.name().asChar();
NewJoint.NameLength = MayaJoint.name().length() + 1; NewJoint.NameLength = MayaJoint.name().length() + 1;
NewJoint.ID = SkeletonStorage.Joints.size(); NewJoint.ID = SkeletonStorage.Joints.size();
//double tmp[3]; //double tmp[3];
//((MTransformationMatrix)Matrix).eulerRotation().asVector().get(tmp); //((MTransformationMatrix)Matrix).eulerRotation().asVector().get(tmp);
//NewJoint.Rotation[0] = tmp[0]; //NewJoint.Rotation[0] = tmp[0];
//NewJoint.Rotation[1] = tmp[1]; //NewJoint.Rotation[1] = tmp[1];
//NewJoint.Rotation[2] = tmp[2]; //NewJoint.Rotation[2] = tmp[2];
//((MTransformationMatrix)Matrix).getScale(tmp, MSpace::Space::kTransform); //((MTransformationMatrix)Matrix).getScale(tmp, MSpace::Space::kTransform);
//NewJoint.Scale[0] = tmp[0]; //NewJoint.Scale[0] = tmp[0];
//NewJoint.Scale[1] = tmp[1]; //NewJoint.Scale[1] = tmp[1];
//NewJoint.Scale[2] = tmp[2]; //NewJoint.Scale[2] = tmp[2];
//((MTransformationMatrix)Matrix).getTranslation(MSpace::Space::kTransform).get(tmp); //((MTransformationMatrix)Matrix).getTranslation(MSpace::Space::kTransform).get(tmp);
//NewJoint.Translation[0] = tmp[0]; //NewJoint.Translation[0] = tmp[0];
//NewJoint.Translation[1] = tmp[1]; //NewJoint.Translation[1] = tmp[1];
//NewJoint.Translation[2] = tmp[2]; //NewJoint.Translation[2] = tmp[2];
SkeletonStorage.Joints.push_back(NewJoint); SkeletonStorage.Joints.push_back(NewJoint);
SkeletonStorage.numBones++; SkeletonStorage.numBones++;
jointIt.next(); jointIt.next();
} }
m_AllSkeletons.push_back(SkeletonStorage); m_AllSkeletons.push_back(SkeletonStorage);
return m_AllSkeletons; return m_AllSkeletons;
} }
+4 -4
View File
@@ -22,6 +22,7 @@ public:
int Index = 0; int Index = 0;
float Time = 0; float Time = 0;
int NumberOfJoints;
std::vector<JointProperty> JointProperties; std::vector<JointProperty> JointProperties;
}; };
@@ -29,7 +30,6 @@ public:
int nameLength = 0; int nameLength = 0;
float Duration = 0; float Duration = 0;
int NumKeyFrames = 0; int NumKeyFrames = 0;
int NumberOfJoints = 0;
std::vector<Keyframe> Keyframes; std::vector<Keyframe> Keyframes;
virtual void WriteBinary(std::ostream& out) virtual void WriteBinary(std::ostream& out)
@@ -38,11 +38,11 @@ public:
out.write(Name.c_str(), Name.size() + 1); out.write(Name.c_str(), Name.size() + 1);
out.write((char*)&Duration, sizeof(float)); out.write((char*)&Duration, sizeof(float));
out.write((char*)&NumKeyFrames, sizeof(int)); out.write((char*)&NumKeyFrames, sizeof(int));
out.write((char*)&NumberOfJoints, sizeof(int));
//Här under loopas alla key frames igenom //Här under loopas alla key frames igenom
for (auto aKeyframe : Keyframes) { for (auto aKeyframe : Keyframes) {
out.write((char*)&aKeyframe.Index, sizeof(int)); out.write((char*)&aKeyframe.Index, sizeof(int));
out.write((char*)&aKeyframe.Time, sizeof(float)); out.write((char*)&aKeyframe.Time, sizeof(float));
out.write((char*)&aKeyframe.NumberOfJoints, sizeof(int));
for (auto aJoint : aKeyframe.JointProperties) { for (auto aJoint : aKeyframe.JointProperties) {
out.write((char*)&aJoint.ID, sizeof(int)); out.write((char*)&aJoint.ID, sizeof(int));
out.write((char*)aJoint.Position, sizeof(float) * 3); out.write((char*)aJoint.Position, sizeof(float) * 3);
@@ -56,11 +56,11 @@ public:
{ {
out << "Animation Name: " << Name << endl; out << "Animation Name: " << Name << endl;
out << "Duration: " << Duration << endl; out << "Duration: " << Duration << endl;
out << "Number of KeyFrames: " << NumKeyFrames << endl; out << "Number of KeyFrames: " << NumKeyFrames << endl;
out << "Number of Joints: " << NumberOfJoints << endl;
for (auto aKeyframe : Keyframes) { for (auto aKeyframe : Keyframes) {
out << "Frame: " << aKeyframe.Index << endl; out << "Frame: " << aKeyframe.Index << endl;
out << "Time: " << aKeyframe.Time << endl; out << "Time: " << aKeyframe.Time << endl;
out << "Number of Joints: " << aKeyframe.NumberOfJoints << endl;
for (auto aJoint : aKeyframe.JointProperties) { for (auto aJoint : aKeyframe.JointProperties) {
out << "Joint ID: " << aJoint.ID << endl; out << "Joint ID: " << aJoint.ID << endl;
out << aJoint.Position[0] << " " << aJoint.Position[1] << " " << aJoint.Position[2] << endl; out << aJoint.Position[0] << " " << aJoint.Position[1] << " " << aJoint.Position[2] << endl;