rockingTransform.h

//-
// ==========================================================================
// 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 <maya/MMatrix.h>
#include <maya/MPxTransform.h>
#include <maya/MPxTransformationMatrix.h>

class MDataHandle;
class MDGContext;
class MPlug;

//
// Define declarations
//

#define kRockingTransformNodeID 0x8101B
#define kRockingTransformMatrixID 0x8101C

#define ReturnOnError(status)              \
        if (MS::kSuccess != status) {      \
            return status;                \
        }

//
// Class declarations -- matrix and transform
//

class rockingTransformMatrix : public MPxTransformationMatrix
{
    // A really simple implementation of MPxTransformationMatrix.
    // The methods include:
    // - Two accessor methods for getting and setting the 
    // rock
    // - The virtual asMatrix() method which passes the matrix 
    // back to Maya when the command "xform -q -ws -m" is invoked

    public:
        rockingTransformMatrix();
        static void *creator();
        
        virtual MMatrix asMatrix() const;
        virtual MMatrix asMatrix(double percent) const;
        virtual MMatrix asRotateMatrix() const;
        
        // Degrees
        double  getRockInX() const;
        void    setRockInX( double rock );
        
        static  MTypeId id;
    protected:      
        typedef MPxTransformationMatrix ParentClass;
        // Degrees
        double rockXValue;
};

class rockingTransformNode : public MPxTransform 
{
    // A really simple custom transform.
    public:
        rockingTransformNode();
        rockingTransformNode(MPxTransformationMatrix *);
        virtual ~rockingTransformNode();

        virtual MPxTransformationMatrix *createTransformationMatrix();
                    
        virtual void postConstructor();

        virtual MStatus validateAndSetValue(const MPlug& plug,
                    const MDataHandle& handle, const MDGContext& context);
                    
        virtual void  resetTransformation (MPxTransformationMatrix *);
        virtual void  resetTransformation (const MMatrix &);
                    
        // Utility for getting the related rock matrix pointer
        rockingTransformMatrix *getRockingTransformMatrix();
                
        const char* className();
        static  void *  creator();
        static  MStatus initialize();
        
        static  MTypeId id;
    protected:
        // Degrees
        static  MObject aRockInX;
        double rockXValue;
        typedef MPxTransform ParentClass;
};

class DegreeRadianConverter
{
    public:
        double degreesToRadians( double degrees );
        double radiansToDegrees( double radians );
};