#ifndef GLSLSHADER_GLSLSHADER_H
#define GLSLSHADER_GLSLSHADER_H
#include <maya/MHWGeometry.h>
#include <maya/MMessage.h>
#include <maya/MPxHardwareShader.h>
#include <maya/MUniformParameter.h>
#include <maya/MUniformParameterList.h>
#include <maya/MVaryingParameter.h>
#include <maya/MVaryingParameterList.h>
#include <maya/MShaderManager.h>
#include <maya/MStringArray.h>
#include <maya/MDrawContext.h>
#include <vector>
#include <map>
#include <set>
{
public:
enum ERenderType
{
RENDER_SCENE,
RENDER_SWATCH,
RENDER_SWATCH_PROXY,
RENDER_UVTEXTURE,
RENDER_SCENE_DEFAULT_LIGHT
};
struct RenderItemDesc
{
bool isOverrideNonMaterialItem;
bool isFatLine;
bool isFatPoint;
};
public:
GLSLShaderNode();
~GLSLShaderNode() override;
static void* creator();
static void initializeNodeAttrs();
void clearParameters();
bool hasUpdatedVaryingInput() const;
void updateGeometryRequirements();
static const MString m_RegistrantId;
static const MString m_drawDbClassification;
bool reload();
MString techniqueName()
const {
return fTechniqueName; }
MStringArray techniqueNames()
const {
return fTechniqueNames; }
bool techniqueIsSelectable() const { return fTechniqueIsSelectable; }
bool techniqueIsTransparent() const { return fTechniqueIsTransparent; }
bool techniqueSupportsAdvancedTransparency() const { return fTechniqueSupportsAdvancedTransparency; }
bool techniqueOverridesDrawState() const { return fTechniqueOverridesDrawState; }
double techniqueBBoxExtraScale() const { return fTechniqueBBoxExtraScale; }
bool techniqueOverridesNonMaterialItems() const { return fTechniqueOverridesNonMaterialItems; }
bool techniqueHandlesConsolidatedGeometry() const { return fTechniqueHandlesConsolidatedGeometry; }
const MString& techniqueIndexBufferType()
const {
return fTechniqueIndexBufferType; }
enum ELightType
{
eInvalidLight,
eUndefinedLight,
eSpotLight,
ePointLight,
eDirectionalLight,
eAmbientLight,
eVolumeLight,
eAreaLight,
eDefaultLight,
eLightCount
};
enum ELightParameterType
{
eUndefined,
eLightPosition,
eLightDirection,
eLightColor,
eLightSpecularColor,
eLightAmbientColor,
eLightDiffuseColor,
eLightRange,
eLightFalloff,
eLightAttenuation0,
eLightAttenuation1,
eLightAttenuation2,
eLightTheta,
eLightPhi,
eLightShadowMap,
eLightShadowMapBias,
eLightShadowColor,
eLightShadowViewProj,
eLightShadowOn,
eLightIntensity,
eLightHotspot,
eLightEnable,
eLightType,
eDecayRate,
eLightAreaPosition0,
eLightAreaPosition1,
eLightAreaPosition2,
eLightAreaPosition3,
ePointLightShadowMap,
eLastParameterType,
};
class LightParameterInfo
{
public:
LightParameterInfo(
int lightIndex,
ELightType lightType = GLSLShaderNode::eInvalidLight,
bool hasLightTypeSemantics = false)
: mLightIndex(lightIndex)
, mLightType(lightType)
, fIsDirty(true)
, fHasLightTypeSemantics(hasLightTypeSemantics)
{
}
int mLightIndex;
ELightType mLightType;
bool fIsDirty;
bool fHasLightTypeSemantics;
typedef std::map<int, int> TConnectableParameters;
TConnectableParameters fConnectableParameters;
};
MStringArray getLightableParameters(
int lightIndex,
bool showSemantics);
MString& getLightParameterSemantic(
int lightParameterType);
void refreshLightConnectionAttributes(bool inSceneUpdateNotification = false);
void updateLightInfoFromSemantic(
const MString& parameterName,
int uniformParamIndex);
int getIndexForLightName(
const MString& lightName,
bool appendLight =
false);
const MStringArray& lightInfoDescription()
const {
return fLightDescriptions; }
void clearLightConnectionData(bool refreshAE=true);
MString getLightConnectionInfo(
int lightIndex);
void connectLight(
int lightIndex,
MDagPath lightPath);
bool passHandlesContext(
MHWRender::MDrawContext& context,
unsigned int passIndex,
const RenderItemDesc* renderItemDesc = NULL)
const;
private:
void configureUniforms();
void configureGeometryRequirements();
bool connectExplicitAmbientLight(
const LightParameterInfo& lightInfo,
const MObject& sourceLight)
const;
void turnOffLight(const LightParameterInfo& lightInfo) const;
void setLightRequiresShadows(
const MObject& lightObject,
bool requiresShadow)
const;
void updateImplicitLightParameterCache();
void refreshView() const;
void setLightParameterLocking(const LightParameterInfo& lightInfo, bool locked, bool refreshAE=true) const;
void getLightParametersToUpdate(std::set<int>& parametersToUpdate, ERenderType renderType) const;
bool appendParameterNameIfVisible(
int paramIndex,
MStringArray& paramArray)
const;
public:
void disconnectLight(int lightIndex);
const MStringArray& getUIGroups()
const {
return fUIGroupNames; }
int getIndexForUIGroupName(
const MString& uiGroupName)
const;
private:
bool loadEffect(
const MString& effectName );
void displayErrorAndWarnings(
const MString& message)
const;
private:
void deleteUniformUserData();
void* createUniformUserData(
const MString& parameterName);
const MString& getParameterName(
void* userData)
const;
private:
struct PassSpec
{
bool forFatLine;
bool forFatPoint;
};
struct UniformUserData
{
UniformUserData(
const MString& parameterName) : fParameterName(parameterName), fTexture(0) {};
};
private:
bool fEffectLoaded;
std::vector<UniformUserData*> fUniformUserData;
unsigned int fVaryingParametersUpdateId;
int fTechniqueIdx;
bool fTechniqueIsSelectable;
bool fTechniqueIsTransparent;
bool fTechniqueSupportsAdvancedTransparency;
bool fTechniqueOverridesDrawState;
int fTechniqueTextureMipmapLevels;
double fTechniqueBBoxExtraScale;
bool fTechniqueOverridesNonMaterialItems;
bool fTechniqueHandlesConsolidatedGeometry;
unsigned int fTechniquePassCount;
typedef std::map<unsigned int, PassSpec> PassSpecMap;
PassSpecMap fTechniquePassSpecs;
typedef std::vector<LightParameterInfo> LightParameterInfoVec;
LightParameterInfoVec fLightParameters;
mutable int fImplicitAmbientLight;
mutable MUint64 fLastFrameStamp;
std::vector<MStringArray> fUIGroupParameters;
};
#endif