- Main Page
- Related Pages
- Modules
- Classes
- Examples

# simpleSpring.cpp

    //-
    // ==========================================================================
    // Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
    //
    // Use of this software is subject to the terms of the Autodesk
    // license agreement provided at the time of installation or download,
    // or which otherwise accompanies this software in either electronic
    // or hard copy form.
    // ==========================================================================
    //+

    //============================= DESCRIPTION =================================
    //  This is an example of how to write an API spring node.
    //
    //===========================================================================

    #include <maya/MIOStream.h>
    #include <math.h>

    #include <simpleSpring.h>
    #include <maya/MFnDependencyNode.h>
    #include <maya/MFnNumericAttribute.h>

    //=================================================================
    // Implement your new attributes here if your node has.
    // Here is an example code.
    //=================================================================
    MObject simpleSpring::aSpringFactor;

    MTypeId simpleSpring::id( 0x80017 );

    simpleSpring::simpleSpring()
    :   factor(0.0)
    {
    }

    simpleSpring::~simpleSpring()
    {
    }

    void *simpleSpring::creator()
    {
        return new simpleSpring;
    }

    MStatus simpleSpring::initialize()
    //
    //  Descriptions:
    //      Initialize the node, attributes.
    //
    {
        MStatus status;

        MFnNumericAttribute numAttr;

        //=================================================================
        // Initialize your new attributes here. Here is an example.
        //=================================================================
        aSpringFactor = numAttr.create("springFactor","sf",MFnNumericData::kDouble);
        numAttr.setDefault( 1.0 );
        numAttr.setKeyable( true );
        status = addAttribute( aSpringFactor );
        McheckErr(status, "ERROR adding aSpringFactor attribute.\n");

        return( MS::kSuccess );
    }

    MStatus simpleSpring::compute(const MPlug& /*plug*/, MDataBlock& block)
    //
    //  Descriptions:
    //      In this simple example, do nothing in this method. But get the
    //      spring factor here for "applySpringLaw" to compute output force.
    //
    //  Note: always let this method return "kUnknownParameter" so that
    //  "applySpringLaw" can be called when Maya needs to compute spring force.
    //
    //  It is recommended to only override compute() to get user defined
    //  attributes.
    //
    {
        // Get spring factor,
        //
        factor = springFactor( block );

        // Note: return "kUnknownParameter" so that Maya spring node can
        // compute spring force for this plug-in simple spring node.
        //
        return( MS::kUnknownParameter );
    }

    MStatus simpleSpring::applySpringLaw
    (
        double /*stiffness*/, double /*damping*/, double restLength,
        double /*endMass1*/, double /*endMass2*/,
        const MVector &endP1, const MVector &endP2,
        const MVector &/*endV1*/, const MVector &/*endV2*/,
        MVector &forceV1, MVector &forceV2
    )
    //
    //  Descriptions:
    //      In this overridden method, the attribute, aSpringFactor, is used
    //      to compute output force with a simple spring law.
    //
    //      F = - factor * (L - restLength) * Vector of (endP1 - endP2).
    //
    {
        MVector distV = endP1 - endP2;
        double L = distV.length();
        distV.normalize();

        double F = factor * (L - restLength);
        forceV1 = - F * distV;
        forceV2 = - forceV1;

        return( MS::kSuccess );
    }

    MStatus initializePlugin(MObject obj)
    {
        MStatus status;
        MFnPlugin plugin(obj, PLUGIN_COMPANY, "3.0", "Any");

        status = plugin.registerNode( "simpleSpring", simpleSpring::id,
                                &simpleSpring::creator, &simpleSpring::initialize,
                                MPxNode::kSpringNode );
        if (!status) {
            status.perror("registerNode");
            return status;
        }

        return status;
    }

    MStatus uninitializePlugin(MObject obj)
    {
        MStatus status;
        MFnPlugin plugin(obj);

        status = plugin.deregisterNode( simpleSpring::id );
        if (!status) {
            status.perror("deregisterNode");
            return status;
        }

        return status;
    }