Beispiel #1
0
        private float getMultiplier(MDagPath objPath)
        {
            // Retrieve value of the size attribute from the node
            MObject footprintNode = objPath.node;

            if (!footprintNode.isNull)
            {
                MPlug plug = new MPlug(footprintNode, footPrint.size);
                if (!plug.isNull)
                {
                    MDistance sizeVal = new MDistance();
                    try
                    {
                        plug.getValue(sizeVal);
                        return((float)sizeVal.asCentimeters);
                    }
                    catch (Exception)
                    {
                        MGlobal.displayInfo("Error doing getValue on plugin");
                    }
                }
            }

            return(1.0f);
        }
        public override MBoundingBox boundingBox()
        {
            // Get the size
            //
            MObject thisNode = thisMObject();
            MPlug plug = new MPlug( thisNode, size );
            MDistance sizeVal = new MDistance();
            plug.getValue( sizeVal );

            double multiplier = sizeVal.asCentimeters;

            MPoint corner1 = new MPoint( -0.17, 0.0, -0.7 );
            MPoint corner2 = new MPoint( 0.17, 0.0, 0.3 );

            corner1 = corner1 * multiplier;
            corner2 = corner2 * multiplier;

            return new MBoundingBox( corner1, corner2 );
        }
Beispiel #3
0
        public override MBoundingBox boundingBox()
        {
            // Get the size
            //
            MObject   thisNode = thisMObject();
            MPlug     plug     = new MPlug(thisNode, size);
            MDistance sizeVal  = new MDistance();

            plug.getValue(sizeVal);

            double multiplier = sizeVal.asCentimeters;

            MPoint corner1 = new MPoint(-0.17, 0.0, -0.7);
            MPoint corner2 = new MPoint(0.17, 0.0, 0.3);

            corner1 = corner1 * multiplier;
            corner2 = corner2 * multiplier;

            return(new MBoundingBox(corner1, corner2));
        }
