diff --git a/Engine/source/lighting/advanced/advancedLightManager.cpp b/Engine/source/lighting/advanced/advancedLightManager.cpp index 548a2d36c..23f9ecceb 100644 --- a/Engine/source/lighting/advanced/advancedLightManager.cpp +++ b/Engine/source/lighting/advanced/advancedLightManager.cpp @@ -391,6 +391,10 @@ void AdvancedLightManager::setLightInfo( ProcessedMaterial *pmat, lsc->mLightConfigDataSC, lsc->mLightSpotDirSC, lsc->mLightSpotParamsSC, + lsc->mHasVectorLightSC, + lsc->mVectorLightDirectionSC, + lsc->mVectorLightColorSC, + lsc->mVectorLightBrightnessSC, shaderConsts ); // Static diff --git a/Engine/source/lighting/basic/basicLightManager.cpp b/Engine/source/lighting/basic/basicLightManager.cpp index c943deec3..1da8d6493 100644 --- a/Engine/source/lighting/basic/basicLightManager.cpp +++ b/Engine/source/lighting/basic/basicLightManager.cpp @@ -306,7 +306,11 @@ BasicLightManager::LightingShaderConstants::LightingShaderConstants() mLightAmbient( NULL ), mLightConfigDataSC( NULL ), mLightSpotDir( NULL ), - mLightSpotParamsSC( NULL ) + mLightSpotParamsSC( NULL ), + mHasVectorLightSC(NULL), + mVectorLightDirectionSC(NULL), + mVectorLightColorSC(NULL), + mVectorLightBrightnessSC(NULL) { } @@ -337,6 +341,11 @@ void BasicLightManager::LightingShaderConstants::init(GFXShader* shader) mLightSpotDir = shader->getShaderConstHandle( ShaderGenVars::lightSpotDir ); mLightSpotParamsSC = shader->getShaderConstHandle( ShaderGenVars::lightSpotParams ); + mHasVectorLightSC = shader->getShaderConstHandle(ShaderGenVars::hasVectorLight); + mVectorLightDirectionSC = shader->getShaderConstHandle(ShaderGenVars::vectorLightDirection); + mVectorLightColorSC = shader->getShaderConstHandle(ShaderGenVars::vectorLightColor); + mVectorLightBrightnessSC = shader->getShaderConstHandle(ShaderGenVars::vectorLightBrightness); + mInit = true; } @@ -400,5 +409,9 @@ void BasicLightManager::setLightInfo( ProcessedMaterial* pmat, mLastConstants->mLightConfigDataSC, mLastConstants->mLightSpotDir, mLastConstants->mLightSpotParamsSC, + mLastConstants->mHasVectorLightSC, + mLastConstants->mVectorLightDirectionSC, + mLastConstants->mVectorLightColorSC, + mLastConstants->mVectorLightBrightnessSC, shaderConsts ); } diff --git a/Engine/source/lighting/basic/basicLightManager.h b/Engine/source/lighting/basic/basicLightManager.h index 2712d6677..1141f78f9 100644 --- a/Engine/source/lighting/basic/basicLightManager.h +++ b/Engine/source/lighting/basic/basicLightManager.h @@ -92,6 +92,11 @@ protected: GFXShaderConstHandle *mLightSpotDir; GFXShaderConstHandle *mLightSpotParamsSC; + GFXShaderConstHandle* mHasVectorLightSC; + GFXShaderConstHandle* mVectorLightDirectionSC; + GFXShaderConstHandle* mVectorLightColorSC; + GFXShaderConstHandle* mVectorLightBrightnessSC; + LightingShaderConstants(); ~LightingShaderConstants(); diff --git a/Engine/source/lighting/lightManager.cpp b/Engine/source/lighting/lightManager.cpp index d3cefba42..58f8016f6 100644 --- a/Engine/source/lighting/lightManager.cpp +++ b/Engine/source/lighting/lightManager.cpp @@ -309,6 +309,10 @@ void LightManager::_update4LightConsts( const SceneData &sgData, GFXShaderConstHandle *lightConfigDataSC, GFXShaderConstHandle *lightSpotDirSC, GFXShaderConstHandle *lightSpotParamsSC, + GFXShaderConstHandle* hasVectorLightSC, + GFXShaderConstHandle* vectorLightDirectionSC, + GFXShaderConstHandle* vectorLightColorSC, + GFXShaderConstHandle* vectorLightBrightnessSC, GFXShaderConstBuffer *shaderConsts ) { PROFILE_SCOPE( LightManager_Update4LightConsts ); @@ -417,6 +421,11 @@ void LightManager::_update4LightConsts( const SceneData &sgData, shaderConsts->setSafe(lightConfigDataSC, lightConfigData); shaderConsts->setSafe(lightSpotParamsSC, lightSpotParams); + shaderConsts->setSafe(hasVectorLightSC, (int)hasVectorLight); + shaderConsts->setSafe(vectorLightDirectionSC, vectorLightDirection); + shaderConsts->setSafe(vectorLightColorSC, vectorLightColor); + shaderConsts->setSafe(vectorLightBrightnessSC, vectorLightBrightness); + //================================================================ //old setup /*static AlignedArray lightPositions( 3, sizeof( Point4F ) ); diff --git a/Engine/source/lighting/lightManager.h b/Engine/source/lighting/lightManager.h index 711a5ddd8..71d3019e5 100644 --- a/Engine/source/lighting/lightManager.h +++ b/Engine/source/lighting/lightManager.h @@ -178,6 +178,10 @@ protected: GFXShaderConstHandle *lightInvRadiusSqSC, GFXShaderConstHandle *lightSpotDirSC, GFXShaderConstHandle * lightSpotParamsSC, + GFXShaderConstHandle* hasVectorLightSC, + GFXShaderConstHandle* vectorLightDirectionSC, + GFXShaderConstHandle* vectorLightColorSC, + GFXShaderConstHandle* vectorLightBrightnessSC, 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 c9f9b7c9c..c59707519 100644 --- a/Engine/source/lighting/shadowMap/lightShadowMap.cpp +++ b/Engine/source/lighting/shadowMap/lightShadowMap.cpp @@ -462,6 +462,10 @@ LightingShaderConstants::LightingShaderConstants() mLightAmbientSC(NULL), mLightConfigDataSC(NULL), mLightSpotDirSC(NULL), + mHasVectorLightSC(NULL), + mVectorLightDirectionSC(NULL), + mVectorLightColorSC(NULL), + mVectorLightBrightnessSC(NULL), mShadowMapSC(NULL), mDynamicShadowMapSC(NULL), mShadowMapSizeSC(NULL), @@ -525,6 +529,11 @@ void LightingShaderConstants::init(GFXShader* shader) mLightConfigDataSC = shader->getShaderConstHandle( ShaderGenVars::lightConfigData); mLightSpotDirSC = shader->getShaderConstHandle( ShaderGenVars::lightSpotDir ); + mHasVectorLightSC = shader->getShaderConstHandle(ShaderGenVars::hasVectorLight); + mVectorLightDirectionSC = shader->getShaderConstHandle(ShaderGenVars::vectorLightDirection); + mVectorLightColorSC = shader->getShaderConstHandle(ShaderGenVars::vectorLightColor); + mVectorLightBrightnessSC = shader->getShaderConstHandle(ShaderGenVars::vectorLightBrightness); + mShadowMapSC = shader->getShaderConstHandle("$shadowMap"); mDynamicShadowMapSC = shader->getShaderConstHandle("$dynamicShadowMap"); mShadowMapSizeSC = shader->getShaderConstHandle("$shadowMapSize"); diff --git a/Engine/source/lighting/shadowMap/lightShadowMap.h b/Engine/source/lighting/shadowMap/lightShadowMap.h index b699ba9df..d038c2027 100644 --- a/Engine/source/lighting/shadowMap/lightShadowMap.h +++ b/Engine/source/lighting/shadowMap/lightShadowMap.h @@ -90,6 +90,11 @@ struct LightingShaderConstants GFXShaderConstHandle *mLightConfigDataSC; GFXShaderConstHandle *mLightSpotDirSC; + GFXShaderConstHandle* mHasVectorLightSC; + GFXShaderConstHandle* mVectorLightDirectionSC; + GFXShaderConstHandle* mVectorLightColorSC; + GFXShaderConstHandle* mVectorLightBrightnessSC; + GFXShaderConstHandle* mShadowMapSC; GFXShaderConstHandle* mDynamicShadowMapSC; GFXShaderConstHandle* mShadowMapSizeSC; diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp index 9056a4afc..664b93dd8 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp @@ -2235,6 +2235,22 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, lightSpotParams->arraySize = 4; lightSpotParams->constSortPos = cspPotentialPrimitive; + Var* hasVectorLight = new Var("hasVectorLight", "int"); + hasVectorLight->uniform = true; + hasVectorLight->constSortPos = cspPotentialPrimitive; + + Var* vectorLightDirection = new Var("vectorLightDirection", "float4"); + vectorLightDirection->uniform = true; + vectorLightDirection->constSortPos = cspPotentialPrimitive; + + Var* vectorLightColor = new Var("vectorLightColor", "float4"); + vectorLightColor->uniform = true; + vectorLightColor->constSortPos = cspPotentialPrimitive; + + Var* vectorLightBrightness = new Var("vectorLightBrightness", "float"); + vectorLightBrightness->uniform = true; + vectorLightBrightness->constSortPos = cspPotentialPrimitive; + Var* surface = getSurface(componentList, meta, fd); if (!surface) { @@ -2253,8 +2269,9 @@ void RTLightingFeatHLSL::processPix( Vector &componentList, 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)); + " @, @, @, @, @, @, @);\r\n", + new DecOp(lighting), surface, lightMask, inLightPos, inLightConfigData, inLightColor, inLightSpotDir, lightSpotParams, + hasVectorLight, vectorLightDirection, vectorLightColor, vectorLightBrightness)); meta->addStatement(new GenOp(" @.rgb += @.rgb;\r\n", curColor, lighting)); diff --git a/Engine/source/shaderGen/shaderGenVars.cpp b/Engine/source/shaderGen/shaderGenVars.cpp index fe39aca9c..6d5c77350 100644 --- a/Engine/source/shaderGen/shaderGenVars.cpp +++ b/Engine/source/shaderGen/shaderGenVars.cpp @@ -64,6 +64,12 @@ const String ShaderGenVars::lightAmbient("$ambient"); const String ShaderGenVars::lightConfigData("$inLightConfigData"); const String ShaderGenVars::lightSpotDir("$inLightSpotDir"); const String ShaderGenVars::lightSpotParams("$lightSpotParams"); + +const String ShaderGenVars::hasVectorLight("$hasVectorLight"); +const String ShaderGenVars::vectorLightDirection("$vectorLightDirection"); +const String ShaderGenVars::vectorLightColor("$vectorLightColor"); +const String ShaderGenVars::vectorLightBrightness("$vectorLightBrightness"); + 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 1856181b7..850a56bb1 100644 --- a/Engine/source/shaderGen/shaderGenVars.h +++ b/Engine/source/shaderGen/shaderGenVars.h @@ -77,6 +77,11 @@ struct ShaderGenVars const static String lightConfigData; const static String lightSpotDir; const static String lightSpotParams; + const static String hasVectorLight; + const static String vectorLightDirection; + const static String vectorLightColor; + const static String vectorLightBrightness; + const static String specularColor; const static String smoothness; const static String metalness; diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl index 91304c95d..48b192d30 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl @@ -240,7 +240,11 @@ float4 compute4Lights( Surface surface, float4 inLightConfigData[4], float4 inLightColor[4], float4 inLightSpotDir[4], - float4 lightSpotParams[4] ) + float4 lightSpotParams[4], + int hasVectorLight, + float4 vectorLightDirection, + float4 vectorLightingColor, + float vectorLightBrightness ) { float3 finalLighting = 0.0.xxx; @@ -280,6 +284,17 @@ float4 compute4Lights( Surface surface, } finalLighting += lighting; } + + //Vector light + [branch] + if(hasVectorLight) + { + SurfaceToLight surfaceToVecLight = createSurfaceToLight(surface, -vectorLightDirection.xyz); + + float3 vecLighting = getDirectionalLight(surface, surfaceToVecLight, vectorLightingColor.rgb, vectorLightBrightness, 1); + finalLighting += vecLighting; + } + finalLighting *= shadowMask.rgb; return float4(finalLighting,1);