public override void doIt(MArgList args) { // parse the command arguments // parseArgs(args); uint count = 0; // if the character flag was used, create the clip on the specified // character, otherwise, create a character // MFnCharacter fnCharacter = new MFnCharacter(); if (fCharacter.isNull) { MSelectionList activeList = new MSelectionList(); MGlobal.getActiveSelectionList(activeList); if (0 == activeList.length) { throw new ApplicationException("Empty Active Selection List."); } // create a character using the selection list // fCharacter = fnCharacter.create(activeList, MFnSet.Restriction.kNone); } else { fnCharacter.setObject(fCharacter); } // Get the array of members of the character. We will create a clip // for them. // MPlugArray plugs = new MPlugArray(); fnCharacter.getMemberPlugs(plugs); // Now create a animCurves to use as a clip for the character. // The curves will be set up between frames 0 and 10; // MTime start = new MTime(0.0); MTime duration = new MTime(10.0); MObjectArray clipCurves = new MObjectArray(); for (count = 0; count < plugs.length; ++count) { // Now create a bunch of animCurves to use as a clip for the // character // MFnAnimCurve fnCurve = new MFnAnimCurve(); MObject curve = fnCurve.create(MFnAnimCurve.AnimCurveType.kAnimCurveTL); // plugType); fnCurve.addKeyframe(start, 5.0); fnCurve.addKeyframe(duration, 15.0); clipCurves.append(curve); } // Create a source clip node and add the animation to it // MFnClip fnClipCreate = new MFnClip(); MObject sourceClip = fnClipCreate.createSourceClip(start, duration, fMod); fnCharacter.attachSourceToCharacter(sourceClip, fMod); for (count = 0; count < plugs.length; ++count) { MPlug animPlug = plugs[(int)count]; fnCharacter.addCurveToClip(clipCurves[(int)count], sourceClip, animPlug, fMod); } // instance the clip // MTime schedStart = new MTime(15.0); MObject instancedClip = fnClipCreate.createInstancedClip(sourceClip, schedStart, fMod); fnCharacter.attachInstanceToCharacter(instancedClip, fMod); // instance the clip a second time, at time 30 // schedStart.value = 30.0; MObject instancedClip2 = fnClipCreate.createInstancedClip(sourceClip, schedStart, fMod); fnCharacter.attachInstanceToCharacter(instancedClip2, fMod); return; }
// // 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; }
public override void doIt(MArgList args) { // parse the command arguments // parseArgs(args); uint count = 0; // if the character flag was used, create the clip on the specified // character, otherwise, create a character // MFnCharacter fnCharacter = new MFnCharacter(); if (fCharacter.isNull) { MSelectionList activeList = new MSelectionList(); MGlobal.getActiveSelectionList(activeList); if (0 == activeList.length) { throw new ApplicationException("Empty Active Selection List."); } // create a character using the selection list // fCharacter = fnCharacter.create(activeList, MFnSet.Restriction.kNone); } else fnCharacter.setObject(fCharacter); // Get the array of members of the character. We will create a clip // for them. // MPlugArray plugs = new MPlugArray(); fnCharacter.getMemberPlugs(plugs); // Now create a animCurves to use as a clip for the character. // The curves will be set up between frames 0 and 10; // MTime start = new MTime(0.0); MTime duration = new MTime(10.0); MObjectArray clipCurves = new MObjectArray(); for (count = 0; count < plugs.length; ++count) { // Now create a bunch of animCurves to use as a clip for the // character // MFnAnimCurve fnCurve = new MFnAnimCurve(); MObject curve = fnCurve.create(MFnAnimCurve.AnimCurveType.kAnimCurveTL); // plugType); fnCurve.addKeyframe(start, 5.0); fnCurve.addKeyframe(duration, 15.0); clipCurves.append(curve); } // Create a source clip node and add the animation to it // MFnClip fnClipCreate = new MFnClip(); MObject sourceClip = fnClipCreate.createSourceClip(start, duration, fMod); fnCharacter.attachSourceToCharacter(sourceClip, fMod); for (count = 0; count < plugs.length; ++count) { MPlug animPlug = plugs[(int)count]; fnCharacter.addCurveToClip(clipCurves[(int)count], sourceClip, animPlug, fMod); } // instance the clip // MTime schedStart = new MTime(15.0); MObject instancedClip = fnClipCreate.createInstancedClip(sourceClip, schedStart, fMod); fnCharacter.attachInstanceToCharacter(instancedClip, fMod); // instance the clip a second time, at time 30 // schedStart.value = 30.0; MObject instancedClip2 = fnClipCreate.createInstancedClip(sourceClip, schedStart, fMod); fnCharacter.attachInstanceToCharacter(instancedClip2, fMod); return; }
// Description: // Returns a string with a test based desription of the passed // MFnAnimCurve::TangentType. // public string tangentTypeAsWord(MFnAnimCurve.TangentType type) { switch (type) { case MFnAnimCurve.TangentType.kTangentGlobal: return kWordTangentGlobal; case MFnAnimCurve.TangentType.kTangentFixed: return (kWordTangentFixed); case MFnAnimCurve.TangentType.kTangentLinear: return (kWordTangentLinear); case MFnAnimCurve.TangentType.kTangentFlat: return (kWordTangentFlat); case MFnAnimCurve.TangentType.kTangentSmooth: return (kWordTangentSmooth); case MFnAnimCurve.TangentType.kTangentStep: return (kWordTangentStep); case MFnAnimCurve.TangentType.kTangentStepNext: return (kWordTangentStepNext); case MFnAnimCurve.TangentType.kTangentSlow: return (kWordTangentSlow); case MFnAnimCurve.TangentType.kTangentFast: return (kWordTangentFast); case MFnAnimCurve.TangentType.kTangentClamped: return (kWordTangentClamped); case MFnAnimCurve.TangentType.kTangentPlateau: return (kWordTangentPlateau); case MFnAnimCurve.TangentType.kTangentAuto: return (kWordTangentAuto); default: break; } return (kWordTangentGlobal); }
// // 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: // Returns a string containing the name of the passed // MFnAnimCurve::InfinityType type. // public string infinityTypeAsWord(MFnAnimCurve.InfinityType type) { switch (type) { case MFnAnimCurve.InfinityType.kConstant: return (kWordConstant); case MFnAnimCurve.InfinityType.kLinear: return (kWordLinear); case MFnAnimCurve.InfinityType.kCycle: return (kWordCycle); case MFnAnimCurve.InfinityType.kCycleRelative: return (kWordCycleRelative); case MFnAnimCurve.InfinityType.kOscillate: return (kWordOscillate); default: break; } return (kWordConstant); }
// // Description: // Returns a string identifying the output type of the // passed MFnAnimCurve::AnimCurveType. // public string outputTypeAsWord(MFnAnimCurve.AnimCurveType type) { switch (type) { case MFnAnimCurve.AnimCurveType.kAnimCurveTL: case MFnAnimCurve.AnimCurveType.kAnimCurveUL: return (kWordTypeLinear); case MFnAnimCurve.AnimCurveType.kAnimCurveTA: case MFnAnimCurve.AnimCurveType.kAnimCurveUA: return (kWordTypeAngular); case MFnAnimCurve.AnimCurveType.kAnimCurveTT: case MFnAnimCurve.AnimCurveType.kAnimCurveUT: return (kWordTypeTime); case MFnAnimCurve.AnimCurveType.kAnimCurveTU: case MFnAnimCurve.AnimCurveType.kAnimCurveUU: return (kWordTypeUnitless); case MFnAnimCurve.AnimCurveType.kAnimCurveUnknown: return (kWordTypeUnitless); } return (kWordTypeUnknown); }
// 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); }
// Description: // Read a block of the stream that should contain anim curve // data in the format determined by the animData keyword. // protected bool readAnimCurve(ref StreamReaderExt clipFile, ref MAnimCurveClipboardItem item) { MFnAnimCurve animCurve = new MFnAnimCurve(); MObject animCurveObj = new MObject(); // Anim curve defaults. // animBase.AnimBaseType input = wordAsInputType(kWordTypeTime); animBase.AnimBaseType output = wordAsOutputType(kWordTypeLinear); MFnAnimCurve.InfinityType preInf = wordAsInfinityType(kWordConstant); MFnAnimCurve.InfinityType postInf = wordAsInfinityType(kWordConstant); string inputUnitName = ""; animUnitNames.setToShortName(timeUnit, ref inputUnitName); string outputUnitName = ""; MAngle.Unit tanAngleUnit = angularUnit; bool isWeighted = false; string dataType = ""; while (!clipFile.EndOfStream) { advance(ref clipFile); dataType = asWord(ref clipFile); if (string.Compare(dataType, kInputString) == 0) { input = wordAsInputType(asWord(ref clipFile)); } else if (string.Compare(dataType, kOutputString) == 0) { output = wordAsOutputType(asWord(ref clipFile)); } else if (string.Compare(dataType, kWeightedString) == 0) { isWeighted = (asDouble(ref clipFile) == 1.0); } else if (string.Compare(dataType, kPreInfinityString) == 0) { preInf = wordAsInfinityType(asWord(ref clipFile)); } else if (string.Compare(dataType, kPostInfinityString) == 0) { postInf = wordAsInfinityType(asWord(ref clipFile)); } else if (string.Compare(dataType, kInputUnitString) == 0) { inputUnitName = asWord(ref clipFile); } else if (string.Compare(dataType, kOutputUnitString) == 0) { outputUnitName = asWord(ref clipFile); } else if (string.Compare(dataType, kTanAngleUnitString) == 0) { string tUnit = asWord(ref clipFile); if (!animUnitNames.setFromName(tUnit, ref tanAngleUnit)) { string unitName=""; tanAngleUnit = angularUnit; animUnitNames.setToShortName(tanAngleUnit, ref unitName); // Use format to place variable string into message string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingTanAngleUnit); string msg = string.Format(msgFmt, unitName); MGlobal.displayError(msg); } } else if (string.Compare(dataType, kKeysString) == 0) { // Ignore the rest of this line. // clipFile.ReadLine(); break; } else if (string.Compare(dataType, "{") == 0) { // Skippping the '{' character. Just ignore it. // continue; } else { // An unrecogized keyword was found. // string warnStr = (dataType); // Use format to place variable string into message string msgFmt = MStringResource.getString(RegisterMStringResources.kUnknownKeyword); string msg = string.Format(msgFmt, warnStr); MGlobal.displayError(msg); continue; } } // Read the animCurve // MFnAnimCurve.AnimCurveType type = typeAsAnimCurveType(input, output); try { animCurveObj = animCurve.create(type,null); } catch (System.Exception ) { string msg = MStringResource.getString(RegisterMStringResources.kCouldNotCreateAnim); MGlobal.displayError(msg); return false; } animCurve.setIsWeighted(isWeighted); animCurve.setPreInfinityType(preInf); animCurve.setPostInfinityType(postInf); // Set the appropriate units. // MTime.Unit inputTimeUnit = MTime.Unit.kInvalid; if (input == AnimBaseType.kAnimBaseTime) { if (!animUnitNames.setFromName(inputUnitName, ref inputTimeUnit)) { string unitName = ""; inputTimeUnit = timeUnit; animUnitNames.setToShortName(inputTimeUnit, ref unitName); // Use format to place variable string into message string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingToUnit); string msg = string.Format(msgFmt, kInputUnitString, unitName); MGlobal.displayWarning(msg); } } MTime.Unit outputTimeUnit= MTime.Unit.kInvalid; if (output == AnimBaseType.kAnimBaseTime) { if (!animUnitNames.setFromName(outputUnitName, ref outputTimeUnit)) { string unitName = ""; outputTimeUnit = timeUnit; animUnitNames.setToShortName(outputTimeUnit, ref unitName); // Use format to place variable string into message string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingToUnit); string msg = string.Format(msgFmt, kOutputUnitString, unitName); MGlobal.displayWarning(msg); } } uint index = 0; double conversion = 1.0; if (output == AnimBaseType.kAnimBaseLinear) { MDistance.Unit unit = MDistance.Unit.kInvalid; if (outputUnitName.Length != 0) { if (!animUnitNames.setFromName(outputUnitName, ref unit)) { string unitName = ""; unit = linearUnit; animUnitNames.setToShortName(unit, ref unitName); // Use format to place variable string into message string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingToUnit); string msg = string.Format(msgFmt, kOutputUnitString, unitName); MGlobal.displayWarning(msg); } } else unit = linearUnit; if (unit != MDistance.Unit.kCentimeters) { MDistance one = new MDistance(1.0, unit); conversion = one.asCentimeters; } } else if (output == AnimBaseType.kAnimBaseAngular) { MAngle.Unit unit = MAngle.Unit.kInvalid; if (outputUnitName.Length != 0) { if (!animUnitNames.setFromName(outputUnitName, ref unit)) { string unitName = ""; unit = angularUnit; animUnitNames.setToShortName(unit, ref unitName); // Use format to place variable string into message string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingToUnit); string msg = string.Format(msgFmt, kOutputUnitString, unitName); MGlobal.displayWarning(msg); } } else unit = angularUnit; if (unit != MAngle.Unit.kRadians) { MAngle one = new MAngle(1.0, unit); conversion = one.asRadians; } } // Now read each keyframe // advance(ref clipFile); char c = (char)clipFile.Peek(); while (!clipFile.EndOfStream && c != kBraceRightChar) { double t = asDouble(ref clipFile); double val = asDouble(ref clipFile); MFnAnimCurve.TangentType tanIn = wordAsTangentType(asWord(ref clipFile)); MFnAnimCurve.TangentType tanOut = wordAsTangentType(asWord(ref clipFile)); switch (type) { case MFnAnimCurve.AnimCurveType.kAnimCurveTT: index = animCurve.addKey( new MTime(val, inputTimeUnit), new MTime(val, outputTimeUnit), tanIn, tanOut, null); break; case MFnAnimCurve.AnimCurveType.kAnimCurveTL: case MFnAnimCurve.AnimCurveType.kAnimCurveTA: case MFnAnimCurve.AnimCurveType.kAnimCurveTU: index = animCurve.addKey( new MTime(t, inputTimeUnit), val*conversion, tanIn, tanOut, null); break; case MFnAnimCurve.AnimCurveType.kAnimCurveUL: case MFnAnimCurve.AnimCurveType.kAnimCurveUA: case MFnAnimCurve.AnimCurveType.kAnimCurveUU: index = animCurve.addKey( t, val*conversion, tanIn, tanOut, null); break; case MFnAnimCurve.AnimCurveType.kAnimCurveUT: index = animCurve.addKey( t, new MTime(val, outputTimeUnit), tanIn, tanOut, null); break; default: string msg = MStringResource.getString(RegisterMStringResources.kUnknownNode); MGlobal.displayError(msg); return false; } // Tangent locking needs to be called after the weights and // angles are set for the fixed tangents. // bool tLocked = asDouble(ref clipFile) == 1.0; bool swLocked = asDouble(ref clipFile) == 1.0; bool isBreakdown = false; if (animVersion >= kVersionNonWeightedAndBreakdowns) { isBreakdown = (asDouble(ref clipFile) == 1.0); } // Only fixed tangents need additional information. // if (tanIn == MFnAnimCurve.TangentType.kTangentFixed) { MAngle inAngle = new MAngle(asDouble(ref clipFile), tanAngleUnit); double inWeight = asDouble(ref clipFile); // If this is from a pre-Maya3.0 file, the tangent angles will // need to be converted. // if (convertAnglesFromV2To3) { convertAnglesAndWeights2To3(type,isWeighted,ref inAngle,ref inWeight); } else if (convertAnglesFromV3To2) { convertAnglesAndWeights3To2(type,isWeighted,ref inAngle,ref inWeight); } // By default, the tangents are locked. When the tangents // are locked, setting the angle and weight of a fixed in // tangent may change the tangent type of the out tangent. // animCurve.setTangentsLocked(index, false); animCurve.setTangent(index, inAngle, inWeight, true); } // Only fixed tangents need additional information. // if (tanOut == MFnAnimCurve.TangentType.kTangentFixed) { MAngle outAngle = new MAngle(asDouble(ref clipFile), tanAngleUnit); double outWeight = asDouble(ref clipFile); // If this is from a pre-Maya3.0 file, the tangent angles will // need to be converted. // if (convertAnglesFromV2To3) { convertAnglesAndWeights2To3(type,isWeighted,ref outAngle,ref outWeight); } else if (convertAnglesFromV3To2) { convertAnglesAndWeights3To2(type,isWeighted,ref outAngle,ref outWeight); } // By default, the tangents are locked. When the tangents // are locked, setting the angle and weight of a fixed out // tangent may change the tangent type of the in tangent. // animCurve.setTangentsLocked(index, false); animCurve.setTangent(index, outAngle, outWeight, false); } // To prevent tangent types from unexpectedly changing, tangent // locking should be the last operation. See the above comments // about fixed tangent types for more information. // animCurve.setWeightsLocked(index, swLocked); animCurve.setTangentsLocked(index, tLocked); animCurve.setIsBreakdown (index, isBreakdown); // There should be no additional data on this line. Go to the // next line of data. // clipFile.ReadLine(); // Skip any comments. // advance(ref clipFile); c = (char)clipFile.Peek(); } // Ignore the brace that marks the end of the keys block. // if (c == kBraceRightChar) { clipFile.ReadLine(); } // Ignore the brace that marks the end of the animData block. // advance(ref clipFile); if ( (char)clipFile.Peek() == kBraceRightChar) { clipFile.ReadLine(); } else { // Something is wrong. // string msg = MStringResource.getString(RegisterMStringResources.kMissingBrace); MGlobal.displayError(msg); } // Do not set the clipboard with an empty clipboard item. // if (!animCurveObj.isNull) { item.animCurve = animCurveObj; } // Delete the copy of the anim curve. // MGlobal.deleteNode(animCurveObj); return true; }
public string outputTypeAsWord(MFnAnimCurve.AnimCurveType type) // // Description: // Returns a string identifying the output type of the // passed MFnAnimCurve::AnimCurveType. // { switch (type) { case MFnAnimCurve.AnimCurveType.kAnimCurveTL: case MFnAnimCurve.AnimCurveType.kAnimCurveUL: return (kWordTypeLinear); case MFnAnimCurve.AnimCurveType.kAnimCurveTA: case MFnAnimCurve.AnimCurveType.kAnimCurveUA: return (kWordTypeAngular); case MFnAnimCurve.AnimCurveType.kAnimCurveTT: case MFnAnimCurve.AnimCurveType.kAnimCurveUT: return (kWordTypeTime); case MFnAnimCurve.AnimCurveType.kAnimCurveTU: case MFnAnimCurve.AnimCurveType.kAnimCurveUU: return (kWordTypeUnitless); case MFnAnimCurve.AnimCurveType.kAnimCurveUnknown: return (kWordTypeUnitless); } return (kWordTypeUnknown); }
public string infinityTypeAsWord(MFnAnimCurve.InfinityType type) // Description: // Returns a string containing the name of the passed // MFnAnimCurve::InfinityType type. // { switch (type) { case MFnAnimCurve.InfinityType.kConstant: return (kWordConstant); case MFnAnimCurve.InfinityType.kLinear: return (kWordLinear); case MFnAnimCurve.InfinityType.kCycle: return (kWordCycle); case MFnAnimCurve.InfinityType.kCycleRelative: return (kWordCycleRelative); case MFnAnimCurve.InfinityType.kOscillate: return (kWordOscillate); default: break; } return (kWordConstant); }
public string tangentTypeAsWord(MFnAnimCurve.TangentType type) // Description: // Returns a string with a test based desription of the passed // MFnAnimCurve::TangentType. // { switch (type) { case MFnAnimCurve.TangentType.kTangentGlobal: return kWordTangentGlobal; case MFnAnimCurve.TangentType.kTangentFixed: return (kWordTangentFixed); case MFnAnimCurve.TangentType.kTangentLinear: return (kWordTangentLinear); case MFnAnimCurve.TangentType.kTangentFlat: return (kWordTangentFlat); case MFnAnimCurve.TangentType.kTangentSmooth: return (kWordTangentSmooth); case MFnAnimCurve.TangentType.kTangentStep: return (kWordTangentStep); case MFnAnimCurve.TangentType.kTangentStepNext: return (kWordTangentStepNext); case MFnAnimCurve.TangentType.kTangentSlow: return (kWordTangentSlow); case MFnAnimCurve.TangentType.kTangentFast: return (kWordTangentFast); case MFnAnimCurve.TangentType.kTangentClamped: return (kWordTangentClamped); case MFnAnimCurve.TangentType.kTangentPlateau: return (kWordTangentPlateau); case MFnAnimCurve.TangentType.kTangentAuto: return (kWordTangentAuto); default: break; } return (kWordTangentGlobal); }