// ==========================================================================
// 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.
// ==========================================================================

// Define declarations

#include "rockingTransform.h"

#define kRockingTransformCheckNodeID 0x8101D
#define kRockingTransformCheckMatrixID 0x8101E

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

// Class declarations -- matrix and transform
// NOTE: that we derive from the rockingTransform base
// classes so that we avoid code duplication.

class rockingTransformCheckMatrix : public rockingTransformMatrix
    // 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

        static void *creator();
        static  MTypeId idCheck;
        typedef rockingTransformCheckMatrix ParentClass;

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

        virtual MPxTransformationMatrix *createTransformationMatrix();
        // Utility for getting the related rock matrix pointer
        rockingTransformCheckMatrix *getRockingTransformCheckMatrix();
        const char* className();
        static  void *  creator();
        static  MTypeId idCheck;
        virtual MEulerRotation applyRotationLocks(const MEulerRotation &toTest,
                                            const MEulerRotation &savedR,
                                            MStatus *ReturnStatus = NULL);
        virtual MEulerRotation applyRotationLimits(const MEulerRotation &unclampedR,
                                              MDataBlock &block,
                                              MStatus *ReturnStatus = NULL);
        virtual MStatus checkAndSetRotation(MDataBlock &block,
                                            const MPlug&,
                                            const MEulerRotation&, 
                                            MSpace::Space = MSpace::kTransform);  

        typedef rockingTransformNode ParentClass;