hwPhongShader/hwPhongShaderBehavior.cpp
 
 
 
hwPhongShader/hwPhongShaderBehavior.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 <maya/MIOStream.h>

#include <maya/MGlobal.h>
#include <maya/MPlugArray.h>
#include <maya/MFnDagNode.h>
#include <maya/MObjectArray.h>

#include "hwPhongShaderBehavior.h"

// Set VERBOSE to 0 to suppress diagnostic outputs. Set it to 1 to
// display when the override methods are called.

#define VERBOSE 0

//
//      Description:
//              Constructor
//
hwPhongShaderBehavior::hwPhongShaderBehavior()
{
}

//
//      Description:
//              Destructor
//
hwPhongShaderBehavior::~hwPhongShaderBehavior()
{
}

//
//      Description:
//              Returns a new instance of this class
//
void *hwPhongShaderBehavior::creator()
{
        return new hwPhongShaderBehavior;
}

//
//      Description:
//              Overloaded function from MPxDragAndDropBehavior
//      this method will return true if it is going to handle the connection
//      between the two nodes given.
//
bool hwPhongShaderBehavior::shouldBeUsedFor(
        MObject & sourceNode, 
        MObject & destinationNode,
        MPlug   & /* sourcePlug */,
        MPlug   & /* destinationPlug */)
{
        bool result = false;

        // Handle dropping a hw shader on a maya shader
        //
        if ((MFnDependencyNode(sourceNode).typeName() == "hwPhongShader") &&
                destinationNode.hasFn(MFn::kLambert))
                result = true;

#if VERBOSE
        cerr << "shouldBeUsedFor "<<MFnDependencyNode(sourceNode).name().asChar() 
                 << " " << MFnDependencyNode(destinationNode).name().asChar()  
                 << (result?" true\n":" false\n");
#endif

        return result;
}

//
// Connect source plug to destination.
//
static MStatus connectAttr(
        const MPlug &srcPlug, 
        const MPlug &destPlug, 
        bool            force)
{
        MStatus result = MS::kFailure;

        if(!srcPlug.isNull() && !destPlug.isNull())
        {
                MString cmd = "connectAttr ";
                if (force) cmd += "-f ";
                cmd += srcPlug.name() + " " + destPlug.name();
                result = MGlobal::executeCommand(cmd);

#if VERBOSE
                cerr << cmd.asChar()<<"\n";
#endif
        }
        return result;
}

//
//      Description:
//              Overloaded function from MPxDragAndDropBehavior
//      this method will handle the connection between the hwPhongShader
//      and the shader it is assigned to as well as any meshes that it is
//      assigned to.
//
MStatus hwPhongShaderBehavior::connectNodeToNode( 
        MObject & sourceNode, 
        MObject & destinationNode, 
        bool      force )
{
        MStatus result = MS::kFailure;
        MFnDependencyNode src(sourceNode);

        if ((src.typeName() == "hwPhongShader") &&
                destinationNode.hasFn(MFn::kLambert))
        {
                MFnDependencyNode dest(destinationNode);
                result = connectAttr(src.findPlug("outColor"), 
                                                         dest.findPlug("hardwareShader"), force);
        }

#if VERBOSE
        if (result != MS::kSuccess)
                cerr << "connectNodeToNode "<<src.name().asChar() 
                         << " " << MFnDependencyNode(destinationNode).name().asChar()  
                         << " failed\n";
#endif

        return result;
}

//
//      Description:
//              Overloaded function from MPxDragAndDropBehavior
//      this method will assign the correct output from the hwPhong shader 
//      onto the given attribute.
//
MStatus hwPhongShaderBehavior::connectNodeToAttr( 
        MObject & sourceNode,
        MPlug   & destinationPlug,
        bool      force )

{
        MStatus result = MS::kFailure;
        MFnDependencyNode src(sourceNode);

        //if we are dragging from a hwPhongShader
        //to a shader than connect the outColor
        //plug to the plug being passed in
        //      
        if ((src.typeName() == "hwPhongShader") &&
                destinationPlug.node().hasFn(MFn::kLambert))
        {
                result = connectAttr(src.findPlug("outColor"), destinationPlug, force);
        }

#if VERBOSE
        if (result != MS::kSuccess)
                cerr << "connectNodeToAttr "<<src.name().asChar() 
                         << " " << destinationPlug.name().asChar()  
                         << " failed\n";
#endif

        return result;
}

//
//
MStatus hwPhongShaderBehavior::connectAttrToNode( 
        MPlug   & sourcePlug, 
        MObject & destinationNode,
        bool      force )
{
        MStatus result = MS::kFailure;
        MObject sourceNode = sourcePlug.node();
        MFnDependencyNode src(sourceNode);

        if ((src.typeName() == "hwPhongShader") &&
                destinationNode.hasFn(MFn::kLambert))
        {
                MFnDependencyNode dest(destinationNode);
                result = connectAttr(sourcePlug, dest.findPlug("hardwareShader"),
                                                         force);
        }

#if VERBOSE
        if (result != MS::kSuccess)
                cerr << "connectNodeAttrToNode "<<sourcePlug.name().asChar() 
                         << " " << MFnDependencyNode(destinationNode).name().asChar()  
                         << " failed\n";
#endif

        return result;
}

//
//
MStatus hwPhongShaderBehavior::connectAttrToAttr( 
        MPlug & sourcePlug, 
        MPlug & destinationPlug, 
        bool    force )
{
#if VERBOSE
        cerr << "In connectAttrToAttr "<<sourcePlug.name().asChar() 
                 << " " << destinationPlug.name().asChar()
                 << "\n";
#endif

        return connectAttr(sourcePlug, destinationPlug, force);
}