#include "customTextureShaderOverride.h"
#include "customTextureShader.h"
#include <maya/MString.h>
#include <maya/MDrawContext.h>
customTextureShaderOverride::customTextureShaderOverride(
const MObject& obj)
: MHWRender::MPxShaderOverride(obj)
{
m_beautyShaderInstance = NULL;
m_shaderBound = false;
m_inBeautyPass = false;
m_customTextureData = NULL;
if (!renderer)
return;
if (!shaderMgr)
return;
MString(
"/devkit/plug-ins/customTextureShader/CustomTextureBlock10.fx"));
}
{
return new customTextureShaderOverride(obj);
}
customTextureShaderOverride::~customTextureShaderOverride()
{
if (m_beautyShaderInstance)
{
if (renderer)
{
if (shaderMgr)
{
m_beautyShaderInstance = NULL;
}
}
}
delete m_customTextureData;
m_customTextureData = NULL;
}
MString customTextureShaderOverride::initialize(
const MInitContext& initContext, MInitFeedback& initFeedback)
{
empty,
3);
empty,
2);
addGeometryRequirement(positionDesc);
addGeometryRequirement(uvDesc);
if (m_beautyShaderInstance)
{
addShaderSignature(*m_beautyShaderInstance);
}
return MString(
"customTextureShaderOverride");
}
{
if (m_inBeautyPass)
{
return m_beautyShaderInstance;
}
return NULL;
}
void customTextureShaderOverride::updateDG(
MObject object)
{
}
void customTextureShaderOverride::updateDevice()
{
updateShaderInstance();
buildAndUpdateCustomDataTextureViaMaya();
}
void customTextureShaderOverride::endUpdate()
{
}
{
m_inBeautyPass = false;
bool handlePass = false;
for (
unsigned int i=0; i<passSem.
length(); i++)
{
{
if (!hasOverrideShader)
handlePass = true;
m_inBeautyPass = true;
}
{
handlePass = false;
}
}
return handlePass;
}
{
if (m_inBeautyPass && m_beautyShaderInstance)
{
m_beautyShaderInstance->bind(context);
m_shaderBound = true;
}
}
{
if (!m_shaderBound)
return false;
if (m_inBeautyPass && m_beautyShaderInstance)
{
unsigned int passCount = m_beautyShaderInstance->getPassCount(context);
if (passCount)
{
for (unsigned int i=0; i<passCount; i++)
{
m_beautyShaderInstance->activatePass(context, i);
}
}
return true;
}
return false;
}
{
if (m_shaderBound)
{
if (m_inBeautyPass && m_beautyShaderInstance)
{
m_beautyShaderInstance->unbind(context);
}
}
m_shaderBound = false;
}
{
}
bool customTextureShaderOverride::isTransparent()
{
return false;
}
bool customTextureShaderOverride::overridesDrawState()
{
return false;
}
void customTextureShaderOverride::updateShaderInstance()
{
if (!renderer)
return;
if (m_beautyShaderInstance)
{
m_beautyShaderInstance->setParameter("colVal", 1.0f);
}
}
void customTextureShaderOverride::buildAndUpdateCustomDataTextureViaMaya()
{
if (!renderer)
return;
generateCustomTexture();
if (myTex && m_beautyShaderInstance)
{
texResource.
texture = myTex;
m_beautyShaderInstance->setParameter("MyTexture", texResource);
}
}
void customTextureShaderOverride::generateCustomTexture()
{
int textureSize = 256;
int numSlice = 1;
if (!m_customTextureData)
{
m_customTextureData = new unsigned char[4*textureSize*textureSize*numSlice];
float intensity = 1.0f;
int index = 0;
for (int face=0 ; face<numSlice ; face++)
{
for (int j=0 ; j<textureSize ; j++)
{
for (int i=0 ; i<textureSize ; i++)
{
m_customTextureData[index++] = (unsigned char)(255*intensity);
m_customTextureData[index++] = (unsigned char)(255*intensity);
m_customTextureData[index++] = (unsigned char)(255*intensity);
m_customTextureData[index++] = 255;
}
}
}
m_desc.setToDefault2DTexture();
m_desc.fWidth = textureSize;
m_desc.fHeight = textureSize;
m_desc.fDepth = 1;
m_desc.fBytesPerRow = 4*textureSize;
m_desc.fBytesPerSlice = 4*textureSize*textureSize;
m_desc.fMipmaps = 1;
m_desc.fArraySlices = numSlice;
}
}