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

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