From e87dc787eed275a70e2fed4371e82428094bfa8f Mon Sep 17 00:00:00 2001 From: Areloch Date: Sun, 30 Jun 2019 23:04:16 -0500 Subject: [PATCH] Corrected probe init'ing so they don't fight for the cubemap idx order Also correct deleting behavior so it updates indicies when a probe is removed Updated forward lighting to utilize the same math as deferred --- .../advanced/advancedLightManager.cpp | 5 +- .../lighting/basic/basicLightManager.cpp | 15 +- .../source/lighting/basic/basicLightManager.h | 5 +- Engine/source/lighting/lightManager.cpp | 113 ++++++++- Engine/source/lighting/lightManager.h | 3 +- .../lighting/shadowMap/lightShadowMap.cpp | 8 +- .../lighting/shadowMap/lightShadowMap.h | 4 +- .../source/renderInstance/renderProbeMgr.cpp | 20 +- .../shaderGen/HLSL/shaderFeatureHLSL.cpp | 177 ++++++++----- .../source/shaderGen/HLSL/shaderFeatureHLSL.h | 2 + Engine/source/shaderGen/shaderGenVars.cpp | 5 +- Engine/source/shaderGen/shaderGenVars.h | 5 +- .../gui/scripts/fonts/Arial 14 (ansi).uft | Bin 4740 -> 4889 bytes .../scripts/fonts/Arial Bold 18 (ansi).uft | Bin 3746 -> 4065 bytes .../game/core/rendering/shaders/lighting.hlsl | 199 +++++---------- .../advanced/reflectionProbeArrayP.hlsl | 4 +- .../data/StaticShapeTest/Shapes/materials.cs | 4 +- Templates/BaseGame/game/tools/settings.xml | 232 +++++++++--------- 18 files changed, 426 insertions(+), 375 deletions(-) diff --git a/Engine/source/lighting/advanced/advancedLightManager.cpp b/Engine/source/lighting/advanced/advancedLightManager.cpp index 7773b7b48..548a2d36c 100644 --- a/Engine/source/lighting/advanced/advancedLightManager.cpp +++ b/Engine/source/lighting/advanced/advancedLightManager.cpp @@ -388,10 +388,9 @@ void AdvancedLightManager::setLightInfo( ProcessedMaterial *pmat, lsc->mLightPositionSC, lsc->mLightDiffuseSC, lsc->mLightAmbientSC, - lsc->mLightInvRadiusSqSC, + lsc->mLightConfigDataSC, lsc->mLightSpotDirSC, - lsc->mLightSpotAngleSC, - lsc->mLightSpotFalloffSC, + lsc->mLightSpotParamsSC, shaderConsts ); // Static diff --git a/Engine/source/lighting/basic/basicLightManager.cpp b/Engine/source/lighting/basic/basicLightManager.cpp index 9b13f023c..c943deec3 100644 --- a/Engine/source/lighting/basic/basicLightManager.cpp +++ b/Engine/source/lighting/basic/basicLightManager.cpp @@ -304,10 +304,9 @@ BasicLightManager::LightingShaderConstants::LightingShaderConstants() mLightPosition( NULL ), mLightDiffuse( NULL ), mLightAmbient( NULL ), - mLightInvRadiusSq( NULL ), + mLightConfigDataSC( NULL ), mLightSpotDir( NULL ), - mLightSpotAngle( NULL ), - mLightSpotFalloff( NULL ) + mLightSpotParamsSC( NULL ) { } @@ -333,11 +332,10 @@ void BasicLightManager::LightingShaderConstants::init(GFXShader* shader) mLightPosition = shader->getShaderConstHandle( ShaderGenVars::lightPosition ); mLightDiffuse = shader->getShaderConstHandle( ShaderGenVars::lightDiffuse); - mLightInvRadiusSq = shader->getShaderConstHandle( ShaderGenVars::lightInvRadiusSq ); + mLightConfigDataSC = shader->getShaderConstHandle( ShaderGenVars::lightConfigData ); mLightAmbient = shader->getShaderConstHandle( ShaderGenVars::lightAmbient ); mLightSpotDir = shader->getShaderConstHandle( ShaderGenVars::lightSpotDir ); - mLightSpotAngle = shader->getShaderConstHandle( ShaderGenVars::lightSpotAngle ); - mLightSpotFalloff = shader->getShaderConstHandle( ShaderGenVars::lightSpotFalloff ); + mLightSpotParamsSC = shader->getShaderConstHandle( ShaderGenVars::lightSpotParams ); mInit = true; } @@ -399,9 +397,8 @@ void BasicLightManager::setLightInfo( ProcessedMaterial* pmat, mLastConstants->mLightPosition, mLastConstants->mLightDiffuse, mLastConstants->mLightAmbient, - mLastConstants->mLightInvRadiusSq, + mLastConstants->mLightConfigDataSC, mLastConstants->mLightSpotDir, - mLastConstants->mLightSpotAngle, - mLastConstants->mLightSpotFalloff, + mLastConstants->mLightSpotParamsSC, shaderConsts ); } diff --git a/Engine/source/lighting/basic/basicLightManager.h b/Engine/source/lighting/basic/basicLightManager.h index 6641ac39d..2712d6677 100644 --- a/Engine/source/lighting/basic/basicLightManager.h +++ b/Engine/source/lighting/basic/basicLightManager.h @@ -88,10 +88,9 @@ protected: GFXShaderConstHandle *mLightPosition; GFXShaderConstHandle *mLightDiffuse; GFXShaderConstHandle *mLightAmbient; - GFXShaderConstHandle *mLightInvRadiusSq; + GFXShaderConstHandle *mLightConfigDataSC; GFXShaderConstHandle *mLightSpotDir; - GFXShaderConstHandle *mLightSpotAngle; - GFXShaderConstHandle *mLightSpotFalloff; + GFXShaderConstHandle *mLightSpotParamsSC; LightingShaderConstants(); ~LightingShaderConstants(); diff --git a/Engine/source/lighting/lightManager.cpp b/Engine/source/lighting/lightManager.cpp index 74b4e5cb9..d3cefba42 100644 --- a/Engine/source/lighting/lightManager.cpp +++ b/Engine/source/lighting/lightManager.cpp @@ -306,10 +306,9 @@ void LightManager::_update4LightConsts( const SceneData &sgData, GFXShaderConstHandle *lightPositionSC, GFXShaderConstHandle *lightDiffuseSC, GFXShaderConstHandle *lightAmbientSC, - GFXShaderConstHandle *lightInvRadiusSqSC, + GFXShaderConstHandle *lightConfigDataSC, GFXShaderConstHandle *lightSpotDirSC, - GFXShaderConstHandle *lightSpotAngleSC, - GFXShaderConstHandle *lightSpotFalloffSC, + GFXShaderConstHandle *lightSpotParamsSC, GFXShaderConstBuffer *shaderConsts ) { PROFILE_SCOPE( LightManager_Update4LightConsts ); @@ -317,14 +316,110 @@ void LightManager::_update4LightConsts( const SceneData &sgData, // Skip over gathering lights if we don't have to! if ( lightPositionSC->isValid() || lightDiffuseSC->isValid() || - lightInvRadiusSqSC->isValid() || + lightConfigDataSC->isValid() || lightSpotDirSC->isValid() || - lightSpotAngleSC->isValid() || - lightSpotFalloffSC->isValid() ) + lightSpotParamsSC->isValid() ) { PROFILE_SCOPE( LightManager_Update4LightConsts_setLights ); - static AlignedArray lightPositions( 3, sizeof( Point4F ) ); + //new setup + const U32 MAX_FORWARD_LIGHTS = 4; + + static AlignedArray lightPositions(MAX_FORWARD_LIGHTS, sizeof(Point4F)); + static AlignedArray lightSpotDirs(MAX_FORWARD_LIGHTS, sizeof(Point4F)); + static AlignedArray lightColors(MAX_FORWARD_LIGHTS, sizeof(Point4F)); + static AlignedArray lightConfigData(MAX_FORWARD_LIGHTS, sizeof(Point4F)); //type, brightness, range, invSqrRange : rgba + static AlignedArray lightSpotParams(MAX_FORWARD_LIGHTS, sizeof(Point4F)); + + dMemset(lightPositions.getBuffer(), 0, lightPositions.getBufferSize()); + dMemset(lightSpotDirs.getBuffer(), 0, lightSpotDirs.getBufferSize()); + dMemset(lightColors.getBuffer(), 0, lightColors.getBufferSize()); + dMemset(lightConfigData.getBuffer(), 0, lightConfigData.getBufferSize()); + dMemset(lightSpotParams.getBuffer(), 0, lightSpotParams.getBufferSize()); + + //sun-only + F32 vectorLightBrightness; + static Point4F vectorLightDirection; + static Point4F vectorLightColor; + static Point4F vectorLightAmbientColor; + int hasVectorLight = 0; + + vectorLightBrightness = 0; + vectorLightDirection = Point4F::Zero; + vectorLightColor = Point4F::Zero; + vectorLightAmbientColor = Point4F::Zero; + + // Gather the data for the first 4 lights. + const LightInfo* light; + for (U32 i = 0; i < MAX_FORWARD_LIGHTS; i++) + { + light = sgData.lights[i]; + if (!light) + break; + + if (light->getType() == LightInfo::Vector) + { + if (hasVectorLight != 0) + continue; + + vectorLightBrightness = light->getBrightness(); + vectorLightDirection = light->getDirection(); + vectorLightColor = Point4F(light->getColor()); + vectorLightAmbientColor = Point4F(light->getAmbient()); + hasVectorLight = 1; + continue; + } + + // The light positions and spot directions are + // in SoA order to make optimal use of the GPU. + const Point3F& lightPos = light->getPosition(); + lightPositions[i].x = lightPos.x; + lightPositions[i].y = lightPos.y; + lightPositions[i].z = lightPos.z; + lightPositions[i].w = 0; + + const VectorF& lightDir = light->getDirection(); + lightSpotDirs[i].x = lightDir.x; + lightSpotDirs[i].y = lightDir.y; + lightSpotDirs[i].z = lightDir.z; + lightSpotDirs[i].w = 0; + + lightColors[i] = Point4F(light->getColor()); + + if (light->getType() == LightInfo::Point) + { + lightConfigData[i].x = 0; + } + else if (light->getType() == LightInfo::Spot) + { + lightConfigData[i].x = 1; + + const F32 outerCone = light->getOuterConeAngle(); + const F32 innerCone = getMin(light->getInnerConeAngle(), outerCone); + const F32 outerCos = mCos(mDegToRad(outerCone / 2.0f)); + const F32 innerCos = mCos(mDegToRad(innerCone / 2.0f)); + Point2F spotParams(outerCos, innerCos - outerCos); + + lightSpotParams[i].x = spotParams.x; + lightSpotParams[i].y = spotParams.y; + } + + lightConfigData[i].y = light->getBrightness(); + + F32 range = light->getRange().x; + lightConfigData[i].z = range; + lightConfigData[i].w = 1.0f / (range * range); + } + + shaderConsts->setSafe(lightPositionSC, lightPositions); + shaderConsts->setSafe(lightDiffuseSC, lightColors); + shaderConsts->setSafe(lightSpotDirSC, lightSpotDirs); + shaderConsts->setSafe(lightConfigDataSC, lightConfigData); + shaderConsts->setSafe(lightSpotParamsSC, lightSpotParams); + + //================================================================ + //old setup + /*static AlignedArray lightPositions( 3, sizeof( Point4F ) ); static AlignedArray lightSpotDirs( 3, sizeof( Point4F ) ); static AlignedArray lightColors( 4, sizeof( Point4F ) ); static Point4F lightInvRadiusSq; @@ -343,7 +438,7 @@ void LightManager::_update4LightConsts( const SceneData &sgData, // Gather the data for the first 4 lights. const LightInfo *light; - for ( U32 i=0; i < 4; i++ ) + for ( U32 i=0; i < MAX_FORWARD_LIGHTS; i++ ) { light = sgData.lights[i]; if ( !light ) @@ -382,7 +477,7 @@ void LightManager::_update4LightConsts( const SceneData &sgData, shaderConsts->setSafe( lightSpotDirSC, lightSpotDirs ); shaderConsts->setSafe( lightSpotAngleSC, lightSpotAngle ); - shaderConsts->setSafe( lightSpotFalloffSC, lightSpotFalloff ); + shaderConsts->setSafe( lightSpotFalloffSC, lightSpotFalloff );*/ } // Setup the ambient lighting from the first diff --git a/Engine/source/lighting/lightManager.h b/Engine/source/lighting/lightManager.h index fb54fe850..711a5ddd8 100644 --- a/Engine/source/lighting/lightManager.h +++ b/Engine/source/lighting/lightManager.h @@ -177,8 +177,7 @@ protected: GFXShaderConstHandle *lightAmbientSC, GFXShaderConstHandle *lightInvRadiusSqSC, GFXShaderConstHandle *lightSpotDirSC, - GFXShaderConstHandle *lightSpotAngleSC, - GFXShaderConstHandle *lightSpotFalloffSC, + GFXShaderConstHandle * lightSpotParamsSC, GFXShaderConstBuffer *shaderConsts ); /// A dummy default light used when no lights diff --git a/Engine/source/lighting/shadowMap/lightShadowMap.cpp b/Engine/source/lighting/shadowMap/lightShadowMap.cpp index 7e18abbb8..c9f9b7c9c 100644 --- a/Engine/source/lighting/shadowMap/lightShadowMap.cpp +++ b/Engine/source/lighting/shadowMap/lightShadowMap.cpp @@ -460,10 +460,8 @@ LightingShaderConstants::LightingShaderConstants() mLightPositionSC(NULL), mLightDiffuseSC(NULL), mLightAmbientSC(NULL), - mLightInvRadiusSqSC(NULL), + mLightConfigDataSC(NULL), mLightSpotDirSC(NULL), - mLightSpotAngleSC(NULL), - mLightSpotFalloffSC(NULL), mShadowMapSC(NULL), mDynamicShadowMapSC(NULL), mShadowMapSizeSC(NULL), @@ -524,10 +522,8 @@ void LightingShaderConstants::init(GFXShader* shader) mLightPositionSC = shader->getShaderConstHandle( ShaderGenVars::lightPosition ); mLightDiffuseSC = shader->getShaderConstHandle( ShaderGenVars::lightDiffuse ); mLightAmbientSC = shader->getShaderConstHandle( ShaderGenVars::lightAmbient ); - mLightInvRadiusSqSC = shader->getShaderConstHandle( ShaderGenVars::lightInvRadiusSq ); + mLightConfigDataSC = shader->getShaderConstHandle( ShaderGenVars::lightConfigData); mLightSpotDirSC = shader->getShaderConstHandle( ShaderGenVars::lightSpotDir ); - mLightSpotAngleSC = shader->getShaderConstHandle( ShaderGenVars::lightSpotAngle ); - mLightSpotFalloffSC = shader->getShaderConstHandle( ShaderGenVars::lightSpotFalloff ); mShadowMapSC = shader->getShaderConstHandle("$shadowMap"); mDynamicShadowMapSC = shader->getShaderConstHandle("$dynamicShadowMap"); diff --git a/Engine/source/lighting/shadowMap/lightShadowMap.h b/Engine/source/lighting/shadowMap/lightShadowMap.h index 72137c651..b699ba9df 100644 --- a/Engine/source/lighting/shadowMap/lightShadowMap.h +++ b/Engine/source/lighting/shadowMap/lightShadowMap.h @@ -87,10 +87,8 @@ struct LightingShaderConstants GFXShaderConstHandle *mLightPositionSC; GFXShaderConstHandle *mLightDiffuseSC; GFXShaderConstHandle *mLightAmbientSC; - GFXShaderConstHandle *mLightInvRadiusSqSC; + GFXShaderConstHandle *mLightConfigDataSC; GFXShaderConstHandle *mLightSpotDirSC; - GFXShaderConstHandle *mLightSpotAngleSC; - GFXShaderConstHandle *mLightSpotFalloffSC; GFXShaderConstHandle* mShadowMapSC; GFXShaderConstHandle* mDynamicShadowMapSC; diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index a383586ea..ee3fdc0b5 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -317,10 +317,10 @@ void RenderProbeMgr::addElement(RenderInst *inst) ProbeRenderInst* RenderProbeMgr::registerProbe() { - ProbeRenderInst newProbe; + mRegisteredProbes.increment(); + ProbeRenderInst* newProbe = &mRegisteredProbes.last(); - mRegisteredProbes.push_back(newProbe); - newProbe.mProbeIdx = mRegisteredProbes.size(); + newProbe->mProbeIdx = mRegisteredProbes.size() - 1; const U32 cubeIndex = _findNextEmptyCubeSlot(); if (cubeIndex == INVALID_CUBE_SLOT) @@ -349,18 +349,18 @@ ProbeRenderInst* RenderProbeMgr::registerProbe() mCubeSlotCount += PROBE_ARRAY_SLOT_BUFFER_SIZE; } - newProbe.mCubemapIndex = cubeIndex; + newProbe->mCubemapIndex = cubeIndex; //mark cubemap slot as taken mCubeMapSlots[cubeIndex] = true; mCubeMapCount++; #ifdef TORQUE_DEBUG - Con::warnf("RenderProbeMgr::registerProbe: Registered probe %u to cubeIndex %u", newProbe.mProbeIdx, cubeIndex); + Con::warnf("RenderProbeMgr::registerProbe: Registered probe %u to cubeIndex %u", newProbe->mProbeIdx, cubeIndex); #endif mProbesDirty = true; - return &mRegisteredProbes.last(); + return newProbe; } void RenderProbeMgr::unregisterProbe(U32 probeIdx) @@ -378,6 +378,12 @@ void RenderProbeMgr::unregisterProbe(U32 probeIdx) mRegisteredProbes.erase(probeIdx); + //recalculate all the probe's indicies just to be sure + for (U32 i = 0; i < mRegisteredProbes.size(); i++) + { + mRegisteredProbes[i].mProbeIdx == i; + } + //rebuild our probe data mProbesDirty = true; } @@ -750,7 +756,7 @@ void RenderProbeMgr::render( SceneRenderState *state ) mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray); mProbeArrayEffect->setShaderConst("$numProbes", (S32)mEffectiveProbeCount); - mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", mSkylightCubemapIdx); + mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)mSkylightCubemapIdx); mProbeArrayEffect->setShaderConst("$cubeMips", (float)mMipCount); diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp index f88f5d8b1..a191aaee7 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp @@ -818,6 +818,74 @@ Var* ShaderFeatureHLSL::addOutDetailTexCoord( Vector &compon return outTex; } +Var* ShaderFeatureHLSL::getSurface(Vector& componentList, MultiLine* meta) +{ + ShaderConnector* connectComp = dynamic_cast(componentList[C_CONNECTOR]); + + Var* diffuseColor = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); + + Var* matinfo = (Var*)LangElement::find("PBRConfig"); + if (!matinfo) + { + Var* metalness = (Var*)LangElement::find("metalness"); + if (!metalness) + { + metalness = new Var("metalness", "float"); + metalness->uniform = true; + metalness->constSortPos = cspPotentialPrimitive; + } + + Var* smoothness = (Var*)LangElement::find("smoothness"); + if (!smoothness) + { + smoothness = new Var("smoothness", "float"); + smoothness->uniform = true; + smoothness->constSortPos = cspPotentialPrimitive; + } + + matinfo = new Var("PBRConfig", "float4"); + LangElement* colorDecl = new DecOp(matinfo); + meta->addStatement(new GenOp(" @ = float4(0.0,1.0,@,@);\r\n", colorDecl, smoothness, metalness)); //reconstruct matinfo, no ao darkening + } + + Var* inTex = getInTexCoord("texCoord", "float2", componentList); + if (!inTex) + return nullptr; + + Var* wsNormal = (Var*)LangElement::find("wsNormal"); + if (!wsNormal) + { + wsNormal = connectComp->getElement(RT_TEXCOORD); + wsNormal->setName("wsNormal"); + wsNormal->setStructName("IN"); + wsNormal->setType("float3"); + + // If we loaded the normal its our responsibility + // to normalize it... the interpolators won't. + // + // Note we cast to half here to get partial precision + // optimized code which is an acceptable loss of + // precision for normals and performs much better + // on older Geforce cards. + // + meta->addStatement(new GenOp(" @ = normalize( half3( @ ) );\r\n", wsNormal, wsNormal)); + } + + Var* wsEyePos = (Var*)LangElement::find("eyePosWorld"); + Var* wsPosition = getInWsPosition(componentList); + Var* wsView = getWsView(wsPosition, meta); + + Var* surface = (Var*)LangElement::find("surface"); + + if (!surface) + { + surface = new Var("surface", "Surface"); + meta->addStatement(new GenOp(" @ = createForwardSurface(@,@,@,@,@,@,@);\r\n\n", new DecOp(surface), diffuseColor, wsNormal, matinfo, + inTex, wsPosition, wsEyePos, wsView)); + } + + return surface; +} //**************************************************************************** // Base Texture //**************************************************************************** @@ -2157,10 +2225,10 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, Var *wsView = getWsView( wsPosition, meta ); // Create temporaries to hold results of lighting. - Var *rtShading = new Var( "rtShading", "float4" ); - Var *specular = new Var( "specular", "float4" ); - meta->addStatement( new GenOp( " @; @;\r\n", - new DecOp( rtShading ), new DecOp( specular ) ) ); + //Var *rtShading = new Var( "rtShading", "float4" ); + //Var *specular = new Var( "specular", "float4" ); + //meta->addStatement( new GenOp( " @; @;\r\n", + // new DecOp( rtShading ), new DecOp( specular ) ) ); // Look for a light mask generated from a previous // feature (this is done for BL terrain lightmaps). @@ -2171,12 +2239,13 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, // Get all the light constants. Var *inLightPos = new Var( "inLightPos", "float4" ); inLightPos->uniform = true; - inLightPos->arraySize = 3; + inLightPos->arraySize = 4; inLightPos->constSortPos = cspPotentialPrimitive; - Var *inLightInvRadiusSq = new Var( "inLightInvRadiusSq", "float4" ); - inLightInvRadiusSq->uniform = true; - inLightInvRadiusSq->constSortPos = cspPotentialPrimitive; + Var * inLightConfigData = new Var( "inLightConfigData", "float4" ); + inLightConfigData->uniform = true; + inLightConfigData->arraySize = 4; + inLightConfigData->constSortPos = cspPotentialPrimitive; Var *inLightColor = new Var( "inLightColor", "float4" ); inLightColor->uniform = true; @@ -2185,19 +2254,23 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, Var *inLightSpotDir = new Var( "inLightSpotDir", "float4" ); inLightSpotDir->uniform = true; - inLightSpotDir->arraySize = 3; + inLightSpotDir->arraySize = 4; inLightSpotDir->constSortPos = cspPotentialPrimitive; - Var *inLightSpotAngle = new Var( "inLightSpotAngle", "float4" ); - inLightSpotAngle->uniform = true; - inLightSpotAngle->constSortPos = cspPotentialPrimitive; + Var * lightSpotParams = new Var( "lightSpotParams", "float4" ); + lightSpotParams->uniform = true; + lightSpotParams->arraySize = 4; + lightSpotParams->constSortPos = cspPotentialPrimitive; - Var *lightSpotFalloff = new Var( "inLightSpotFalloff", "float4" ); - lightSpotFalloff->uniform = true; - lightSpotFalloff->constSortPos = cspPotentialPrimitive; + Var* surface = getSurface(componentList, meta); + if (!surface) + { + Con::errorf("ShaderGen::RTLightingFeatHLSL() - failed to generate surface!"); + return; + } Var *smoothness = (Var*)LangElement::find("smoothness"); - if (!fd.features[MFT_SpecularMap]) + /*if (!fd.features[MFT_SpecularMap]) { if (!smoothness) { @@ -2205,10 +2278,10 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, smoothness->uniform = true; smoothness->constSortPos = cspPotentialPrimitive; } - } + }*/ Var *metalness = (Var*)LangElement::find("metalness"); - if (!fd.features[MFT_SpecularMap]) + /*if (!fd.features[MFT_SpecularMap]) { if (!metalness) { @@ -2216,7 +2289,7 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, metalness->uniform = true; metalness->constSortPos = cspPotentialPrimitive; } - } + }*/ Var *albedo = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); @@ -2225,16 +2298,24 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, ambient->constSortPos = cspPass; // Calculate the diffuse shading and specular powers. - meta->addStatement( new GenOp( " compute4Lights( @, @, @, @,\r\n" + /*meta->addStatement( new GenOp( " compute4Lights( @, @, @, @,\r\n" " @, @, @, @, @, @, @, @, @,\r\n" " @, @ );\r\n", wsView, wsPosition, wsNormal, lightMask, - inLightPos, inLightInvRadiusSq, inLightColor, inLightSpotDir, inLightSpotAngle, lightSpotFalloff, smoothness, metalness, albedo, + inLightPos, inLightConfigData, inLightColor, inLightSpotDir, inLightSpotAngle, lightSpotFalloff, smoothness, metalness, albedo, rtShading, specular ) ); // Apply the lighting to the diffuse color. LangElement *lighting = new GenOp( "float4( @.rgb + @.rgb, 1 )", rtShading, ambient ); - meta->addStatement( new GenOp( " @;\r\n", assignColor( lighting, Material::Mul ) ) ); + meta->addStatement( new GenOp( " @;\r\n", assignColor( lighting, Material::Mul ) ) );*/ + + Var* lighting = new Var("lighting", "float4"); + meta->addStatement(new GenOp(" @ = compute4Lights( @, @, @, @,\r\n" + " @, @, @);\r\n", + new DecOp(lighting), surface, lightMask, inLightPos, inLightConfigData, inLightColor, inLightSpotDir, lightSpotParams)); + + meta->addStatement(new GenOp(" @;\r\n", assignColor(lighting, Material::Add))); + output = meta; } @@ -3051,6 +3132,14 @@ void ReflectionProbeFeatHLSL::processPix(Vector &componentList irradianceCubemapARTex->uniform = true; irradianceCubemapARTex->texture = true; irradianceCubemapARTex->constNum = irradianceCubemapAR->constNum; + + Var* surface = getSurface(componentList, meta); + + if (!surface) + { + Con::errorf("ShaderGen::ReflectionProbeFeatHLSL() - failed to generate surface!"); + return; + } Var *inTex = getInTexCoord("texCoord", "float2", componentList); if (!inTex) @@ -3059,55 +3148,15 @@ void ReflectionProbeFeatHLSL::processPix(Vector &componentList Var *diffuseColor = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); Var *matinfo = (Var*)LangElement::find("PBRConfig"); - if (!matinfo) - { - Var* metalness = (Var*)LangElement::find("metalness"); - if (!metalness) - { - metalness = new Var("metalness", "float"); - metalness->uniform = true; - metalness->constSortPos = cspPotentialPrimitive; - } - - Var* smoothness = (Var*)LangElement::find("smoothness"); - if (!smoothness) - { - smoothness = new Var("smoothness", "float"); - smoothness->uniform = true; - smoothness->constSortPos = cspPotentialPrimitive; - } - - matinfo = new Var("PBRConfig", "float4"); - LangElement* colorDecl = new DecOp(matinfo); - meta->addStatement(new GenOp(" @ = float4(0.0,1.0,@,@);\r\n", colorDecl, smoothness, metalness)); //reconstruct matinfo, no ao darkening - } + Var* metalness = (Var*)LangElement::find("metalness"); + Var* smoothness = (Var*)LangElement::find("smoothness"); Var* wsEyePos = (Var*)LangElement::find("eyePosWorld"); Var* worldToTangent = getInWorldToTangent(componentList); Var* wsNormal = (Var*)LangElement::find("wsNormal"); - if (!wsNormal) - { - wsNormal = connectComp->getElement(RT_TEXCOORD); - wsNormal->setName("wsNormal"); - wsNormal->setStructName("IN"); - wsNormal->setType("float3"); - - // If we loaded the normal its our responsibility - // to normalize it... the interpolators won't. - // - // Note we cast to half here to get partial precision - // optimized code which is an acceptable loss of - // precision for normals and performs much better - // on older Geforce cards. - // - meta->addStatement(new GenOp(" @ = normalize( half3( @ ) );\r\n", wsNormal, wsNormal)); - } //Reflection vec - Var* surface = new Var("surface", "Surface"); - meta->addStatement(new GenOp(" @ = createForwardSurface(@,@,@,@,@,@,@);\r\n\n", new DecOp(surface), diffuseColor, wsNormal, matinfo, - inTex, wsPosition, wsEyePos, wsView)); String computeForwardProbes = String::String(" @.rgb = computeForwardProbes(@,@,@,@,@,@,@,@,@,\r\n\t\t"); computeForwardProbes += String::String("@,TORQUE_SAMPLER2D_MAKEARG(@),\r\n\t\t"); computeForwardProbes += String::String("TORQUE_SAMPLERCUBEARRAY_MAKEARG(@),TORQUE_SAMPLERCUBEARRAY_MAKEARG(@)).rgb; \r\n"); diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h index 1aac22fc6..d720d6915 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h @@ -135,6 +135,8 @@ public: bool useInstancing, MultiLine *meta ); + Var* getSurface(Vector& componentList, MultiLine* meta); + // ShaderFeature Var* getVertTexCoord( const String &name ); LangElement* setupTexSpaceMat( Vector &componentList, Var **texSpaceMat ); diff --git a/Engine/source/shaderGen/shaderGenVars.cpp b/Engine/source/shaderGen/shaderGenVars.cpp index 9b08be0f9..df42fe371 100644 --- a/Engine/source/shaderGen/shaderGenVars.cpp +++ b/Engine/source/shaderGen/shaderGenVars.cpp @@ -61,10 +61,9 @@ const String ShaderGenVars::oneOverTargetSize("$oneOverTargetSize"); const String ShaderGenVars::lightPosition("$inLightPos"); const String ShaderGenVars::lightDiffuse("$inLightColor"); const String ShaderGenVars::lightAmbient("$ambient"); -const String ShaderGenVars::lightInvRadiusSq("$inLightInvRadiusSq"); +const String ShaderGenVars::lightConfigData("$inLightConfigData"); const String ShaderGenVars::lightSpotDir("$inLightSpotDir"); -const String ShaderGenVars::lightSpotAngle("$inLightSpotAngle"); -const String ShaderGenVars::lightSpotFalloff("$inLightSpotFalloff"); +const String ShaderGenVars::lightSpotParams("$lightSpotParams"); const String ShaderGenVars::specularColor("$specularColor"); const String ShaderGenVars::smoothness("$smoothness"); const String ShaderGenVars::metalness("$metalness"); diff --git a/Engine/source/shaderGen/shaderGenVars.h b/Engine/source/shaderGen/shaderGenVars.h index a4d1df39b..1856181b7 100644 --- a/Engine/source/shaderGen/shaderGenVars.h +++ b/Engine/source/shaderGen/shaderGenVars.h @@ -74,10 +74,9 @@ struct ShaderGenVars const static String lightPosition; const static String lightDiffuse; const static String lightAmbient; - const static String lightInvRadiusSq; + const static String lightConfigData; const static String lightSpotDir; - const static String lightSpotAngle; - const static String lightSpotFalloff; + const static String lightSpotParams; const static String specularColor; const static String smoothness; const static String metalness; diff --git a/Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft b/Templates/BaseGame/game/core/gui/scripts/fonts/Arial 14 (ansi).uft index acbb4bed2bb4953916f4db5059a890a1da98aabe..02bf5fbe66cae9398be1844c4630562f04f8a6d8 100644 GIT binary patch delta 2166 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 diff --git a/Templates/BaseGame/game/core/gui/scripts/fonts/Arial Bold 18 (ansi).uft b/Templates/BaseGame/game/core/gui/scripts/fonts/Arial Bold 18 (ansi).uft index 72aba583d9612097786f4150256b4915d8465c7c..3e3ce6aa5cf5a2a06d1cd599fb38b0c7018eb0e6 100644 GIT binary patch delta 2444 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 - - 72 70 68 255 - 236 234 232 255 - 59 58 57 255 - 72 70 68 255 - 255 255 255 255 - 178 175 172 255 - 32 31 30 255 - 50 49 48 255 - 17 16 15 255 - 59 58 57 255 - 43 43 43 255 - 240 240 240 255 - 100 98 96 255 - 37 36 35 255 - 96 94 92 255 - 234 232 230 255 - 50 49 48 255 - 50 49 48 255 - - - 1024 768 - tools/gui - - 0 - 0 - 0 - - - ../../../Documentation/Official Documentation.html - http://www.garagegames.com/products/torque-3d/documentation/user - ../../../Documentation/Torque 3D - Script Manual.chm - - - 0 - - - 0 - 1 - 1 - 2 - 1 - 1 - 1 - 8 - - - 1 - 1 - - - Categorized - - 15 0.8 @@ -63,95 +9,149 @@ 0.8 1 + 0 + 255 255 255 20 10 10 10 500 - 255 255 255 20 - 0 - 0 0 + 0 + + 72 70 68 255 + 178 175 172 255 + 72 70 68 255 + 240 240 240 255 + 50 49 48 255 + 32 31 30 255 + 96 94 92 255 + 17 16 15 255 + 59 58 57 255 + 43 43 43 255 + 37 36 35 255 + 50 49 48 255 + 236 234 232 255 + 50 49 48 255 + 100 98 96 255 + 59 58 57 255 + 234 232 230 255 + 255 255 255 255 + - 50 - 6 - 0 - screenCenter 40 WorldEditorInspectorPlugin + 0 AssetWork_Debug.exe 1 - - 1 - 1 - 0 - 0 - 100 - 0 - 2 - - - 0 255 0 255 - 255 255 0 255 - 255 255 255 255 - 255 0 0 255 - 100 100 100 255 - 0 0 255 255 - 255 255 0 255 + 6 + 50 + screenCenter + + 0 + 1 + 8 + 20 + 255 - 0 - 51 51 51 100 - 102 102 102 100 1 + 51 51 51 100 255 255 255 100 + 102 102 102 100 + 0 + + + tools/worldEditor/images/SelectHandle + tools/worldEditor/images/DefaultHandle + tools/worldEditor/images/LockedHandle + + + 1 + 1 + 1 + 1 + 1 + + + 0 + 2 + 1 + 1 + 0 + 0 + 100 + + + 100 100 100 255 + 0 0 255 255 + Lime + 255 255 0 255 + 255 255 255 255 + 255 255 0 255 + 255 0 0 255 + + + 48 48 48 255 + 180 180 180 255 + 50 50 50 255 + 215 215 215 255 + 255 255 255 255 http://www.garagegames.com/products/torque-3d/documentation/user - ../../../Documentation/Official Documentation.html - http://www.garagegames.com/products/torque-3d/forums ../../../Documentation/Torque 3D - Script Manual.chm + http://www.garagegames.com/products/torque-3d/forums + ../../../Documentation/Official Documentation.html - - 0 - 255 - 20 - 8 - 1 + + + 1024 768 + tools/gui + + 1 + 1 - - 1 - 1 - 1 - 1 - 1 + + 0 + 0 + 0 - - 255 255 255 255 - 48 48 48 255 - 50 50 50 255 - 180 180 180 255 - 215 215 215 255 + + 1 + 8 + 1 + 1 + 1 + 2 + 1 + 0 - - tools/worldEditor/images/DefaultHandle - tools/worldEditor/images/SelectHandle - tools/worldEditor/images/LockedHandle + + ../../../Documentation/Official Documentation.html + ../../../Documentation/Torque 3D - Script Manual.chm + http://www.garagegames.com/products/torque-3d/documentation/user + + + Categorized + + + 0 + + + + data/FPSGameplay/levels + + + 25 + + + 5 + AIPlayer - - data/FPSGameplay/levels - - - 5 - - - 25 - - - Grid_512_Orange