mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-11 14:44:36 +00:00
Update shaderFeature.cpp
This commit is contained in:
parent
7ea1cb2843
commit
f5414c9e64
1 changed files with 35 additions and 102 deletions
|
|
@ -27,141 +27,74 @@
|
|||
#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;
|
||||
}
|
||||
|
||||
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;
|
||||
Resources temp;
|
||||
return temp;
|
||||
}
|
||||
|
||||
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;
|
||||
return temp;
|
||||
}
|
||||
|
||||
const char* ShaderFeature::getOutputTargetVarName( OutputTarget target ) const
|
||||
const char* ShaderFeature::getOutputTargetVarName(OutputTarget target) const
|
||||
{
|
||||
const char* targName = "col";
|
||||
|
||||
switch(target)
|
||||
switch (target)
|
||||
{
|
||||
case DefaultTarget:
|
||||
targName = "col";
|
||||
break;
|
||||
case DefaultTarget:
|
||||
targName = "col";
|
||||
break;
|
||||
|
||||
case RenderTarget1:
|
||||
case RenderTarget1:
|
||||
targName = "col1";
|
||||
break;
|
||||
break;
|
||||
|
||||
case RenderTarget2:
|
||||
targName = "col2";
|
||||
break;
|
||||
case RenderTarget2:
|
||||
targName = "col2";
|
||||
break;
|
||||
|
||||
case RenderTarget3:
|
||||
targName = "col3";
|
||||
break;
|
||||
case RenderTarget3:
|
||||
targName = "col3";
|
||||
break;
|
||||
|
||||
case RenderTarget4:
|
||||
targName = "col4";
|
||||
break;
|
||||
case RenderTarget4:
|
||||
targName = "col4";
|
||||
break;
|
||||
|
||||
case RenderTarget5:
|
||||
targName = "col5";
|
||||
break;
|
||||
case RenderTarget5:
|
||||
targName = "col5";
|
||||
break;
|
||||
}
|
||||
|
||||
return targName;
|
||||
}
|
||||
|
||||
Var* ShaderFeature::findOrCreateLocal( const char *name,
|
||||
const char *type,
|
||||
MultiLine *multi )
|
||||
Var* ShaderFeature::findOrCreateLocal(const char* name,
|
||||
const char* type,
|
||||
MultiLine* multi)
|
||||
{
|
||||
Var *outVar = (Var*)LangElement::find( name );
|
||||
if ( !outVar )
|
||||
Var* outVar = (Var*)LangElement::find(name);
|
||||
if (!outVar)
|
||||
{
|
||||
outVar = new Var;
|
||||
outVar->setType( type );
|
||||
outVar->setName( name );
|
||||
multi->addStatement( new GenOp( " @;\r\n", new DecOp( outVar ) ) );
|
||||
outVar->setType(type);
|
||||
outVar->setName(name);
|
||||
multi->addStatement(new GenOp(" @;\r\n", new DecOp(outVar)));
|
||||
}
|
||||
|
||||
return outVar;
|
||||
}
|
||||
|
||||
void ShaderFeature::setInstancingFormat(GFXVertexFormat *format)
|
||||
void ShaderFeature::setInstancingFormat(GFXVertexFormat* format)
|
||||
{
|
||||
mInstancingFormat = format;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue