simpleSpring/simpleSpring.cpp
 
 
 
simpleSpring/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;
}