#include <maya/MIOStream.h>
#include <math.h>
#include <cstdlib>
#include <maya/MString.h>
#include <maya/MPlug.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MFloatVector.h>
#include <maya/MFnPlugin.h>
#include <maya/MFnDependencyNode.h>
#include <maya/MHWShaderSwatchGenerator.h>
#include <maya/MImage.h>
#include <maya/MRenderUtilities.h>
#include <maya/MMatrix.h>
#include <maya/MDrawRegistry.h>
#include <maya/MPxShaderOverride.h>
#include <maya/MDrawContext.h>
#include <maya/MStateManager.h>
#include <maya/MViewport2Renderer.h>
#include <maya/MShaderManager.h>
#undef ENABLE_TRACE_API_CALLS
#ifdef ENABLE_TRACE_API_CALLS
#define TRACE_API_CALLS(x) cerr <<(x)<<"\n"
#else
#define TRACE_API_CALLS(x)
#endif
#include "vp2BlinnShader.h"
MTypeId vp2BlinnShader::id( 0x00081102 );
 
MObject  vp2BlinnShader::aTransparency;
 
MObject  vp2BlinnShader::aSpecularColor;
 
MObject  vp2BlinnShader::aNonTexturedColor;
 
MObject  vp2BlinnShader::aNonTexturedTransparency;
 
void * vp2BlinnShader::creator()
{
    TRACE_API_CALLS("vp2BlinnShader::creator");
    return new vp2BlinnShader();
}
vp2BlinnShader::vp2BlinnShader()
{
    TRACE_API_CALLS("vp2BlinnShader::vp2BlinnShader");
}
vp2BlinnShader::~vp2BlinnShader()
{
    TRACE_API_CALLS("vp2BlinnShader::~vp2BlinnShader");
}
MStatus vp2BlinnShader::initialize()
 
{
    
    
    
    
    TRACE_API_CALLS("vp2BlinnShader::initialize");
    
    
    aSpecularColor = nAttr.
createColor( 
"specularColor", 
"sc" );
    
    aNonTexturedColor = nAttr.
createColor( 
"nonTexturedColor", 
"nc");
    
    
    
    
    
    addAttribute(aColor);
    addAttribute(aTransparency);
    addAttribute(aSpecularColor);
    addAttribute(aNonTexturedColor);
    addAttribute(aNonTexturedTransparency);
    attributeAffects (aColor,           outColor);
    attributeAffects (aTransparency,    outColor);
    attributeAffects (aSpecularColor,   outColor);
    attributeAffects (aNonTexturedColor,outColor);
    attributeAffects (aNonTexturedTransparency,outColor);
}
{
    TRACE_API_CALLS("vp2BlinnShader::compute");
    if ((plug != outColor) && (plug.
parent() != outColor))
 
    
    outColor = color;
}
{   
    {
        
        MString meshShaderball(
"meshShaderball");
 
        unsigned int targetW, targetH;
        outImage.
getSize(targetW, targetH);
                                                                        thisMObject(), 
                                                                        outImage, 
    }
}
{
public:
    
    {
        return new vp2BlinnShaderOverride(obj);
    }
    
    virtual ~vp2BlinnShaderOverride()
    {
        if (theRenderer)
        {
            if (shaderMgr)
            {
                if (fColorShaderInstance)
                {
                }
                fColorShaderInstance = NULL;
                if (fNonTexturedColorShaderInstance)
                {
                }
                fColorShaderInstance = NULL;
            }
        }
        
    }
    
    
    
    
                                     MInitFeedback& initFeedback)
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::initialize");
        if (fColorShaderInstance)
        {
            
            
            
            
            
            
            
    
            
        }
        return MString(
"Autodesk Maya vp2 Blinn Shader Override");
 
    }
    
    
    
    
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::updateDG");
            return;
        
        if (!shaderNode)
            return;
        
        if (status)
        {
            node.findPlug("colorR").getValue(fDiffuse[0]);
            node.findPlug("colorG").getValue(fDiffuse[1]);
            node.findPlug("colorB").getValue(fDiffuse[2]);
            node.findPlug("transparency").getValue(fTransparency);
            fDiffuse[3] = 1.0f - fTransparency;
                    
            node.findPlug("specularColorR").getValue(fSpecular[0]);
            node.findPlug("specularColorG").getValue(fSpecular[1]);
            node.findPlug("specularColorB").getValue(fSpecular[2]);
            node.findPlug("nonTexturedColorR").getValue(fNonTextured[0]);
            node.findPlug("nonTexturedColorG").getValue(fNonTextured[1]);
            node.findPlug("nonTexturedColorB").getValue(fNonTextured[2]);
            float nonTextureTransparency = 0.0f;
            node.findPlug("nonTexturedTransparency").getValue(nonTextureTransparency);          
            fNonTextured[3] = 1.0f - nonTextureTransparency;
        }
    }
    
    
    
    {
        updateShaderInstance();
    }
    
    
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::isTransparent");
        return (fTransparency > 0.0f);
    }
    
    
    
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::endUpdate");
    }
    
    
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::shaderInstance");
        return fColorShaderInstance;
    }
    
    
    
    {
        MString out(
"vp2BlinnShaderOverride::activateKey[");
 
        out += key;
        out += "]";
        TRACE_API_CALLS(out.asChar());
        fColorShaderInstance->bind( context );
    }
    
    
    
    {
        MString out(
"vp2BlinnShaderOverride::draw[Count=");
 
        out += renderItemList.
length();
        out += "]";
        TRACE_API_CALLS(out);
        
        unsigned int passCount = fColorShaderInstance->getPassCount( context );
        for (unsigned int i=0; i<passCount; i++)
        {
            fColorShaderInstance->activatePass( context, i );
        }
        return true;
    }
    
    
    {
        MString out(
"vp2BlinnShaderOverride::terminateKey[");
 
        out += key;
        out += "]";
        TRACE_API_CALLS(out.asChar());
        
        fColorShaderInstance->unbind( context );
    }
    
    
    
    {
    }
    
    
    
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::nonTexturedShaderInstance");
        if (fNonTexturedColorShaderInstance)
        {
            monitor = true;
            
            fNonTexturedColorShaderInstance->setIsTransparent( fNonTextured[3] != 1.0f );
            return fNonTexturedColorShaderInstance;
        }
        return NULL;
    }
