// // Description: // Converts the tangent angles from Maya 2.* to Maya3.0+ formats. // protected void convertAnglesAndWeights2To3(MFnAnimCurve.AnimCurveType type, bool isWeighted, ref MAngle angle, ref double weight) { double oldAngle = angle.asRadians; double newAngle = oldAngle; double newWeight = weight; // Calculate the scale values for the conversion. // double xScale = 1.0; double yScale = 1.0; MTime tOne = new MTime(1.0, MTime.Unit.kSeconds); if (type == MFnAnimCurve.AnimCurveType.kAnimCurveTT || type == MFnAnimCurve.AnimCurveType.kAnimCurveTL || type == MFnAnimCurve.AnimCurveType.kAnimCurveTA || type == MFnAnimCurve.AnimCurveType.kAnimCurveTU) { xScale = tOne.asUnits(MTime.uiUnit); } switch (type) { case MFnAnimCurve.AnimCurveType.kAnimCurveTT: case MFnAnimCurve.AnimCurveType.kAnimCurveUT: yScale = tOne.asUnits(MTime.uiUnit); break; case MFnAnimCurve.AnimCurveType.kAnimCurveTL: case MFnAnimCurve.AnimCurveType.kAnimCurveUL: { MDistance dOne = new MDistance(1.0, MDistance.internalUnit); yScale = dOne.asUnits(linearUnit); } break; case MFnAnimCurve.AnimCurveType.kAnimCurveTA: case MFnAnimCurve.AnimCurveType.kAnimCurveUA: { MAngle aOne = new MAngle(1.0, MAngle.internalUnit); yScale = aOne.asUnits(angularUnit); } break; case MFnAnimCurve.AnimCurveType.kAnimCurveTU: case MFnAnimCurve.AnimCurveType.kAnimCurveUU: default: break; } const double quarter = Math.PI/2; if (isEquivalent(oldAngle, 0.0) || isEquivalent(oldAngle, quarter) || isEquivalent(oldAngle, -quarter)) { newAngle = oldAngle; if (isWeighted) { newWeight = yScale*oldAngle; } } else { double tanAngle = Math.Tan(oldAngle); newAngle = Math.Atan((yScale*tanAngle)/xScale); if (isWeighted) { double cosAngle = Math.Cos(oldAngle); double cosSq = cosAngle*cosAngle; double wSq = (weight*weight) * (((xScale*xScale - yScale*yScale)*cosSq) + (yScale*yScale)); newWeight = Math.Sqrt(wSq); } } weight = newWeight; MAngle finalAngle = new MAngle(newAngle, MAngle.Unit.kRadians); angle = finalAngle; }
// // Description: // Converts the tangent angles from Maya 3.0 to Maya2.* formats. // protected void convertAnglesAndWeights3To2(MFnAnimCurve.AnimCurveType type, bool isWeighted, ref MAngle angle, ref double weight) { double oldAngle = angle.asRadians; double newAngle = oldAngle; // Calculate the scale values for the conversion. // double xScale = 1.0; double yScale = 1.0; MTime tOne = new MTime(1.0, MTime.Unit.kSeconds); if (type == MFnAnimCurve.AnimCurveType.kAnimCurveTT || type == MFnAnimCurve.AnimCurveType.kAnimCurveTL || type == MFnAnimCurve.AnimCurveType.kAnimCurveTA || type == MFnAnimCurve.AnimCurveType.kAnimCurveTU) { xScale = tOne.asUnits(MTime.uiUnit); } switch (type) { case MFnAnimCurve.AnimCurveType.kAnimCurveTT: case MFnAnimCurve.AnimCurveType.kAnimCurveUT: yScale = tOne.asUnits(MTime.uiUnit); break; case MFnAnimCurve.AnimCurveType.kAnimCurveTL: case MFnAnimCurve.AnimCurveType.kAnimCurveUL: { MDistance dOne = new MDistance(1.0, MDistance.internalUnit); yScale = dOne.asUnits(linearUnit); } break; case MFnAnimCurve.AnimCurveType.kAnimCurveTA: case MFnAnimCurve.AnimCurveType.kAnimCurveUA: { MAngle aOne = new MAngle(1.0, MAngle.internalUnit); yScale = aOne.asUnits(angularUnit); } break; case MFnAnimCurve.AnimCurveType.kAnimCurveTU: case MFnAnimCurve.AnimCurveType.kAnimCurveUU: default: break; } double tanAngle = Math.Tan(oldAngle); newAngle = Math.Atan((xScale*tanAngle)/yScale); if (isWeighted) { double sinAngle = Math.Sin(oldAngle); double cosAngle = Math.Cos(oldAngle); double denominator = (yScale*yScale*sinAngle*sinAngle) + (xScale*xScale*cosAngle*cosAngle); weight = Math.Sqrt(weight/denominator); } MAngle finalAngle = new MAngle(newAngle, MAngle.Unit.kRadians); angle = finalAngle; }
// Description: // Write out the anim curve from the clipboard item into the // stream. The actual anim curve data is written out. // // This method returns true if the write was successful. // protected void writeAnimCurve(ref StreamWriter clip, MObject animCurveObj, MFnAnimCurve.AnimCurveType type, bool verboseUnits = false) { if (clip == null) { throw new ArgumentNullException( "clip" ); } if (null == animCurveObj || animCurveObj.isNull) { throw new ArgumentNullException( "animCurveObj" ); } MFnAnimCurve animCurve = new MFnAnimCurve(animCurveObj); clip.Write(kAnimData + kSpaceChar + kBraceLeftChar + Environment.NewLine); clip.Write(kTwoSpace + kInputString + kSpaceChar + boolInputTypeAsWord(animCurve.isUnitlessInput) + kSemiColonChar + Environment.NewLine); clip.Write( kTwoSpace + kOutputString + kSpaceChar + outputTypeAsWord(type) + kSemiColonChar + Environment.NewLine); clip.Write(kTwoSpace + kWeightedString + kSpaceChar + Convert.ToString(animCurve.isWeighted ? 1 : 0) + kSemiColonChar +Environment.NewLine); // These units default to the units in the header of the file. // if (verboseUnits) { clip.Write(kTwoSpace + kInputUnitString + kSpaceChar); if (animCurve.isTimeInput) { string unitName = ""; animUnitNames.setToShortName(timeUnit, ref unitName); clip.Write(unitName); } else { // The anim curve has unitless input. // clip.Write(animUnitNames.kUnitlessString); } clip.Write(kSemiColonChar + Environment.NewLine); clip.Write(kTwoSpace + kOutputUnitString + kSpaceChar); } double conversion = 1.0; switch (type) { case MFnAnimCurve.AnimCurveType.kAnimCurveTA: case MFnAnimCurve.AnimCurveType.kAnimCurveUA: { string unitName = ""; animUnitNames.setToShortName(angularUnit, ref unitName); if (verboseUnits) clip.Write(unitName); { MAngle angle = new MAngle(1.0); conversion = angle.asUnits(angularUnit); } break; } case MFnAnimCurve.AnimCurveType.kAnimCurveTL: case MFnAnimCurve.AnimCurveType.kAnimCurveUL: { string unitName = ""; animUnitNames.setToShortName(linearUnit, ref unitName); if (verboseUnits) clip.Write(unitName); { MDistance distance = new MDistance(1.0); conversion = distance.asUnits(linearUnit); } break; } case MFnAnimCurve.AnimCurveType.kAnimCurveTT: case MFnAnimCurve.AnimCurveType.kAnimCurveUT: { string unitName = ""; animUnitNames.setToShortName(timeUnit, ref unitName); if (verboseUnits) clip.Write(unitName); break; } default: if (verboseUnits) clip.Write(animUnitNames.kUnitlessString); break; } if (verboseUnits) clip.Write(kSemiColonChar +Environment.NewLine); if (verboseUnits) { string angleUnitName = ""; animUnitNames.setToShortName(angularUnit, ref angleUnitName); clip.Write(kTwoSpace + kTanAngleUnitString + kSpaceChar + angleUnitName + kSemiColonChar + Environment.NewLine); } clip.Write(kTwoSpace + kPreInfinityString + kSpaceChar + infinityTypeAsWord(animCurve.preInfinityType) + kSemiColonChar + Environment.NewLine); clip.Write(kTwoSpace + kPostInfinityString + kSpaceChar + infinityTypeAsWord(animCurve.postInfinityType) + kSemiColonChar + Environment.NewLine); clip.Write(kTwoSpace + kKeysString + kSpaceChar + kBraceLeftChar + Environment.NewLine); // And then write out each keyframe // uint numKeys = animCurve.numKeyframes; for (uint i = 0; i < numKeys; i++) { clip.Write(kTwoSpace + kTwoSpace); if (animCurve.isUnitlessInput) { clip.Write(animCurve.unitlessInput(i)); } else { clip.Write(animCurve.time(i).value); } // clamp tiny values so that it isn't so small it can't be read in // double animValue = (conversion*animCurve.value(i)); if (isEquivalent(animValue,0.0)) animValue = 0.0; clip.Write(kSpaceChar + Convert.ToString(animValue)); clip.Write(kSpaceChar + tangentTypeAsWord(animCurve.inTangentType(i)) ); clip.Write(kSpaceChar + tangentTypeAsWord(animCurve.outTangentType(i)) ); clip.Write( kSpaceChar + Convert.ToString(animCurve.tangentsLocked(i) ? 1 : 0)); clip.Write(kSpaceChar + Convert.ToString(animCurve.weightsLocked(i) ? 1 : 0)); clip.Write(kSpaceChar + Convert.ToString(animCurve.isBreakdown(i) ? 1 : 0)); if (animCurve.inTangentType(i) == MFnAnimCurve.TangentType.kTangentFixed) { MAngle angle = new MAngle(); double weight = 0.0; animCurve.getTangent(i, angle, ref weight, true); clip.Write(kSpaceChar + Convert.ToString(angle.asUnits(angularUnit))); clip.Write(kSpaceChar + Convert.ToString(weight)); } if (animCurve.outTangentType(i) == MFnAnimCurve.TangentType.kTangentFixed) { MAngle angle = new MAngle(); double weight = 0.0; animCurve.getTangent(i, angle, ref weight, false); clip.Write(kSpaceChar + Convert.ToString(angle.asUnits(angularUnit))); clip.Write(kSpaceChar + Convert.ToString(weight)); } clip.Write(kSemiColonChar + Environment.NewLine); } clip.Write(kTwoSpace + kBraceRightChar + Environment.NewLine); clip.Write(kBraceRightChar + Environment.NewLine); }