Beispiel #4
0
        public override void draw(Autodesk.Maya.OpenMayaUI.M3dView view, MDagPath path, Autodesk.Maya.OpenMayaUI.M3dView.DisplayStyle style, Autodesk.Maya.OpenMayaUI.M3dView.DisplayStatus status)
        {
            // Get the size
            //
            MObject   thisNode = thisMObject();
            MPlug     plug     = new MPlug(thisNode, size);
            MDistance sizeVal  = new MDistance();

            plug.getValue(sizeVal);

            float multiplier = (float)sizeVal.asCentimeters;

            view.beginGL();

            if ((style == M3dView.DisplayStyle.kFlatShaded) ||
                (style == M3dView.DisplayStyle.kGouraudShaded))
            {
                // Push the color settings
                //
                OpenGL.glPushAttrib((uint)OpenGL.GL_CURRENT_BIT);

                if (status == M3dView.DisplayStatus.kActive)
                {
                    view.setDrawColor(13, (int)M3dView.ColorTable.kActiveColors);
                }
                else
                {
                    view.setDrawColor(13, (int)M3dView.ColorTable.kDormantColors);
                }

                OpenGL.glBegin((uint)OpenGL.GL_TRIANGLE_FAN);
                int i;
                int last = footPrintData.soleCount - 1;
                for (i = 0; i < last; ++i)
                {
                    OpenGL.glVertex3f(footPrintData.sole[i, 0] * multiplier,
                                      footPrintData.sole[i, 1] * multiplier,
                                      footPrintData.sole[i, 2] * multiplier);
                }
                OpenGL.glEnd();
                OpenGL.glBegin((uint)OpenGL.GL_TRIANGLE_FAN);
                last = footPrintData.heelCount - 1;
                for (i = 0; i < last; ++i)
                {
                    OpenGL.glVertex3f(footPrintData.heel[i, 0] * multiplier,
                                      footPrintData.heel[i, 1] * multiplier,
                                      footPrintData.heel[i, 2] * multiplier);
                }
                OpenGL.glEnd();

                OpenGL.glPopAttrib();
            }

            // Draw the outline of the foot
            //
            OpenGL.glBegin((uint)OpenGL.GL_LINES);
            {
                int last = footPrintData.soleCount - 1;
                for (int i = 0; i < last; ++i)
                {
                    OpenGL.glVertex3f(footPrintData.sole[i, 0] * multiplier,
                                      footPrintData.sole[i, 1] * multiplier,
                                      footPrintData.sole[i, 2] * multiplier);
                    OpenGL.glVertex3f(footPrintData.sole[i + 1, 0] * multiplier,
                                      footPrintData.sole[i + 1, 1] * multiplier,
                                      footPrintData.sole[i + 1, 2] * multiplier);
                }
                last = footPrintData.heelCount - 1;
                for (int i = 0; i < last; ++i)
                {
                    OpenGL.glVertex3f(footPrintData.heel[i, 0] * multiplier,
                                      footPrintData.heel[i, 1] * multiplier,
                                      footPrintData.heel[i, 2] * multiplier);
                    OpenGL.glVertex3f(footPrintData.heel[i + 1, 0] * multiplier,
                                      footPrintData.heel[i + 1, 1] * multiplier,
                                      footPrintData.heel[i + 1, 2] * multiplier);
                }
            }
            OpenGL.glEnd();


            view.endGL();
        }
        //
        //    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:
        //        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:
        //        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:
 //        Sets the string with the short text name of the distance unit.
 //
 /* static */
 public static void setToShortName( MDistance.Unit unit, ref string name)
 {
     switch(unit) {
         case MDistance.Unit.kInches:
             name = (kInString);
             break;
         case MDistance.Unit.kFeet:
             name = (kFtString);
             break;
         case MDistance.Unit.kYards:
             name = (kYdString);
             break;
         case MDistance.Unit.kMiles:
             name = (kMiString);
             break;
         case MDistance.Unit.kMillimeters:
             name = (kMmString);
             break;
         case MDistance.Unit.kCentimeters:
             name = (kCmString);
             break;
         case MDistance.Unit.kKilometers:
             name = (kKmString);
             break;
         case MDistance.Unit.kMeters:
             name = (kMString);
             break;
         default:
             name = (kUnknownLinearString);
             break;
     }
 }
        //
        //    Description:
        //        The distance unit is set based on the passed string. If the string
        //        is not recognized, the distance unit is set to MDistance::kInvalid.
        //
        /* static */
        public static bool setFromName(string name, ref MDistance.Unit unit)
        {
            bool state = true;

            if ((string.Compare(name, kInString) == 0) ||
                (string.Compare(name, kInLString) == 0)) {
                unit = MDistance.Unit.kInches;
            } else if (	(string.Compare(name, kFtString) == 0) ||
                        (string.Compare(name, kFtLString) == 0)) {
                unit = MDistance.Unit.kFeet;
            } else if (	(string.Compare(name, kYdString) == 0) ||
                        (string.Compare(name, kYdLString) == 0)) {
                unit = MDistance.Unit.kYards;
            } else if (	(string.Compare(name, kMiString) == 0) ||
                        (string.Compare(name, kMiLString) == 0)) {
                unit = MDistance.Unit.kMiles;
            } else if (	(string.Compare(name, kMmString) == 0) ||
                        (string.Compare(name, kMmLString) == 0)) {
                unit = MDistance.Unit.kMillimeters;
            } else if (	(string.Compare(name, kCmString) == 0) ||
                        (string.Compare(name, kCmLString) == 0)) {
                unit = MDistance.Unit.kCentimeters;
            } else if (	(string.Compare(name, kKmString) == 0) ||
                        (string.Compare(name, kKmLString) == 0)) {
                unit = MDistance.Unit.kKilometers;
            } else if (	(string.Compare(name, kMString) == 0) ||
                        (string.Compare(name, kMLString) == 0)) {
                unit = MDistance.Unit.kMeters;
            } else {
                //  This is not a recognized distance unit.
                //
                state = false;
                // Use format to place variable string into message
                string msgFmt = MStringResource.getString(RegisterMStringResources.kInvalidLinearUnits);
                string msg = string.Format(msgFmt, name);
                MGlobal.displayError(msg);
                unit = MDistance.Unit.kInvalid;
            }

            return state;
        }
Beispiel #10
0
        //    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;
        }
Beispiel #11
0
		/* static */
		public static void setToShortName( MDistance.Unit unit, ref string name)
		//
		//	Description:
		//		Sets the string with the short text name of the distance unit.
		//
		{
			switch(unit) {
				case MDistance.Unit.kInches:
					name = (kInString);
					break;
				case MDistance.Unit.kFeet:
					name = (kFtString);
					break;
				case MDistance.Unit.kYards:
					name = (kYdString);
					break;
				case MDistance.Unit.kMiles:
					name = (kMiString);
					break;
				case MDistance.Unit.kMillimeters:
					name = (kMmString);
					break;
				case MDistance.Unit.kCentimeters:
					name = (kCmString);
					break;
				case MDistance.Unit.kKilometers:
					name = (kKmString);
					break;
				case MDistance.Unit.kMeters:
					name = (kMString);
					break;
				default:
					name = (kUnknownLinearString);
					break;
			}
		}
