Update shaderFeature.cpp

This commit is contained in:
marauder2k7 2025-12-08 07:46:33 +00:00
parent 7ea1cb2843
commit f5414c9e64

View file

@ -27,141 +27,74 @@
#include "shaderGen/shaderOp.h" #include "shaderGen/shaderOp.h"
void ShaderFeature::addDependency( const ShaderDependency *dependsOn ) void ShaderFeature::addDependency(const ShaderDependency* dependsOn)
{ {
for ( U32 i = 0; i < mDependencies.size(); i++ ) for (U32 i = 0; i < mDependencies.size(); i++)
{ {
if ( *mDependencies[i] == *dependsOn ) if (*mDependencies[i] == *dependsOn)
return; return;
} }
mDependencies.push_back( dependsOn ); mDependencies.push_back(dependsOn);
} }
Var* ShaderFeature::getVertTexCoord(const String& name) ShaderFeature::Resources ShaderFeature::getResources(const MaterialFeatureData& fd)
{
Var* inTex = NULL;
for (U32 i = 0; i < LangElement::elementList.size(); i++)
{
if (!String::compare((char*)LangElement::elementList[i]->name, name.c_str()))
{
inTex = dynamic_cast<Var*>(LangElement::elementList[i]);
if (inTex)
{
// NOTE: This used to do this check...
//
// String::compare( (char*)inTex->structName, "IN" )
//
// ... to ensure that the var was from the input
// vertex structure, but this kept some features
// ( ie. imposter vert ) from decoding their own
// coords for other features to use.
//
// If we run into issues with collisions between
// IN vars and local vars we may need to revise.
break;
}
}
}
return inTex;
}
LangElement* ShaderFeature::expandNormalMap(LangElement* sampleNormalOp, LangElement* normalDecl, LangElement* normalVar, const MaterialFeatureData& fd)
{
MultiLine* meta = new MultiLine;
const bool hasBc3 = fd.features.hasFeature(MFT_IsBC3nm, getProcessIndex());
const bool hasBc5 = fd.features.hasFeature(MFT_IsBC5nm, getProcessIndex());
if (hasBc3 || hasBc5)
{
if (fd.features[MFT_ImposterVert])
{
// The imposter system uses object space normals and
// encodes them with the z axis in the alpha component.
meta->addStatement(new GenOp(" @ = @( normalize( @.xyw * 2.0 - 1.0 ), 0.0 ); // Obj DXTnm\r\n", normalDecl, new TypeOp(GFXSCT_Float4), sampleNormalOp));
}
else if (hasBc3)
{
// BC3 Swizzle trick
meta->addStatement(new GenOp(" @ = @( @.ag * 2.0 - 1.0, 0.0, 0.0 ); // DXTnm\r\n", normalDecl, new TypeOp(GFXSCT_Float4), sampleNormalOp));
meta->addStatement(new GenOp(" @.z = sqrt( 1.0 - dot( @.xy, @.xy ) ); // DXTnm\r\n", normalVar, normalVar, normalVar));
}
else if (hasBc5)
{
// BC5
meta->addStatement(new GenOp(" @ = @( @.gr * 2.0 - 1.0, 0.0, 0.0 ); // bc5nm\r\n", normalDecl, new TypeOp(GFXSCT_Float4), sampleNormalOp));
meta->addStatement(new GenOp(" @.z = sqrt( 1.0 - dot( @.xy, @.xy ) ); // bc5nm\r\n", normalVar, normalVar, normalVar));
}
}
else
{
meta->addStatement(new GenOp(" @ = @;\r\n", normalDecl, sampleNormalOp));
meta->addStatement(new GenOp(" @.xyz = @.xyz * 2.0 - 1.0;\r\n", normalVar, normalVar));
}
return meta;
}
ShaderFeature::Resources ShaderFeature::getResources( const MaterialFeatureData &fd )
{ {
Resources temp; Resources temp;
return temp; return temp;
} }
const char* ShaderFeature::getOutputTargetVarName( OutputTarget target ) const const char* ShaderFeature::getOutputTargetVarName(OutputTarget target) const
{ {
const char* targName = "col"; const char* targName = "col";
switch(target) switch (target)
{ {
case DefaultTarget: case DefaultTarget:
targName = "col"; targName = "col";
break; break;
case RenderTarget1: case RenderTarget1:
targName = "col1"; targName = "col1";
break; break;
case RenderTarget2: case RenderTarget2:
targName = "col2"; targName = "col2";
break; break;
case RenderTarget3: case RenderTarget3:
targName = "col3"; targName = "col3";
break; break;
case RenderTarget4: case RenderTarget4:
targName = "col4"; targName = "col4";
break; break;
case RenderTarget5: case RenderTarget5:
targName = "col5"; targName = "col5";
break; break;
} }
return targName; return targName;
} }
Var* ShaderFeature::findOrCreateLocal( const char *name, Var* ShaderFeature::findOrCreateLocal(const char* name,
const char *type, const char* type,
MultiLine *multi ) MultiLine* multi)
{ {
Var *outVar = (Var*)LangElement::find( name ); Var* outVar = (Var*)LangElement::find(name);
if ( !outVar ) if (!outVar)
{ {
outVar = new Var; outVar = new Var;
outVar->setType( type ); outVar->setType(type);
outVar->setName( name ); outVar->setName(name);
multi->addStatement( new GenOp( " @;\r\n", new DecOp( outVar ) ) ); multi->addStatement(new GenOp(" @;\r\n", new DecOp(outVar)));
} }
return outVar; return outVar;
} }
void ShaderFeature::setInstancingFormat(GFXVertexFormat *format) void ShaderFeature::setInstancingFormat(GFXVertexFormat* format)
{ {
mInstancingFormat = format; mInstancingFormat = format;
} }