#include <maya/MString.h>
#include <maya/MDrawContext.h>
#include <maya/MHWGeometry.h>
#include "GLSLShaderOverride.h"
#include "GLSLShaderSemantics.h"
#include "GLSLShader.h"
#if defined(OSMac_)
# include <OpenGL/gl.h>
#else
# include <GL/gl.h>
#endif
#define ENABLE_TRACE_API_CALLS
#ifdef ENABLE_TRACE_API_CALLS
#define TRACE_API_CALLS(x) cerr << "GLSLShaderOverride: "<<(x)<<"\n"
#else
#define TRACE_API_CALLS(x)
#endif
#define ENABLE_PRINT_DEBUGGING
#ifdef ENABLE_PRINT_DEBUGGING
#define PRINT_DEBUGGING(x) cerr << "GLSLShaderOverride:: "<<(x)<<"\n"
#else
#define PRINT_DEBUGGING(x)
#endif
GLSLShaderOverride::GLSLShaderOverride(
const MObject& obj)
, fBBoxExtraScale(1.0)
, fShaderBound(false)
, fShaderNode(NULL)
{
if(shaderNode) {
fBBoxExtraScale = shaderNode->techniqueBBoxExtraScale();
}
}
{
return new GLSLShaderOverride(obj);
}
GLSLShaderOverride::~GLSLShaderOverride()
{
}
MString GLSLShaderOverride::initialize(
const MInitContext& initContext, MInitFeedback& initFeedback)
{
fShaderNode = NULL;
MInitContext* nonConst = const_cast<MInitContext*>(&initContext);
}
if(fShaderNode)
{
if (shaderInstance)
{
if( fShaderNode->hasUpdatedVaryingInput() ) {
fShaderNode->updateGeometryRequirements();
}
addGeometryRequirements(fShaderNode->geometryRequirements());
addShaderSignature(*shaderInstance);
}
MString customPrimitiveGeneratorName = fShaderNode->techniqueIndexBufferType();
{
addIndexingRequirement(indexingRequirement);
}
}
MString result =
MString(
"Autodesk Maya GLSLShaderOverride, nodeName=");
result += fShaderNode ? fShaderNode->name() :
MString(
"null");
result +=
MString(
", effectFileName=");
result += fShaderNode ? fShaderNode->effectName() :
MString(
"null");
result += fShaderNode ? fShaderNode->techniqueName() :
MString(
"null");
if(fShaderNode && fShaderNode->techniqueIsSelectable()) {
result +=
MString(
", selectable=true");
}
return result;
}
void GLSLShaderOverride::updateDG(
MObject object)
{
}
void GLSLShaderOverride::updateDevice()
{
}
void GLSLShaderOverride::endUpdate()
{
}
{
if(fShaderNode)
{
if (shaderInstance)
{
shaderInstance->
bind(context);
fShaderBound = true;
}
}
}
{
return (fShaderNode && fShaderNode->techniqueHandlesContext(context));
}
{
if (!fShaderNode)
return false;
if (!fShaderBound)
return false;
if (!shaderInstance)
return false;
bool drewSomething = false;
const int itemCount = renderItemList.
length();
for (int itemId = 0; itemId < itemCount; ++itemId)
{
if (item == NULL)
continue;
GLSLShaderNode::RenderItemDesc renderItemDesc = { false, false, false };
fShaderNode->updateOverrideNonMaterialItemParameters(context, item, renderItemDesc);
const unsigned int passCount = shaderInstance->
getPassCount(context);
for (unsigned int passIndex = 0; passIndex < passCount; ++passIndex)
{
if( fShaderNode->passHandlesContext(context, passIndex, &renderItemDesc) )
{
drewSomething = true;
}
}
}
return drewSomething;
}
{
if (fShaderBound && fShaderNode)
{
if (shaderInstance)
{
shaderInstance->
unbind(context);
}
}
fShaderBound = false;
}
{
}
bool GLSLShaderOverride::isTransparent()
{
return fShaderNode && fShaderNode->techniqueIsTransparent();
}
bool GLSLShaderOverride::supportsAdvancedTransparency() const
{
return fShaderNode && fShaderNode->techniqueSupportsAdvancedTransparency();
}
bool GLSLShaderOverride::overridesDrawState()
{
return fShaderNode && fShaderNode->techniqueOverridesDrawState();
}
double GLSLShaderOverride::boundingBoxExtraScale() const
{
return fShaderNode ? fShaderNode->techniqueBBoxExtraScale() : fBBoxExtraScale;
}
bool GLSLShaderOverride::overridesNonMaterialItems() const
{
return fShaderNode ? fShaderNode->techniqueOverridesNonMaterialItems() : false;
}
bool GLSLShaderOverride::handlesConsolidatedGeometry() const
{
return fShaderNode ? fShaderNode->techniqueHandlesConsolidatedGeometry() : true;
}
{
return fShaderNode ? fShaderNode->GetGLSLShaderInstance() : NULL;
}
bool GLSLShaderOverride::rebuildAlways()
{
if( fShaderNode ) {
if( fShaderNode->hasUpdatedVaryingInput() ) {
fShaderNode->updateGeometryRequirements();
return true;
}
}
return false;
}