Beispiel #12
0
        public override void draw(Autodesk.Maya.OpenMayaUI.M3dView view, MDagPath path, Autodesk.Maya.OpenMayaUI.M3dView.DisplayStyle style, Autodesk.Maya.OpenMayaUI.M3dView.DisplayStatus status)
        {
            // Get the size
            //
            MObject thisNode = thisMObject();
            MPlug plug = new MPlug( thisNode, size );
            MDistance sizeVal = new MDistance();
            plug.getValue( sizeVal );

            float multiplier = (float) sizeVal.asCentimeters;

            view.beginGL();

            if ( ( style == M3dView.DisplayStyle.kFlatShaded ) ||
                 ( style == M3dView.DisplayStyle.kGouraudShaded ) )
            {
                // Push the color settings
                //
                OpenGL.glPushAttrib( (uint)OpenGL.GL_CURRENT_BIT );

                if ( status == M3dView.DisplayStatus.kActive ) {
                    view.setDrawColor( 13, (int)M3dView.ColorTable.kActiveColors );
                } else {
                    view.setDrawColor(13, (int)M3dView.ColorTable.kDormantColors);
                }

                OpenGL.glBegin((uint)OpenGL.GL_TRIANGLE_FAN);
                    int i;
                    int last = footPrintData.soleCount - 1;
                    for ( i = 0; i < last; ++i ) {
                        OpenGL.glVertex3f(footPrintData.sole[i,0] * multiplier,
                                        footPrintData.sole[i,1] * multiplier,
                                        footPrintData.sole[i,2] * multiplier);
                    }
                OpenGL.glEnd();
                OpenGL.glBegin((uint)OpenGL.GL_TRIANGLE_FAN);
                last = footPrintData.heelCount - 1;
                    for ( i = 0; i < last; ++i ) {
                        OpenGL.glVertex3f(footPrintData.heel[i,0] * multiplier,
                                        footPrintData.heel[i,1] * multiplier,
                                        footPrintData.heel[i,2] * multiplier);
                    }
                OpenGL.glEnd();

                OpenGL.glPopAttrib();
            }

            // Draw the outline of the foot
            //
            OpenGL.glBegin((uint)OpenGL.GL_LINES);
            {
                int last = footPrintData.soleCount - 1;
                for (int i = 0; i < last; ++i)
                {
                    OpenGL.glVertex3f(footPrintData.sole[i, 0] * multiplier,
                                    footPrintData.sole[i, 1] * multiplier,
                                    footPrintData.sole[i, 2] * multiplier);
                    OpenGL.glVertex3f(footPrintData.sole[i + 1, 0] * multiplier,
                                    footPrintData.sole[i + 1, 1] * multiplier,
                                    footPrintData.sole[i + 1, 2] * multiplier);
                }
                last = footPrintData.heelCount - 1;
                for (int i = 0; i < last; ++i)
                {
                    OpenGL.glVertex3f(footPrintData.heel[i, 0] * multiplier,
                                    footPrintData.heel[i, 1] * multiplier,
                                    footPrintData.heel[i, 2] * multiplier);
                    OpenGL.glVertex3f(footPrintData.heel[i + 1, 0] * multiplier,
                                    footPrintData.heel[i + 1, 1] * multiplier,
                                    footPrintData.heel[i + 1, 2] * multiplier);
                }
            }
            OpenGL.glEnd();

            view.endGL();
        }
Beispiel #13
0
        private float getMultiplier(MDagPath objPath)
        {
            // Retrieve value of the size attribute from the node
            MObject footprintNode = objPath.node;
            if (!footprintNode.isNull)
            {
                MPlug plug = new MPlug(footprintNode, footPrint.size);
                if (!plug.isNull)
                {
                    MDistance sizeVal = new MDistance();
                    try
                    {
                        plug.getValue(sizeVal);
                        return (float)sizeVal.asCentimeters;
                    }
                    catch (Exception)
                    {
                        MGlobal.displayInfo("Error doing getValue on plugin");
                    }
                }
            }

            return 1.0f;
        }