protected:
    
    
    
    
    void updateShaderInstance()
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::updateShaderInstance");
        
        if (fColorShaderInstance)
        {
            
            fColorShaderInstance->setParameter("diffuseColor", &fDiffuse[0] );
            fColorShaderInstance->setParameter("specularColor", &fSpecular[0] );
        }
        if (fNonTexturedColorShaderInstance)
        {
            fNonTexturedColorShaderInstance->setParameter("diffuseColor", &fNonTextured[0]);
            fNonTexturedColorShaderInstance->setIsTransparent( fNonTextured[3] != 1.0f );
        }
    }
    
    
    
    void createShaderInstance()
    {
        TRACE_API_CALLS("vp2BlinnShaderOverride::createShaderInstance");
        if (!shaderMgr)
            return;
        if (!fColorShaderInstance)
        {
        }
        if (!fNonTexturedColorShaderInstance)
        {
            if (fNonTexturedColorShaderInstance)
            {
                fNonTexturedColorShaderInstance->
setParameter(
"diffuseColor", &fNonTextured[0]);
            }
        }
    }
    
    
    
    vp2BlinnShaderOverride(
const MObject& obj)
    , fColorShaderInstance(NULL)
    , fNonTexturedColorShaderInstance(NULL)
    , fTransparency(0.0f)
    {       
        fDiffuse[0] = fDiffuse[1] = fDiffuse[2] = fDiffuse[3] = 0.0f;
        fSpecular[0] = fSpecular[1] = fSpecular[2] = 0.0f;
        fNonTextured[0] = 1.0; fNonTextured[1] = fNonTextured[2] = 0.0f;
        fNonTextured[3] = 1.0f;
        
        
        createShaderInstance();
    }
    
    float fTransparency;
    float fDiffuse[4];
    float fSpecular[3];
    float fShininess[3];
    float fNonTextured[4];
    
    
};
static const MString svp2BlinnShaderRegistrantId(
"vp2BlinnShaderRegistrantId");
 
{
    TRACE_API_CALLS("initializePlugin");
    const MString UserClassify( 
"shader/surface/utility/:drawdb/shader/surface/vp2BlinnShader:swatch/"+swatchName);
 
    MFnPlugin plugin( obj, PLUGIN_COMPANY, 
"1.0", 
"Any");
 
    status = plugin.registerNode( "vp2BlinnShader", vp2BlinnShader::id,
                                  vp2BlinnShader::creator, vp2BlinnShader::initialize,
    if (!status) {
        status.
perror(
"registerNode");
        return status;
    }
    
        "drawdb/shader/surface/vp2BlinnShader",
        svp2BlinnShaderRegistrantId,
        vp2BlinnShaderOverride::Creator);
}
{
    TRACE_API_CALLS("uninitializePlugin");
    
    plugin.deregisterNode( vp2BlinnShader::id );
    if (!status) {
        status.
perror(
"deregisterNode");
        return status;
    }
    
        "drawdb/shader/surface/vp2BlinnShader", svp2BlinnShaderRegistrantId);
}