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;
}