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

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