#include "shaderGen/shaderFeature.h"
#include "shaderGen/shaderOp.h"
#include "shaderGen/featureMgr.h"
#include "materials/materialFeatureTypes.h"
#include "gfx/gfxDevice.h"
class ConstantMultFeature : public ShaderFeature
{
public:
virtual void processPix( Vector &componentList, const MaterialFeatureData &fd )
{
// Find the constant value
Var *multConst = (Var *)( LangElement::find("multConst") );
if( multConst == NULL )
{
multConst = new Var;
multConst->setType( GFX->getAdapterType() == OpenGL ? "vec4" : "float4" );
multConst->setName( "multConst" );
multConst->constSortPos = cspPotentialPrimitive;
multConst->uniform = true;
}
// Find output fragment
Var *color = (Var*) LangElement::find( getOutputTargetVarName(DefaultTarget) );
if ( !color )
{
color = new Var;
color->setType( GFX->getAdapterType() == OpenGL ? "vec4" : "fragout" );
color->setName( getOutputTargetVarName(DefaultTarget) );
if(GFX->getAdapterType() != OpenGL)
color->setStructName( "OUT" );
output = new GenOp( "@ = @", color, multConst );
}
output = new GenOp( " @ *= @;\r\n", color, multConst );
}
virtual String getName() { return "ConstantMultFeature"; }
// These methods aren't used
virtual Var* getVertTexCoord( const String &name ) { return NULL; }
virtual LangElement *setupTexSpaceMat( Vector &componentList, Var **texSpaceMat ) { return NULL; }
virtual LangElement *expandNormalMap( LangElement *sampleNormalOp, LangElement *normalDecl, LangElement *normalVar, const MaterialFeatureData &fd ) { return NULL; }
virtual LangElement *assignColor( LangElement *elem, Material::BlendOp blend, LangElement *lerpElem = NULL, ShaderFeature::OutputTarget outputTarget = ShaderFeature::DefaultTarget ) { return NULL; }
};
class ConstMultFeatureReg
{
bool _handleGFXEvent(GFXDevice::GFXDeviceEventType evt)
{
if( evt == GFXDevice::deInit )
{
FEATUREMGR->registerFeature( MFT_ConstantMult, new ConstantMultFeature );
}
else if( evt == GFXDevice::deDestroy )
{
FEATUREMGR->unregisterFeature( MFT_ConstantMult );
}
return true;
}
public:
ConstMultFeatureReg()
{
GFXDevice::getDeviceEventSignal().notify(this, &ConstMultFeatureReg::_handleGFXEvent, 999.0f);
}
};
static ConstMultFeatureReg sConstMultFeatureReg;