void MayaTransformWriter::pushTransformStack(const MFnTransform & iTrans, bool iForceStatic) { // inspect the translate addTranslate(iTrans, "translate", "translateX", "translateY", "translateZ", Alembic::AbcGeom::kTranslateHint, false, iForceStatic, false, mSample, mAnimChanList); // inspect the rotate pivot translate addTranslate(iTrans, "rotatePivotTranslate", "rotatePivotTranslateX", "rotatePivotTranslateY", "rotatePivotTranslateZ", Alembic::AbcGeom::kRotatePivotTranslationHint, false, iForceStatic, false, mSample, mAnimChanList); // inspect the rotate pivot addTranslate(iTrans, "rotatePivot", "rotatePivotX", "rotatePivotY", "rotatePivotZ", Alembic::AbcGeom::kRotatePivotPointHint, false, iForceStatic, false, mSample, mAnimChanList); // inspect rotate names MString rotateNames[3]; rotateNames[0] = "rotateX"; rotateNames[1] = "rotateY"; rotateNames[2] = "rotateZ"; unsigned int rotOrder[3]; // if this returns false then the rotation order was kInvalid or kLast MTransformationMatrix::RotationOrder eRotOrder(iTrans.rotationOrder()); if (util::getRotOrder(eRotOrder, rotOrder[0], rotOrder[1], rotOrder[2])) { addRotate(iTrans, "rotate", rotateNames, rotOrder, Alembic::AbcGeom::kRotateHint, iForceStatic, false, mSample, mAnimChanList, mRotateOpIndex); } // now look at the rotation orientation, aka rotate axis rotateNames[0] = "rotateAxisX"; rotateNames[1] = "rotateAxisY"; rotateNames[2] = "rotateAxisZ"; rotOrder[0] = 0; rotOrder[1] = 1; rotOrder[2] = 2; addRotate(iTrans, "rotateAxis", rotateNames, rotOrder, Alembic::AbcGeom::kRotateOrientationHint, iForceStatic, false, mSample, mAnimChanList, mRotateAxisOpIndex); // invert the rotate pivot if necessary addTranslate(iTrans, "rotatePivot", "rotatePivotX", "rotatePivotY", "rotatePivotZ", Alembic::AbcGeom::kRotatePivotPointHint, true, iForceStatic, false, mSample, mAnimChanList); // inspect the scale pivot translation addTranslate(iTrans, "scalePivotTranslate", "scalePivotTranslateX", "scalePivotTranslateY", "scalePivotTranslateZ", Alembic::AbcGeom::kScalePivotTranslationHint, false, iForceStatic, false, mSample, mAnimChanList); // inspect the scale pivot point addTranslate(iTrans, "scalePivot", "scalePivotX", "scalePivotY", "scalePivotZ", Alembic::AbcGeom::kScalePivotPointHint, false, iForceStatic, false, mSample, mAnimChanList); // inspect the shear addShear(iTrans, iForceStatic, mSample, mAnimChanList); // add the scale addScale(iTrans, "scale", "scaleX", "scaleY", "scaleZ", false, iForceStatic, false, mSample, mAnimChanList); // inverse the scale pivot point if necessary addTranslate(iTrans, "scalePivot", "scalePivotX", "scalePivotY", "scalePivotZ", Alembic::AbcGeom::kScalePivotPointHint, true, iForceStatic, false, mSample, mAnimChanList); // remember current rotation if (mFilterEulerRotations) { double xx(0), yy(0), zz(0); // there are 2 rotation order enum definitions: // MEulerRotation::RotationOrder = MTransformationMatrix::RotationOrder-1 if (getSampledRotation( mSample, mRotateOpIndex, xx, yy, zz )) { mPrevRotateSolution.setValue(xx, yy, zz, (MEulerRotation::RotationOrder)(eRotOrder-1)); } if (getSampledRotation( mSample, mRotateAxisOpIndex, xx, yy, zz )) { mPrevRotateAxisSolution.setValue(xx, yy, zz, MEulerRotation::kXYZ); } } }
void MayaTransformWriter::pushTransformStack(double iFrame, const MFnTransform & iTrans) { bool forceStatic = (iFrame == DBL_MAX); // inspect the translate addTranslate(iTrans, "translate", "translateX", "translateY", "translateZ", Alembic::AbcGeom::kTranslateHint, false, forceStatic, mSample, mAnimChanList); // inspect the rotate pivot translate addTranslate(iTrans, "rotatePivotTranslate", "rotatePivotTranslateX", "rotatePivotTranslateY", "rotatePivotTranslateZ", Alembic::AbcGeom::kRotatePivotTranslationHint, false, forceStatic, mSample, mAnimChanList); // inspect the rotate pivot addTranslate(iTrans, "rotatePivot", "rotatePivotX", "rotatePivotY", "rotatePivotZ", Alembic::AbcGeom::kRotatePivotPointHint, false, forceStatic, mSample, mAnimChanList); // inspect rotate names MString rotateNames[3]; rotateNames[0] = "rotateX"; rotateNames[1] = "rotateY"; rotateNames[2] = "rotateZ"; unsigned int rotOrder[3]; // if this returns false then the rotation order was kInvalid or kLast if (util::getRotOrder(iTrans.rotationOrder(), rotOrder[0], rotOrder[1], rotOrder[2])) { addRotate(iTrans, "rotate", rotateNames, rotOrder, Alembic::AbcGeom::kRotateHint, forceStatic, false, mSample, mAnimChanList); } // now look at the rotation orientation, aka rotate axis rotateNames[0] = "rotateAxisX"; rotateNames[1] = "rotateAxisY"; rotateNames[2] = "rotateAxisZ"; rotOrder[0] = 0; rotOrder[1] = 1; rotOrder[2] = 2; addRotate(iTrans, "rotateAxis", rotateNames, rotOrder, Alembic::AbcGeom::kRotateOrientationHint, forceStatic, false, mSample, mAnimChanList); // invert the rotate pivot if necessary addTranslate(iTrans, "rotatePivot", "rotatePivotX", "rotatePivotY", "rotatePivotZ", Alembic::AbcGeom::kRotatePivotPointHint, true, forceStatic, mSample, mAnimChanList); // inspect the scale pivot translation addTranslate(iTrans, "scalePivotTranslate", "scalePivotTranslateX", "scalePivotTranslateY", "scalePivotTranslateZ", Alembic::AbcGeom::kScalePivotTranslationHint, false, forceStatic, mSample, mAnimChanList); // inspect the scale pivot point addTranslate(iTrans, "scalePivot", "scalePivotX", "scalePivotY", "scalePivotZ", Alembic::AbcGeom::kScalePivotPointHint, false, forceStatic, mSample, mAnimChanList); // inspect the shear addShear(iTrans, forceStatic, mSample, mAnimChanList); // add the scale addScale(iTrans, "scale", "scaleX", "scaleY", "scaleZ", forceStatic, mSample, mAnimChanList); // inverse the scale pivot point if necessary addTranslate(iTrans, "scalePivot", "scalePivotX", "scalePivotY", "scalePivotZ", Alembic::AbcGeom::kScalePivotPointHint, true, forceStatic, mSample, mAnimChanList); }