diff --git a/Engine/source/materials/materialFeatureTypes.cpp b/Engine/source/materials/materialFeatureTypes.cpp index 4d312a17d3..a1a6dafdfb 100644 --- a/Engine/source/materials/materialFeatureTypes.cpp +++ b/Engine/source/materials/materialFeatureTypes.cpp @@ -62,6 +62,7 @@ ImplementFeatureType( MFT_LightMap, MFG_Lighting, 3.0f, true ); ImplementFeatureType( MFT_ToneMap, MFG_Lighting, 4.0f, true ); ImplementFeatureType( MFT_VertLitTone, MFG_Lighting, 5.0f, false ); ImplementFeatureType( MFT_PixSpecular, MFG_Lighting, 6.0f, true ); +ImplementFeatureType( MFT_StaticCubemap, U32(-1), -1.0, true ); ImplementFeatureType( MFT_CubeMap, MFG_Lighting, 7.0f, true ); ImplementFeatureType( MFT_SubSurface, MFG_Lighting, 8.0f, true ); ImplementFeatureType( MFT_VertLit, MFG_Lighting, 9.0f, true ); diff --git a/Engine/source/materials/materialFeatureTypes.h b/Engine/source/materials/materialFeatureTypes.h index a4d15296ef..5920ce1d36 100644 --- a/Engine/source/materials/materialFeatureTypes.h +++ b/Engine/source/materials/materialFeatureTypes.h @@ -126,6 +126,7 @@ DeclareFeatureType( MFT_ToneMap ); DeclareFeatureType( MFT_VertLit ); DeclareFeatureType( MFT_VertLitTone ); +DeclareFeatureType( MFT_StaticCubemap ); DeclareFeatureType( MFT_CubeMap ); DeclareFeatureType( MFT_PixSpecular ); DeclareFeatureType( MFT_FlipRB ); diff --git a/Engine/source/materials/processedShaderMaterial.cpp b/Engine/source/materials/processedShaderMaterial.cpp index f7b6cf9edc..75a51d79ec 100644 --- a/Engine/source/materials/processedShaderMaterial.cpp +++ b/Engine/source/materials/processedShaderMaterial.cpp @@ -356,6 +356,7 @@ void ProcessedShaderMaterial::_determineFeatures( U32 stageNum, //if (features.hasFeature(MFT_SkyBox)) if (mMaterial->mIsSky) { + fd.features.addFeature(MFT_StaticCubemap); fd.features.addFeature(MFT_CubeMap); fd.features.addFeature(MFT_SkyBox); } diff --git a/Engine/source/renderInstance/renderPrePassMgr.cpp b/Engine/source/renderInstance/renderPrePassMgr.cpp index c0bf4ca9f1..576afbebc0 100644 --- a/Engine/source/renderInstance/renderPrePassMgr.cpp +++ b/Engine/source/renderInstance/renderPrePassMgr.cpp @@ -772,11 +772,12 @@ void ProcessedPrePassMaterial::_determineFeatures( U32 stageNum, if (!mMaterial->mEmissive[stageNum] && test && (test->getTypeMask() & (DynamicShapeObjectType | StaticObjectType | StaticShapeObjectType))) envmapped = true; // cubemaps only available on stage 0 for now - bramage - if ( stageNum < 1 && + if ( stageNum < 1 && ( ( mMaterial->mCubemapData && mMaterial->mCubemapData->mCubemap ) || - mMaterial->mDynamicCubemap ) || - mMaterial->mDynamicCubemap || envmapped) + mMaterial->mDynamicCubemap || envmapped) ) { + if (!mMaterial->mDynamicCubemap) + fd.features.addFeature(MFT_StaticCubemap); newFeatures.addFeature( MFT_CubeMap ); newFeatures.removeFeature(MFT_UseInstancing); } diff --git a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp index 8adc13e14c..26b8955f85 100644 --- a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp +++ b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp @@ -1908,9 +1908,10 @@ void ReflectCubeFeatGLSL::processPix( Vector &componentList, else blendOp = Material::Mul; } + + Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); if (fd.features[MFT_isDeferred]) { - Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); //metalness: black(0) = color, white(1) = reflection if (fd.features[MFT_ToneMap]) meta->addStatement(new GenOp(" @ *= vec4(pow(@,vec4(2.2)));\r\n", targ, texCube)); @@ -1919,7 +1920,7 @@ void ReflectCubeFeatGLSL::processPix( Vector &componentList, } else { - Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); + targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); Var *metalness = (Var*)LangElement::find("metalness"); if (metalness) { @@ -1930,6 +1931,8 @@ void ReflectCubeFeatGLSL::processPix( Vector &componentList, else meta->addStatement(new GenOp(" @.rgb *= @.rgb;\r\n", targ, texCube)); } + if (fd.features[MFT_StaticCubemap]) //dynamic reflections are linearized coming and going. so do statics twice + meta->addStatement(new GenOp(" @ = vec4(pow(@,vec4(2.2)));\r\n", targ, targ)); output = meta; } diff --git a/Engine/source/shaderGen/GLSL/shaderGenGLSLInit.cpp b/Engine/source/shaderGen/GLSL/shaderGenGLSLInit.cpp index 84495f4e59..ca5b3b1e59 100644 --- a/Engine/source/shaderGen/GLSL/shaderGenGLSLInit.cpp +++ b/Engine/source/shaderGen/GLSL/shaderGenGLSLInit.cpp @@ -63,6 +63,7 @@ void _initShaderGenGLSL( ShaderGen *shaderGen ) FEATUREMGR->registerFeature( MFT_NormalMap, new BumpFeatGLSL ); FEATUREMGR->registerFeature( MFT_DetailNormalMap, new NamedFeatureGLSL( "Detail Normal Map" ) ); FEATUREMGR->registerFeature( MFT_DetailMap, new DetailFeatGLSL ); + FEATUREMGR->registerFeature( MFT_StaticCubemap, new NamedFeatureGLSL( "Static Cubemap" ) ); FEATUREMGR->registerFeature( MFT_CubeMap, new ReflectCubeFeatGLSL ); FEATUREMGR->registerFeature( MFT_PixSpecular, new PixelSpecularGLSL ); FEATUREMGR->registerFeature( MFT_FlipRB, new NamedFeatureGLSL( "Substance Workaround" ) ); diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp index 9db60e96f5..6f9e45864f 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp @@ -1907,9 +1907,10 @@ void ReflectCubeFeatHLSL::processPix( Vector &componentList, else blendOp = Material::Mul; } + + Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); if (fd.features[MFT_isDeferred]) { - Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); //metalness: black(0) = color, white(1) = reflection if (fd.features[MFT_ToneMap]) meta->addStatement(new GenOp(" @ *= pow(@,2.2);\r\n", targ, texCube)); @@ -1919,7 +1920,7 @@ void ReflectCubeFeatHLSL::processPix( Vector &componentList, else { meta->addStatement(new GenOp(" //forward lit cubemapping\r\n")); - Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); + targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); Var *metalness = (Var*)LangElement::find("metalness"); if (metalness) @@ -1931,6 +1932,8 @@ void ReflectCubeFeatHLSL::processPix( Vector &componentList, else meta->addStatement(new GenOp(" @.rgb *= @.rgb;\r\n", targ, texCube)); } + if (fd.features[MFT_StaticCubemap]) //dynamic reflections are linearized coming and going. so do statics twice + meta->addStatement(new GenOp(" @ = pow(@,2.2);\r\n", targ, targ)); output = meta; } diff --git a/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp b/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp index f0f1a93f60..4e649111a0 100644 --- a/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp +++ b/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp @@ -62,6 +62,7 @@ void _initShaderGenHLSL( ShaderGen *shaderGen ) FEATUREMGR->registerFeature( MFT_NormalMap, new BumpFeatHLSL ); FEATUREMGR->registerFeature( MFT_DetailNormalMap, new NamedFeatureHLSL( "Detail Normal Map" ) ); FEATUREMGR->registerFeature( MFT_DetailMap, new DetailFeatHLSL ); + FEATUREMGR->registerFeature( MFT_StaticCubemap, new NamedFeatureHLSL( "Static Cubemap" ) ); FEATUREMGR->registerFeature( MFT_CubeMap, new ReflectCubeFeatHLSL ); FEATUREMGR->registerFeature( MFT_PixSpecular, new PixelSpecularHLSL ); FEATUREMGR->registerFeature( MFT_IsTranslucent, new NamedFeatureHLSL( "Translucent" ) );