sineNode/sineNode.cpp
 
 
 
sineNode/sineNode.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.
// ==========================================================================
//+

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

#include <maya/MPxNode.h> 

#include <maya/MFnNumericAttribute.h>
#include <maya/MFnPlugin.h>

#include <maya/MString.h> 
#include <maya/MTypeId.h> 
#include <maya/MPlug.h>
#include <maya/MVector.h>
#include <maya/MDataBlock.h>
#include <maya/MDataHandle.h>
 
class sine : public MPxNode
{
public:
                                                sine();
        virtual                         ~sine(); 

        virtual MStatus         compute( const MPlug& plug, MDataBlock& data );

        static  void*           creator();
        static  MStatus         initialize();

public:
        static  MObject         input;         // The input value.
        static  MObject         output;        // The output value.
        static  MTypeId         id;
};

MTypeId     sine::id( 0x80012 );
MObject     sine::input;        
MObject     sine::output;       

sine::sine() {}
sine::~sine() {}

MStatus sine::compute( const MPlug& plug, MDataBlock& data )
{
        
        MStatus returnStatus;
 
        if( plug == output )
        {
                MDataHandle inputData = data.inputValue( input, &returnStatus );

                if( returnStatus != MS::kSuccess )
                        cerr << "ERROR getting data" << endl;
                else
                {
                        float result = sinf( inputData.asFloat() ) * 10.0f;
                        MDataHandle outputHandle = data.outputValue( sine::output );
                        outputHandle.set( result );
                        data.setClean(plug);
                }
        } else {
                return MS::kUnknownParameter;
        }

        return MS::kSuccess;
}

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

MStatus sine::initialize()
{
        MFnNumericAttribute nAttr;
        MStatus                         stat;

        input = nAttr.create( "input", "in", MFnNumericData::kFloat, 0.0 );
        nAttr.setStorable(true);

        output = nAttr.create( "output", "out", MFnNumericData::kFloat, 0.0 );
        nAttr.setWritable(false);
        nAttr.setStorable(false);

        stat = addAttribute( input );
                if (!stat) { stat.perror("addAttribute"); return stat;}
        stat = addAttribute( output );
                if (!stat) { stat.perror("addAttribute"); return stat;}

        stat = attributeAffects( input, output );
                if (!stat) { stat.perror("attributeAffects"); return stat;}

        return MS::kSuccess;
}

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

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

        return status;
}

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

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

        return status;
}