geometrySurfaceConstraint.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 <string.h>
#include <maya/MIOStream.h>
#include <math.h>

#include <maya/MPxTransform.h>
#include <maya/MPxConstraint.h> 
#include <maya/MPxConstraintCommand.h> 

#include <maya/MArgDatabase.h>

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

#include <maya/MGlobal.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>
#include <maya/MFnTypedAttribute.h>
#include <maya/MFnCompoundAttribute.h>
#include <maya/MFnTransform.h>
#include <maya/MVector.h>
#include <maya/MTypes.h>
#include <maya/MFnNumericData.h>
#include <maya/MDGModifier.h>

#include <math.h>
#include <float.h>

//
//  Macros
//


#define kConstrainToLargestWeightFlag "-lw"
#define kConstrainToLargestWeightFlagLong "-largestWeight"
#define kConstrainToSmallestWeightFlag "-sw"
#define kConstrainToSmallestWeightFlagLong "-smallestWeight"

//
// Class definitions
//

class geometrySurfaceConstraintCommand : public MPxConstraintCommand
{
public:

    enum ConstraintType
    {
        kLargestWeight,
        kSmallestWeight,
    };

    geometrySurfaceConstraintCommand();
    ~geometrySurfaceConstraintCommand();

    virtual MStatus     doIt(const MArgList &argList);
    virtual MStatus     appendSyntax();

    virtual MTypeId constraintTypeId() const;
    virtual MPxConstraintCommand::TargetType targetType() const;

    virtual const MObject& constraintInstancedAttribute() const;
    virtual const MObject& constraintOutputAttribute() const;
    virtual const MObject& constraintTargetInstancedAttribute() const;
    virtual const MObject& constraintTargetAttribute() const;
    virtual const MObject& constraintTargetWeightAttribute() const;
    virtual const MObject& objectAttribute() const;

    virtual MStatus connectTarget(void *opaqueTarget, int index);
    virtual MStatus connectObjectAndConstraint( MDGModifier& modifier );

    virtual void createdConstraint(MPxConstraint *constraint);

    static  void* creator();

protected:
        virtual MStatus         parseArgs(const MArgList &argList);

    geometrySurfaceConstraintCommand::ConstraintType weightType;
};

class geometrySurfaceConstraint : public MPxConstraint
{
public:
                        geometrySurfaceConstraint();
    virtual             ~geometrySurfaceConstraint(); 

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

    virtual const MObject weightAttribute() const;
    virtual const MObject targetAttribute() const;
    virtual void getOutputAttributes(MObjectArray& attributeArray);

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

public:
    static MObject      compoundTarget;
    static MObject      targetGeometry;
    static MObject      targetWeight;

    static MObject      constraintParentInverseMatrix;
    static MObject      constraintGeometry;

    static  MTypeId     id;

    geometrySurfaceConstraintCommand::ConstraintType weightType;
};

// Useful inline method
inline bool
equivalent(double a, double b  )
{
    return fabs( a - b ) < .000001 ;
}