#ifndef _cgfxShaderNode_h_
#define _cgfxShaderNode_h_
#include "cgfxShaderCommon.h"
#include <maya/MFnNumericAttribute.h>
#include <maya/MNodeMessage.h>
#include <maya/MObjectArray.h>
#include <maya/MPxHwShaderNode.h>
#include <maya/MPxNode.h>
#include <maya/MStateManager.h>
#include <maya/MStringArray.h>
#include <maya/MTypeId.h>
#include <maya/MPxShaderOverride.h>
#include "cgfxEffectDef.h"
#include "cgfxAttrDef.h"
#define CGFXSHADERNODE_GL_TEXTURE_MAX 32 // GL_TEXTURE31-GL_TEXTURE0+1
#define CGFXSHADERNODE_GL_COLOR_MAX 1
class cgfxShaderNode : public MPxHwShaderNode
{
friend class cgfxShaderCmd;
friend class cgfxAttrDef;
friend class cgfxShaderOverride;
public:
cgfxShaderNode();
virtual void postConstructor();
virtual ~cgfxShaderNode();
virtual MStatus compute( const MPlug& plug, MDataBlock& data );
static void* creator();
static MStatus initialize();
static void initializeNodeAttrs();
virtual void copyInternalData( MPxNode* pSrc );
virtual bool getInternalValueInContext( const MPlug&,
MDataHandle&,
MDGContext&);
virtual bool setInternalValueInContext( const MPlug&,
const MDataHandle&,
MDGContext&);
virtual bool supportsBatching() const;
virtual bool invertTexCoords() const;
virtual bool hasTransparency();
virtual unsigned int transparencyOptions();
virtual MStatus glBind(const MDagPath& shapePath);
void bindAttrValues();
void bindViewAttrValues(const MDagPath& shapePath);
#if MAYA_API_VERSION >= 700
#define _SWATCH_RENDERING_SUPPORTED_ 1
#endif
#if defined(_SWATCH_RENDERING_SUPPORTED_)
virtual MStatus renderSwatchImage( MImage & image );
#endif
virtual MStatus glUnbind(const MDagPath& shapePath);
virtual MStatus glGeometry( const MDagPath& shapePath,
int prim,
unsigned int writable,
int indexCount,
const unsigned int * indexArray,
int vertexCount,
const int * vertexIDs,
const float * vertexArray,
int normalCount,
const float ** normalArrays,
int colorCount,
const float ** colorArrays,
int texCoordCount,
const float ** texCoordArrays);
virtual int getTexCoordSetNames( MStringArray& names );
#if MAYA_API_VERSION >= 700
virtual int getColorSetNames( MStringArray& names );
#else
virtual int colorsPerVertex();
#endif
virtual int normalsPerVertex();
cgfxAttrDefList* attrDefList() const { return fAttrDefList; };
void setAttrDefList(cgfxAttrDefList* list);
MString shaderFxFile() const { return fShaderFxFile; };
bool shaderFxFileChanged() const { return fShaderFxFileChanged; }
void setShaderFxFileChanged(bool val) { fShaderFxFileChanged = val; }
MString getTechnique() const { return fTechnique; };
const MStringArray& getTechniqueList() const { return fTechniqueList; }
void getAttributeList(MStringArray& attrList) const;
void setAttributeList(const MStringArray& attrList);
void setVertexAttributes( cgfxVertexAttribute* attributeList);
void setVertexAttributeSource( const MStringArray& sources);
void analyseVertexAttributes();
const MStringArray& getTexCoordSource() const;
const MStringArray& getColorSource() const;
const MStringArray& getEmptyUVSets() const;
const MObjectArray& getEmptyUVSetShapes() const;
inline bool getTexturesByName() const { return fTexturesByName; };
CGeffect effect() { return fEffect; };
void setEffect(CGeffect effect);
MStatus shouldSave ( const MPlug & plug, bool & ret );
static MString getPluginVersion();
protected:
bool createEffect();
void setShaderFxFile( const MString& fxFile )
{
if (fxFile != fShaderFxFile)
{
fShaderFxFile = fxFile;
fShaderFxFileChanged = true;
}
};
void setTechniqueHasBlending( CGtechnique technique );
void setTechnique( const MString& techn );
void setDataSources( const MStringArray* texCoordSources, const MStringArray* colorSources );
void updateDataSource( MStringArray& sources, MIntArray& typeList, MIntArray& indexList );
void setTexturesByName( bool texturesByName, bool updateAttributes = false);
void reportInternalError( const char* function, size_t errcode);
public:
static MTypeId sId;
static MObject sShader;
static MObject sTechnique;
static MObject sAttributeList;
static MObject sVertexAttributeList;
static MObject sVertexAttributeSource;
static MObject sTexCoordSource;
static MObject sColorSource;
static MObject sTexturesByName;
static CGcontext sCgContext;
static CGprofile sCgBestVtxProfile;
static CGprofile sCgBestGeomProfile;
static CGprofile sCgBestFragProfile;
static void cgErrorCallBack();
static void cgErrorHandler(CGcontext cgContext, CGerror cgError, void* userData);
protected:
cgfxEffect fNewEffect;
cgfxVertexAttribute* fVertexAttributes;
cgfxAttrDefList* fAttrDefList;
MString fShaderFxFile;
bool fShaderFxFileChanged;
MString fTechnique;
bool fTechniqueHasBlending;
MStringArray fAttributeListArray;
MStringArray fVertexAttributeListArray;
MStringArray fVertexAttributeSource;
bool fTexturesByName;
MStringArray fTexCoordSource;
MStringArray fColorSource;
MStringArray fUVSets;
MStringArray fColorSets;
int fNormalsPerVertex;
MIntArray fTexCoordType;
MIntArray fTexCoordIndex;
MIntArray fColorType;
MIntArray fColorIndex;
MStringArray fDataSetNames;
CGeffect fEffect;
MStringArray fTechniqueList;
GLboolean fDepthEnableState;
GLint fDepthFunc;
GLint fBlendSourceFactor;
GLint fBlendDestFactor;
bool fConstructed;
short fErrorCount;
short fErrorLimit;
MIntArray fCallbackIds;
};
class MHWRender::MDrawContext;
class cgfxShaderOverride : public MHWRender::MPxShaderOverride
{
public:
static MHWRender::MPxShaderOverride* Creator(const MObject& obj);
virtual ~cgfxShaderOverride();
virtual MString initialize(MObject object);
virtual void updateDG(MObject object);
virtual void updateDevice();
virtual void endUpdate();
virtual void activateKey(MHWRender::MDrawContext& context);
virtual bool draw(MHWRender::MDrawContext& context,
const MHWRender::MRenderItemList& renderItemList) const;
virtual void terminateKey(MHWRender::MDrawContext& context);
virtual bool isTransparent();
virtual bool rebuildAlways()
{
return true;
}
public:
static const MString drawDbClassification;
static const MString drawRegistrantId;
protected:
cgfxShaderOverride(const MObject& obj);
void bindAttrValues() const;
void bindViewAttrValues(const MHWRender::MDrawContext& context) const;
cgfxShaderNode *fShaderNode;
mutable bool fNeedPassSetterInit;
const MHWRender::MBlendState* fOldBlendState;
const MHWRender::MDepthStencilState* fOldDepthStencilState;
const MHWRender::MRasterizerState* fOldRasterizerState;
static cgfxShaderNode* sActiveShaderNode;
static cgfxShaderNode* sLastDrawShaderNode;
};
#endif