소스 검색

Merge pull request #923 from Azaezel/alpha402/puppies

adds wetness
Brian Roberts 2 년 전
부모
커밋
120691abee
31개의 변경된 파일352개의 추가작업 그리고 100개의 파일을 삭제
  1. 0 1
      Engine/source/T3D/fx/precipitation.cpp
  2. 11 1
      Engine/source/T3D/levelInfo.cpp
  3. 2 0
      Engine/source/T3D/levelInfo.h
  4. 6 1
      Engine/source/T3D/lighting/reflectionProbe.cpp
  5. 2 2
      Engine/source/T3D/lighting/reflectionProbe.h
  6. 1 0
      Engine/source/T3D/lighting/skylight.cpp
  7. 6 1
      Engine/source/gfx/gfxTextureManager.cpp
  8. 3 1
      Engine/source/gfx/gfxTextureManager.h
  9. 2 1
      Engine/source/materials/materialManager.cpp
  10. 5 1
      Engine/source/materials/materialManager.h
  11. 3 2
      Engine/source/materials/processedCustomMaterial.cpp
  12. 2 0
      Engine/source/materials/processedShaderMaterial.cpp
  13. 1 0
      Engine/source/materials/processedShaderMaterial.h
  14. 2 2
      Engine/source/materials/shaderData.h
  15. 5 1
      Engine/source/postFx/postEffect.cpp
  16. 2 1
      Engine/source/postFx/postEffect.h
  17. 33 15
      Engine/source/renderInstance/renderProbeMgr.cpp
  18. 7 6
      Engine/source/renderInstance/renderProbeMgr.h
  19. 34 5
      Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp
  20. 36 4
      Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp
  21. 3 0
      Engine/source/shaderGen/shaderGenVars.cpp
  22. 3 1
      Engine/source/shaderGen/shaderGenVars.h
  23. 4 2
      Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Shaders.tscript
  24. 0 1
      Templates/BaseGame/game/core/postFX/scripts/ReflectionProbes/reflectionProbeArrayPostFX.tscript
  25. 2 1
      Templates/BaseGame/game/core/rendering/Core_Rendering.tscript
  26. BIN
      Templates/BaseGame/game/core/rendering/images/wetMap.png
  27. 8 0
      Templates/BaseGame/game/core/rendering/images/wetMap_image.asset.taml
  28. 53 14
      Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl
  29. 53 13
      Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl
  30. 33 12
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl
  31. 30 11
      Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl

+ 0 - 1
Engine/source/T3D/fx/precipitation.cpp

@@ -786,7 +786,6 @@ void Precipitation::unpackUpdate(NetConnection* con, BitStream* stream)
       mUseWind = stream->readFlag();
       mUseWind = stream->readFlag();
       mFollowCam = stream->readFlag();
       mFollowCam = stream->readFlag();
       mAnimateSplashes = stream->readFlag();
       mAnimateSplashes = stream->readFlag();
-
       mDropHitMask = dropHitMask | 
       mDropHitMask = dropHitMask | 
          ( mDropHitPlayers ? PlayerObjectType : 0 ) | 
          ( mDropHitPlayers ? PlayerObjectType : 0 ) | 
          ( mDropHitVehicles ? VehicleObjectType : 0 );
          ( mDropHitVehicles ? VehicleObjectType : 0 );

+ 11 - 1
Engine/source/T3D/levelInfo.cpp

@@ -37,6 +37,8 @@
 
 
 #include "torqueConfig.h"
 #include "torqueConfig.h"
 #include "T3D/accumulationVolume.h"
 #include "T3D/accumulationVolume.h"
+#include "console/typeValidators.h"
+#include "materials/materialManager.h"
 
 
 IMPLEMENT_CO_NETOBJECT_V1(LevelInfo);
 IMPLEMENT_CO_NETOBJECT_V1(LevelInfo);
 
 
@@ -88,7 +90,8 @@ LevelInfo::LevelInfo()
       mAmbientLightBlendPhase( 1.f ),
       mAmbientLightBlendPhase( 1.f ),
       mSoundAmbience( NULL ),
       mSoundAmbience( NULL ),
       mSoundDistanceModel( SFXDistanceModelLinear ),
       mSoundDistanceModel( SFXDistanceModelLinear ),
-      mSoundscape( NULL )
+      mSoundscape( NULL ),
+      mDampness(0.0)
 {
 {
    mFogData.density = 0.0f;
    mFogData.density = 0.0f;
    mFogData.densityOffset = 0.0f;
    mFogData.densityOffset = 0.0f;
@@ -120,6 +123,8 @@ LevelInfo::~LevelInfo()
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
+FRangeValidator ValiDampnessRange(0.0f, 1.0f);
+
 void LevelInfo::initPersistFields()
 void LevelInfo::initPersistFields()
 {
 {
    addGroup( "Visibility" );
    addGroup( "Visibility" );
@@ -130,6 +135,8 @@ void LevelInfo::initPersistFields()
       addField( "decalBias", TypeF32, Offset( mDecalBias, LevelInfo ),
       addField( "decalBias", TypeF32, Offset( mDecalBias, LevelInfo ),
          "NearPlane bias used when rendering Decal and DecalRoad. This should be tuned to the visibleDistance in your level." );
          "NearPlane bias used when rendering Decal and DecalRoad. This should be tuned to the visibleDistance in your level." );
 
 
+      addFieldV("dampness", TypeF32, Offset(mDampness, LevelInfo), &ValiDampnessRange,
+         "@brief dampness influence");
    endGroup( "Visibility" );
    endGroup( "Visibility" );
 
 
    addGroup( "Fog" );
    addGroup( "Fog" );
@@ -199,6 +206,7 @@ U32 LevelInfo::packUpdate(NetConnection *conn, U32 mask, BitStream *stream)
    stream->write( mNearClip );
    stream->write( mNearClip );
    stream->write( mVisibleDistance );
    stream->write( mVisibleDistance );
    stream->write( mDecalBias );
    stream->write( mDecalBias );
+   stream->write(mDampness);
 
 
    stream->write( mFogData.density );
    stream->write( mFogData.density );
    stream->write( mFogData.densityOffset );
    stream->write( mFogData.densityOffset );
@@ -229,6 +237,8 @@ void LevelInfo::unpackUpdate(NetConnection *conn, BitStream *stream)
    stream->read( &mNearClip );
    stream->read( &mNearClip );
    stream->read( &mVisibleDistance );
    stream->read( &mVisibleDistance );
    stream->read( &mDecalBias );
    stream->read( &mDecalBias );
+   stream->read(&mDampness);
+   MATMGR->setDampness(mDampness);
 
 
    stream->read( &mFogData.density );
    stream->read( &mFogData.density );
    stream->read( &mFogData.densityOffset );
    stream->read( &mFogData.densityOffset );

+ 2 - 0
Engine/source/T3D/levelInfo.h

@@ -92,6 +92,8 @@ class LevelInfo : public NetObject
       
       
       ///
       ///
       SFXSoundscape* mSoundscape;
       SFXSoundscape* mSoundscape;
+
+      F32 mDampness; ///<applies wetness
          
          
       /// @}
       /// @}
       
       

+ 6 - 1
Engine/source/T3D/lighting/reflectionProbe.cpp

@@ -132,6 +132,7 @@ ReflectionProbe::ReflectionProbe()
    mEditPosOffset = false;
    mEditPosOffset = false;
 
 
    mCaptureMask = REFLECTION_PROBE_CAPTURE_TYPEMASK;
    mCaptureMask = REFLECTION_PROBE_CAPTURE_TYPEMASK;
+   mCanDamp = false;
 }
 }
 
 
 ReflectionProbe::~ReflectionProbe()
 ReflectionProbe::~ReflectionProbe()
@@ -150,6 +151,7 @@ ReflectionProbe::~ReflectionProbe()
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 void ReflectionProbe::initPersistFields()
 void ReflectionProbe::initPersistFields()
 {
 {
+   addField("canDamp", TypeBool, Offset(mCanDamp, ReflectionProbe),"wetness allowed");
    addGroup("Rendering");
    addGroup("Rendering");
       addProtectedField("enabled", TypeBool, Offset(mEnabled, ReflectionProbe),
       addProtectedField("enabled", TypeBool, Offset(mEnabled, ReflectionProbe),
          &_setEnabled, &defaultProtectedGetFn, "Is the probe enabled or not");
          &_setEnabled, &defaultProtectedGetFn, "Is the probe enabled or not");
@@ -435,6 +437,7 @@ U32 ReflectionProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *stream
    {
    {
       stream->writeFlag(mEnabled);
       stream->writeFlag(mEnabled);
    }
    }
+   stream->writeFlag(mCanDamp);
 
 
    return retMask;
    return retMask;
 }
 }
@@ -491,6 +494,7 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
 
 
       mDirty = true;
       mDirty = true;
    }
    }
+   mCanDamp = stream->readFlag();
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
@@ -555,7 +559,8 @@ void ReflectionProbe::updateProbeParams()
 
 
    mProbeInfo.mProbeRefOffset = mProbeRefOffset;
    mProbeInfo.mProbeRefOffset = mProbeRefOffset;
    mProbeInfo.mProbeRefScale = mProbeRefScale;
    mProbeInfo.mProbeRefScale = mProbeRefScale;
-
+   mProbeInfo.mCanDamp = mCanDamp;
+   
    mProbeInfo.mDirty = true;
    mProbeInfo.mDirty = true;
 
 
    if (mCubemapDirty)
    if (mCubemapDirty)

+ 2 - 2
Engine/source/T3D/lighting/reflectionProbe.h

@@ -109,7 +109,7 @@ public:
       };
       };
 
 
       ProbeShapeType mProbeShapeType;
       ProbeShapeType mProbeShapeType;
-
+      bool mCanDamp;
    public:
    public:
 
 
       ProbeInfo() : mScore(0) {}
       ProbeInfo() : mScore(0) {}
@@ -255,7 +255,7 @@ protected:
 
 
    bool mResourcesCreated;
    bool mResourcesCreated;
    U32 mCaptureMask;
    U32 mCaptureMask;
-
+   bool mCanDamp;
 public:
 public:
    ReflectionProbe();
    ReflectionProbe();
    virtual ~ReflectionProbe();
    virtual ~ReflectionProbe();

+ 1 - 0
Engine/source/T3D/lighting/skylight.cpp

@@ -78,6 +78,7 @@ ConsoleDocClass(Skylight,
 Skylight::Skylight() : ReflectionProbe()
 Skylight::Skylight() : ReflectionProbe()
 {
 {
    mCaptureMask = SKYLIGHT_CAPTURE_TYPEMASK;
    mCaptureMask = SKYLIGHT_CAPTURE_TYPEMASK;
+   mCanDamp = true;
 }
 }
 
 
 Skylight::~Skylight()
 Skylight::~Skylight()

+ 6 - 1
Engine/source/gfx/gfxTextureManager.cpp

@@ -47,6 +47,7 @@ String GFXTextureManager::smMissingTexturePath(Con::getVariable("$Core::MissingT
 String GFXTextureManager::smUnavailableTexturePath(Con::getVariable("$Core::UnAvailableTexturePath"));
 String GFXTextureManager::smUnavailableTexturePath(Con::getVariable("$Core::UnAvailableTexturePath"));
 String GFXTextureManager::smWarningTexturePath(Con::getVariable("$Core::WarningTexturePath"));
 String GFXTextureManager::smWarningTexturePath(Con::getVariable("$Core::WarningTexturePath"));
 String GFXTextureManager::smBRDFTexturePath(Con::getVariable("$Core::BRDFTexture"));
 String GFXTextureManager::smBRDFTexturePath(Con::getVariable("$Core::BRDFTexture"));
+String GFXTextureManager::smWetnessTexturePath(Con::getVariable("$Core::WetnessTexture"));
 
 
 GFXTextureManager::EventSignal GFXTextureManager::smEventSignal;
 GFXTextureManager::EventSignal GFXTextureManager::smEventSignal;
 
 
@@ -74,7 +75,11 @@ void GFXTextureManager::init()
       "@ingroup GFX\n" );
       "@ingroup GFX\n" );
 
 
    Con::addVariable("$Core::BRDFTexture", TypeRealString, &smBRDFTexturePath,
    Con::addVariable("$Core::BRDFTexture", TypeRealString, &smBRDFTexturePath,
-      "The file path of the texture used as the default irradiance cubemap for PBR.\n"
+      "The file path of the texture used as the default BRDF lut for PBR.\n"
+      "@ingroup GFX\n");
+
+   Con::addVariable("$Core::WetnessTexture", TypeRealString, &smWetnessTexturePath,
+      "The file path of the texture used as the default wetness influence map for PBR.\n"
       "@ingroup GFX\n");
       "@ingroup GFX\n");
 }
 }
 
 

+ 3 - 1
Engine/source/gfx/gfxTextureManager.h

@@ -76,6 +76,7 @@ public:
    static const String& getWarningTexturePath() { return smWarningTexturePath; }
    static const String& getWarningTexturePath() { return smWarningTexturePath; }
 
 
    static const String& getBRDFTexturePath() { return smBRDFTexturePath; }
    static const String& getBRDFTexturePath() { return smBRDFTexturePath; }
+   static const String& getWetnessTexturePath() { return smWetnessTexturePath; }
 
 
    /// Update width and height based on available resources.
    /// Update width and height based on available resources.
    ///
    ///
@@ -215,7 +216,8 @@ protected:
    static String smWarningTexturePath;
    static String smWarningTexturePath;
 
 
    static String smBRDFTexturePath;
    static String smBRDFTexturePath;
-
+   static String smWetnessTexturePath;
+   
    GFXTextureObject *mListHead;
    GFXTextureObject *mListHead;
    GFXTextureObject *mListTail;
    GFXTextureObject *mListTail;
 
 

+ 2 - 1
Engine/source/materials/materialManager.cpp

@@ -58,7 +58,8 @@ MaterialManager::MaterialManager()
 
 
    mDt = 0.0f; 
    mDt = 0.0f; 
    mAccumTime = 0.0f; 
    mAccumTime = 0.0f; 
-   mLastTime = 0; 
+   mLastTime = 0;
+   mDampness = 0.0f;
    mWarningInst = NULL;
    mWarningInst = NULL;
    
    
    GFXDevice::getDeviceEventSignal().notify( this, &MaterialManager::_handleGFXEvent );
    GFXDevice::getDeviceEventSignal().notify( this, &MaterialManager::_handleGFXEvent );

+ 5 - 1
Engine/source/materials/materialManager.h

@@ -105,7 +105,10 @@ public:
    F32 getTotalTime() const { return mAccumTime; }
    F32 getTotalTime() const { return mAccumTime; }
    F32 getDeltaTime() const { return mDt; }
    F32 getDeltaTime() const { return mDt; }
    U32 getLastUpdateTime() const { return mLastTime; }
    U32 getLastUpdateTime() const { return mLastTime; }
-
+   
+   F32 getDampness() const { return mDampness; }
+   F32 getDampnessClamped() const { return mClampF(mDampness, 0.0, 1.0); }
+   void setDampness(F32 dampness) { mDampness = dampness; }
    /// Signal used to notify systems that 
    /// Signal used to notify systems that 
    /// procedural shaders have been flushed.
    /// procedural shaders have been flushed.
    typedef Signal<void()> FlushSignal;
    typedef Signal<void()> FlushSignal;
@@ -163,6 +166,7 @@ protected:
    F32 mDt;
    F32 mDt;
    F32 mAccumTime;
    F32 mAccumTime;
    U32 mLastTime;
    U32 mLastTime;
+   F32 mDampness;
 
 
    BaseMatInstance* mWarningInst;
    BaseMatInstance* mWarningInst;
 
 

+ 3 - 2
Engine/source/materials/processedCustomMaterial.cpp

@@ -319,8 +319,9 @@ bool ProcessedCustomMaterial::setupPass( SceneRenderState *state, const SceneDat
    if (pm)
    if (pm)
       pm->setProbeInfo(this, NULL, sgData, state, pass, shaderConsts);
       pm->setProbeInfo(this, NULL, sgData, state, pass, shaderConsts);
 
 
-   shaderConsts->setSafe(rpd->shaderHandles.mAccumTimeSC, MATMGR->getTotalTime());   
-
+   shaderConsts->setSafe(rpd->shaderHandles.mAccumTimeSC, MATMGR->getTotalTime());
+   shaderConsts->setSafe(rpd->shaderHandles.mDampnessSC, MATMGR->getDampnessClamped());
+   
    return true;
    return true;
 }
 }
 
 

+ 2 - 0
Engine/source/materials/processedShaderMaterial.cpp

@@ -94,6 +94,7 @@ void ShaderConstHandles::init( GFXShader *shader, CustomMaterial* mat /*=NULL*/)
    mEyeMatSC = shader->getShaderConstHandle(ShaderGenVars::eyeMat);
    mEyeMatSC = shader->getShaderConstHandle(ShaderGenVars::eyeMat);
    mOneOverFarplane = shader->getShaderConstHandle(ShaderGenVars::oneOverFarplane);
    mOneOverFarplane = shader->getShaderConstHandle(ShaderGenVars::oneOverFarplane);
    mAccumTimeSC = shader->getShaderConstHandle(ShaderGenVars::accumTime);
    mAccumTimeSC = shader->getShaderConstHandle(ShaderGenVars::accumTime);
+   mDampnessSC = shader->getShaderConstHandle(ShaderGenVars::dampness);
    mMinnaertConstantSC = shader->getShaderConstHandle(ShaderGenVars::minnaertConstant);
    mMinnaertConstantSC = shader->getShaderConstHandle(ShaderGenVars::minnaertConstant);
    mSubSurfaceParamsSC = shader->getShaderConstHandle(ShaderGenVars::subSurfaceParams);
    mSubSurfaceParamsSC = shader->getShaderConstHandle(ShaderGenVars::subSurfaceParams);
    mDiffuseAtlasParamsSC = shader->getShaderConstHandle(ShaderGenVars::diffuseAtlasParams);
    mDiffuseAtlasParamsSC = shader->getShaderConstHandle(ShaderGenVars::diffuseAtlasParams);
@@ -1097,6 +1098,7 @@ void ProcessedShaderMaterial::_setShaderConstants(SceneRenderState * state, cons
 
 
    shaderConsts->setSafe( handles->mAccumTimeSC, MATMGR->getTotalTime() );
    shaderConsts->setSafe( handles->mAccumTimeSC, MATMGR->getTotalTime() );
 
 
+   shaderConsts->setSafe(handles->mDampnessSC, MATMGR->getDampnessClamped());
    // If the shader constants have not been lost then
    // If the shader constants have not been lost then
    // they contain the content from a previous render pass.
    // they contain the content from a previous render pass.
    //
    //

+ 1 - 0
Engine/source/materials/processedShaderMaterial.h

@@ -81,6 +81,7 @@ public:
    GFXShaderConstHandle* mEyeMatSC;
    GFXShaderConstHandle* mEyeMatSC;
    GFXShaderConstHandle* mOneOverFarplane;
    GFXShaderConstHandle* mOneOverFarplane;
    GFXShaderConstHandle* mAccumTimeSC;
    GFXShaderConstHandle* mAccumTimeSC;
+   GFXShaderConstHandle* mDampnessSC;
    GFXShaderConstHandle* mMinnaertConstantSC;
    GFXShaderConstHandle* mMinnaertConstantSC;
    GFXShaderConstHandle* mSubSurfaceParamsSC;
    GFXShaderConstHandle* mSubSurfaceParamsSC;
    GFXShaderConstHandle* mDiffuseAtlasParamsSC;
    GFXShaderConstHandle* mDiffuseAtlasParamsSC;

+ 2 - 2
Engine/source/materials/shaderData.h

@@ -93,7 +93,7 @@ protected:
 
 
    enum
    enum
    {
    {
-      NumTextures = 8
+      NumTextures = 16
    };
    };
 
 
    String mSamplerNames[NumTextures]; 
    String mSamplerNames[NumTextures]; 
@@ -134,4 +134,4 @@ public:
    DECLARE_CONOBJECT(ShaderData);
    DECLARE_CONOBJECT(ShaderData);
 };
 };
 
 
-#endif // _SHADERTDATA_H_
+#endif // _SHADERTDATA_H_

+ 5 - 1
Engine/source/postFx/postEffect.cpp

@@ -492,6 +492,7 @@ PostEffect::PostEffect()
       mLightDirectionSC( NULL ),
       mLightDirectionSC( NULL ),
       mCameraForwardSC( NULL ),
       mCameraForwardSC( NULL ),
       mAccumTimeSC( NULL ),
       mAccumTimeSC( NULL ),
+      mDampnessSC(NULL),   
       mDeltaTimeSC( NULL ),
       mDeltaTimeSC( NULL ),
       mInvCameraMatSC( NULL ),
       mInvCameraMatSC( NULL ),
       mMatCameraToWorldSC( NULL),
       mMatCameraToWorldSC( NULL),
@@ -785,6 +786,8 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
       mCameraForwardSC = mShader->getShaderConstHandle( "$camForward" );
       mCameraForwardSC = mShader->getShaderConstHandle( "$camForward" );
 
 
       mAccumTimeSC = mShader->getShaderConstHandle( "$accumTime" );
       mAccumTimeSC = mShader->getShaderConstHandle( "$accumTime" );
+      mDampnessSC = mShader->getShaderConstHandle("$dampness");
+      
       mDeltaTimeSC = mShader->getShaderConstHandle( "$deltaTime" );
       mDeltaTimeSC = mShader->getShaderConstHandle( "$deltaTime" );
 
 
       mInvCameraMatSC = mShader->getShaderConstHandle( "$invCameraMat" );
       mInvCameraMatSC = mShader->getShaderConstHandle( "$invCameraMat" );
@@ -965,7 +968,8 @@ void PostEffect::_setupConstants( const SceneRenderState *state )
    }
    }
    mShaderConsts->setSafe( mAccumTimeSC, MATMGR->getTotalTime() );
    mShaderConsts->setSafe( mAccumTimeSC, MATMGR->getTotalTime() );
    mShaderConsts->setSafe( mDeltaTimeSC, MATMGR->getDeltaTime() );
    mShaderConsts->setSafe( mDeltaTimeSC, MATMGR->getDeltaTime() );
-
+   mShaderConsts->setSafe(mDampnessSC, MATMGR->getDampnessClamped());
+   
    // Now set all the constants that are dependent on the scene state.
    // Now set all the constants that are dependent on the scene state.
    if ( state )
    if ( state )
    {
    {

+ 2 - 1
Engine/source/postFx/postEffect.h

@@ -85,7 +85,7 @@ public:
 
 
    enum
    enum
    {
    {
-      NumTextures = 8,
+      NumTextures = 16,
    };
    };
 
 
 protected:
 protected:
@@ -156,6 +156,7 @@ protected:
    GFXShaderConstHandle *mLightDirectionSC;
    GFXShaderConstHandle *mLightDirectionSC;
    GFXShaderConstHandle *mCameraForwardSC;
    GFXShaderConstHandle *mCameraForwardSC;
    GFXShaderConstHandle *mAccumTimeSC;
    GFXShaderConstHandle *mAccumTimeSC;
+   GFXShaderConstHandle* mDampnessSC;
    GFXShaderConstHandle *mDeltaTimeSC;
    GFXShaderConstHandle *mDeltaTimeSC;
    GFXShaderConstHandle *mInvCameraMatSC;
    GFXShaderConstHandle *mInvCameraMatSC;
    GFXShaderConstHandle *mMatCameraToWorldSC;
    GFXShaderConstHandle *mMatCameraToWorldSC;

+ 33 - 15
Engine/source/renderInstance/renderProbeMgr.cpp

@@ -98,7 +98,9 @@ ProbeShaderConstants::ProbeShaderConstants()
    mProbeIrradianceCubemapArraySC(NULL),
    mProbeIrradianceCubemapArraySC(NULL),
    mProbeCountSC(NULL),
    mProbeCountSC(NULL),
    mBRDFTextureMap(NULL),
    mBRDFTextureMap(NULL),
+   mWetnessTextureMap(NULL),   
    mSkylightCubemapIdxSC(NULL),
    mSkylightCubemapIdxSC(NULL),
+   mSkylightDampSC(NULL),
    mWorldToObjArraySC(NULL),
    mWorldToObjArraySC(NULL),
    mMaxProbeDrawDistanceSC(NULL)
    mMaxProbeDrawDistanceSC(NULL)
 {
 {
@@ -135,8 +137,10 @@ void ProbeShaderConstants::init(GFXShader* shader)
    mProbeCountSC = shader->getShaderConstHandle(ShaderGenVars::probeCount);
    mProbeCountSC = shader->getShaderConstHandle(ShaderGenVars::probeCount);
 
 
    mBRDFTextureMap = shader->getShaderConstHandle(ShaderGenVars::BRDFTextureMap);
    mBRDFTextureMap = shader->getShaderConstHandle(ShaderGenVars::BRDFTextureMap);
+   mWetnessTextureMap = shader->getShaderConstHandle(ShaderGenVars::WetnessTextureMap);
 
 
-   mSkylightCubemapIdxSC = shader->getShaderConstHandle(ShaderGenVars::skylightCubemapIdx);
+   mSkylightCubemapIdxSC = shader->getShaderConstHandle(ShaderGenVars::skylightCubemapIdx);   
+   mSkylightDampSC = shader->getShaderConstHandle(ShaderGenVars::skylightDamp);
 
 
    mMaxProbeDrawDistanceSC = shader->getShaderConstHandle(ShaderGenVars::maxProbeDrawDistance);
    mMaxProbeDrawDistanceSC = shader->getShaderConstHandle(ShaderGenVars::maxProbeDrawDistance);
 
 
@@ -145,10 +149,10 @@ void ProbeShaderConstants::init(GFXShader* shader)
 
 
 bool ProbeShaderConstants::isValid()
 bool ProbeShaderConstants::isValid()
 {
 {
-   if (mProbePositionArraySC->isValid() ||
-      mProbeConfigDataArraySC->isValid() ||
-      mRefScaleArraySC->isValid() ||
-      mProbeSpecularCubemapArraySC->isValid() ||
+   if (mProbePositionArraySC->isValid() &&
+      mProbeConfigDataArraySC->isValid() &&
+      mRefScaleArraySC->isValid() &&
+      mProbeSpecularCubemapArraySC->isValid() &&
       mProbeIrradianceCubemapArraySC->isValid())
       mProbeIrradianceCubemapArraySC->isValid())
       return true;
       return true;
 
 
@@ -169,6 +173,7 @@ RenderProbeMgr::RenderProbeMgr()
    mLastConstants(nullptr),
    mLastConstants(nullptr),
    mHasSkylight(false),
    mHasSkylight(false),
    mSkylightCubemapIdx(-1),
    mSkylightCubemapIdx(-1),
+   mSkylightDamp(true),
    mCubeMapCount(0),
    mCubeMapCount(0),
    mUseHDRCaptures(true)
    mUseHDRCaptures(true)
 {
 {
@@ -197,6 +202,7 @@ RenderProbeMgr::RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 proce
    mEffectiveProbeCount = 0;
    mEffectiveProbeCount = 0;
    mHasSkylight = false;
    mHasSkylight = false;
    mSkylightCubemapIdx = -1;
    mSkylightCubemapIdx = -1;
+   mSkylightDamp = true;
    mLastConstants = nullptr;
    mLastConstants = nullptr;
    mMipCount = 0;
    mMipCount = 0;
    mUseHDRCaptures = true;
    mUseHDRCaptures = true;
@@ -236,6 +242,12 @@ bool RenderProbeMgr::onAdd()
       return false;
       return false;
    } 
    } 
 
 
+   String wetnessTexturePath = GFXTextureManager::getWetnessTexturePath();
+   if (!mWetnessTexture.set(wetnessTexturePath, &GFXTexturePersistentProfile, "WetnessTexture"))
+   {
+      Con::errorf("RenderProbeMgr::onAdd: Failed to load Wetness Texture");
+      return false;
+   }
    return true;
    return true;
 }
 }
 
 
@@ -306,6 +318,7 @@ void RenderProbeMgr::getBestProbes(const Point3F& objPosition, ProbeDataSet* pro
       else
       else
       {
       {
          probeDataSet->skyLightIdx = curEntry.mCubemapIndex;
          probeDataSet->skyLightIdx = curEntry.mCubemapIndex;
+         probeDataSet->skyLightDamp = curEntry.mProbeInfo->mCanDamp;
          mHasSkylight = true;
          mHasSkylight = true;
       }
       }
    }
    }
@@ -330,13 +343,13 @@ void RenderProbeMgr::getBestProbes(const Point3F& objPosition, ProbeDataSet* pro
       probeDataSet->probeWorldToObjArray[i] = p2A;
       probeDataSet->probeWorldToObjArray[i] = p2A;
       p2A.inverse();
       p2A.inverse();
       probeDataSet->refScaleArray[i] = curEntry.mProbeInfo->mProbeRefScale / (p2A.getScale()*2);
       probeDataSet->refScaleArray[i] = curEntry.mProbeInfo->mProbeRefScale / (p2A.getScale()*2);
+      probeDataSet->refScaleArray[i].w = curEntry.mProbeInfo->mCanDamp? 1.0 : 0.0;
 
 
       Point3F probePos = curEntry.mProbeInfo->mObject->getPosition();
       Point3F probePos = curEntry.mProbeInfo->mObject->getPosition();
       Point3F refPos = probePos + curEntry.mProbeInfo->mProbeRefOffset * probeDataSet->refScaleArray[i].asPoint3F();
       Point3F refPos = probePos + curEntry.mProbeInfo->mProbeRefOffset * probeDataSet->refScaleArray[i].asPoint3F();
 
 
       probeDataSet->probePositionArray[i] = Point4F(probePos.x, probePos.y, probePos.z, 0);
       probeDataSet->probePositionArray[i] = Point4F(probePos.x, probePos.y, probePos.z, 0);
       probeDataSet->probeRefPositionArray[i] = Point4F(refPos.x, refPos.y, refPos.z, 0);
       probeDataSet->probeRefPositionArray[i] = Point4F(refPos.x, refPos.y, refPos.z, 0);
-
    }
    }
 }
 }
 
 
@@ -422,7 +435,7 @@ PostEffect* RenderProbeMgr::getProbeArrayEffect()
 
 
       mProbeArrayEffect->setShaderConst("$numProbes", (S32)0);
       mProbeArrayEffect->setShaderConst("$numProbes", (S32)0);
       mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)-1);
       mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)-1);
-
+      mProbeArrayEffect->setShaderConst(ShaderGenVars::skylightDamp, (S32)true);
       mProbeArrayEffect->setShaderConst("$cubeMips", (float)0);
       mProbeArrayEffect->setShaderConst("$cubeMips", (float)0);
       mProbeArrayEffect->setShaderConst("$maxProbeDrawDistance", smMaxProbeDrawDistance);
       mProbeArrayEffect->setShaderConst("$maxProbeDrawDistance", smMaxProbeDrawDistance);
 
 
@@ -784,10 +797,14 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData& sgData,
          shaderConsts->setSafe(probeShaderConsts->mProbeConfigDataArraySC, probeConfigAlignedArray);
          shaderConsts->setSafe(probeShaderConsts->mProbeConfigDataArraySC, probeConfigAlignedArray);
       }
       }
 
 
-      if (probeShaderConsts->mBRDFTextureMap->getSamplerRegister() != -1 && mBRDFTexture.isValid())
+      if (mBRDFTexture.isValid(), probeShaderConsts->mBRDFTextureMap->getSamplerRegister() != -1)
          GFX->setTexture(probeShaderConsts->mBRDFTextureMap->getSamplerRegister(), mBRDFTexture);
          GFX->setTexture(probeShaderConsts->mBRDFTextureMap->getSamplerRegister(), mBRDFTexture);
 
 
+      if (mWetnessTexture.isValid() && probeShaderConsts->mWetnessTextureMap->getSamplerRegister() != -1)
+         GFX->setTexture(probeShaderConsts->mWetnessTextureMap->getSamplerRegister(), mWetnessTexture);
+
       shaderConsts->setSafe(probeShaderConsts->mSkylightCubemapIdxSC, (float)probeSet.skyLightIdx);
       shaderConsts->setSafe(probeShaderConsts->mSkylightCubemapIdxSC, (float)probeSet.skyLightIdx);
+      shaderConsts->setSafe(probeShaderConsts->mSkylightDampSC, (int)probeSet.skyLightDamp);
 
 
       if (probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister() != -1)
       if (probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister() != -1)
          GFX->setCubeArrayTexture(probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister(), mPrefilterArray);
          GFX->setCubeArrayTexture(probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister(), mPrefilterArray);
@@ -859,6 +876,11 @@ void RenderProbeMgr::render( SceneRenderState *state )
 
 
    String probeCapturing = Con::getVariable("$Probes::Capturing", "0");
    String probeCapturing = Con::getVariable("$Probes::Capturing", "0");
    mProbeArrayEffect->setShaderMacro("CAPTURING", probeCapturing);
    mProbeArrayEffect->setShaderMacro("CAPTURING", probeCapturing);
+   
+   mProbeArrayEffect->setTexture(3, mBRDFTexture);
+   mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);
+   mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray);
+   mProbeArrayEffect->setTexture(6, mWetnessTexture);
    //ssao mask
    //ssao mask
    if (AdvancedLightBinManager::smUseSSAOMask)
    if (AdvancedLightBinManager::smUseSSAOMask)
    {
    {
@@ -868,20 +890,16 @@ void RenderProbeMgr::render( SceneRenderState *state )
       if (pTexObj)
       if (pTexObj)
       {
       {
          mProbeArrayEffect->setShaderMacro("USE_SSAO_MASK");
          mProbeArrayEffect->setShaderMacro("USE_SSAO_MASK");
-         mProbeArrayEffect->setTexture(6, pTexObj);
+         mProbeArrayEffect->setTexture(7, pTexObj);
       }
       }
    }
    }
    else
    else
    {
    {
-      mProbeArrayEffect->setTexture(6, GFXTexHandle(NULL)); 
+      mProbeArrayEffect->setTexture(7, GFXTexHandle(NULL));
    }
    }
-   
-   mProbeArrayEffect->setTexture(3, mBRDFTexture);
-   mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);
-   mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray);
-
    mProbeArrayEffect->setShaderConst("$numProbes", (S32)mProbeData.effectiveProbeCount);
    mProbeArrayEffect->setShaderConst("$numProbes", (S32)mProbeData.effectiveProbeCount);
    mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)mProbeData.skyLightIdx);
    mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)mProbeData.skyLightIdx);
+   mProbeArrayEffect->setShaderConst(ShaderGenVars::skylightDamp, mProbeData.skyLightDamp);
 
 
    mProbeArrayEffect->setShaderConst("$cubeMips", (float)mPrefilterArray->getMipMapLevels());
    mProbeArrayEffect->setShaderConst("$cubeMips", (float)mPrefilterArray->getMipMapLevels());
 
 

+ 7 - 6
Engine/source/renderInstance/renderProbeMgr.h

@@ -98,8 +98,9 @@ struct ProbeShaderConstants
    GFXShaderConstHandle *mProbeCountSC;
    GFXShaderConstHandle *mProbeCountSC;
 
 
    GFXShaderConstHandle *mBRDFTextureMap;
    GFXShaderConstHandle *mBRDFTextureMap;
-
+   GFXShaderConstHandle* mWetnessTextureMap;   
    GFXShaderConstHandle *mSkylightCubemapIdxSC;
    GFXShaderConstHandle *mSkylightCubemapIdxSC;
+   GFXShaderConstHandle* mSkylightDampSC;
 
 
    GFXShaderConstHandle* mMaxProbeDrawDistanceSC;
    GFXShaderConstHandle* mMaxProbeDrawDistanceSC;
 
 
@@ -127,9 +128,8 @@ struct ProbeDataSet
    Vector<Point4F> probeConfigArray;
    Vector<Point4F> probeConfigArray;
 
 
    Vector<MatrixF> probeWorldToObjArray;
    Vector<MatrixF> probeWorldToObjArray;
-
    S32 skyLightIdx;
    S32 skyLightIdx;
-
+   bool skyLightDamp;
    U32 effectiveProbeCount;
    U32 effectiveProbeCount;
    U32 maxProbeCount;
    U32 maxProbeCount;
 
 
@@ -141,10 +141,10 @@ struct ProbeDataSet
       probeConfigArray.setSize(0);
       probeConfigArray.setSize(0);
 
 
       probeWorldToObjArray.setSize(0);
       probeWorldToObjArray.setSize(0);
-
       skyLightIdx = -1;
       skyLightIdx = -1;
       effectiveProbeCount = 0;
       effectiveProbeCount = 0;
       maxProbeCount = 0;
       maxProbeCount = 0;
+      skyLightDamp = true;
    }
    }
 
 
    ProbeDataSet(U32 _maxProbeCount)
    ProbeDataSet(U32 _maxProbeCount)
@@ -212,7 +212,7 @@ private:
    /// If we have a skylight, what's the array pair index for it?
    /// If we have a skylight, what's the array pair index for it?
    /// </summary>
    /// </summary>
    S32             mSkylightCubemapIdx;
    S32             mSkylightCubemapIdx;
-
+   bool            mSkylightDamp;
    /// <summary>
    /// <summary>
    /// The 'effective' probe count. This tracks the number of probes that are actually going to be rendered
    /// The 'effective' probe count. This tracks the number of probes that are actually going to be rendered
    /// </summary>
    /// </summary>
@@ -279,7 +279,8 @@ private:
    /// The BRDF texture used in PBR math calculations
    /// The BRDF texture used in PBR math calculations
    /// </summary>
    /// </summary>
    GFXTexHandle mBRDFTexture;
    GFXTexHandle mBRDFTexture;
-
+   GFXTexHandle mWetnessTexture;
+   
    /// <summary>
    /// <summary>
    /// Processed best probe selection list of the current frame when rendering in deferred mode.
    /// Processed best probe selection list of the current frame when rendering in deferred mode.
    /// </summary>
    /// </summary>

+ 34 - 5
Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp

@@ -2982,6 +2982,10 @@ void ReflectionProbeFeatGLSL::processPix(Vector<ShaderComponent*>& componentList
    skylightCubemapIdx->uniform = true;
    skylightCubemapIdx->uniform = true;
    skylightCubemapIdx->constSortPos = cspPotentialPrimitive;
    skylightCubemapIdx->constSortPos = cspPotentialPrimitive;
 
 
+   Var* SkylightDamp = new Var("SkylightDamp", "int");
+   SkylightDamp->uniform = true;
+   SkylightDamp->constSortPos = cspPotentialPrimitive;
+
    Var * inProbePosArray = new Var("inProbePosArray", "vec4");
    Var * inProbePosArray = new Var("inProbePosArray", "vec4");
    inProbePosArray->arraySize = MAX_FORWARD_PROBES;
    inProbePosArray->arraySize = MAX_FORWARD_PROBES;
    inProbePosArray->uniform = true;
    inProbePosArray->uniform = true;
@@ -3025,6 +3029,14 @@ void ReflectionProbeFeatGLSL::processPix(Vector<ShaderComponent*>& componentList
    irradianceCubemapAR->sampler = true;
    irradianceCubemapAR->sampler = true;
    irradianceCubemapAR->constNum = Var::getTexUnitNum();
    irradianceCubemapAR->constNum = Var::getTexUnitNum();
 
 
+   // create texture var
+   Var* WetnessTexture = new Var;
+   WetnessTexture->setType("sampler2D");
+   WetnessTexture->setName("WetnessTexture");
+   WetnessTexture->uniform = true;
+   WetnessTexture->sampler = true;
+   WetnessTexture->constNum = Var::getTexUnitNum();     // used as texture unit num here
+
    Var* surface = getSurface(componentList, meta, fd);
    Var* surface = getSurface(componentList, meta, fd);
 
 
    if (!surface)
    if (!surface)
@@ -3051,14 +3063,29 @@ void ReflectionProbeFeatGLSL::processPix(Vector<ShaderComponent*>& componentList
       eyePos->uniform = true;
       eyePos->uniform = true;
       eyePos->constSortPos = cspPass;
       eyePos->constSortPos = cspPass;
    }
    }
-         
+
+   Var* accumTime = (Var*)LangElement::find("accumTime");
+   if (!accumTime)
+   {
+      accumTime = new Var("accumTime", "float");
+      accumTime->uniform = true;
+      accumTime->constSortPos = cspPass;
+   }
+   Var* dampness = (Var*)LangElement::find("dampness");
+   if (!dampness)
+   {
+      dampness = new Var("dampness", "float");
+      dampness->uniform = true;
+      dampness->constSortPos = cspPass;
+   }
+   
    //Reflection vec
    //Reflection vec
    String computeForwardProbes = String("   @ = computeForwardProbes(@,@,@,@,@,@,@,@,@,\r\n\t\t");
    String computeForwardProbes = String("   @ = computeForwardProbes(@,@,@,@,@,@,@,@,@,\r\n\t\t");
-   computeForwardProbes += String("@,@,\r\n\t\t");
+   computeForwardProbes += String("@,@,@,@,@,@,\r\n\t\t");
    computeForwardProbes += String("@,@).rgb; \r\n");
    computeForwardProbes += String("@,@).rgb; \r\n");
 
 
    meta->addStatement(new GenOp(computeForwardProbes.c_str(), new DecOp(ibl), surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray, eyePos,
    meta->addStatement(new GenOp(computeForwardProbes.c_str(), new DecOp(ibl), surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray, eyePos,
-      skylightCubemapIdx, BRDFTexture,
+      skylightCubemapIdx, SkylightDamp, BRDFTexture, WetnessTexture, accumTime, dampness,
       irradianceCubemapAR, specularCubemapAR));
       irradianceCubemapAR, specularCubemapAR));
 
 
    Var *ambient = (Var *)LangElement::find("ambient");
    Var *ambient = (Var *)LangElement::find("ambient");
@@ -3078,8 +3105,8 @@ ShaderFeature::Resources ReflectionProbeFeatGLSL::getResources(const MaterialFea
 {
 {
    Resources res;
    Resources res;
 
 
-   res.numTex = 3;
-   res.numTexReg = 3;
+   res.numTex = 4;
+   res.numTexReg = 4;
 
 
    return res;
    return res;
 }
 }
@@ -3098,5 +3125,7 @@ void ReflectionProbeFeatGLSL::setTexData(Material::StageData& stageDat,
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mSamplerNames[texIndex] = "IrradianceCubemapAR";
       passData.mSamplerNames[texIndex] = "IrradianceCubemapAR";
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
+      passData.mSamplerNames[texIndex] = "WetnessTexture";
+      passData.mTexType[texIndex++] = Material::Standard;
    }
    }
 }
 }

+ 36 - 4
Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp

@@ -3060,6 +3060,10 @@ void ReflectionProbeFeatHLSL::processPix(Vector<ShaderComponent*> &componentList
    skylightCubemapIdx->uniform = true;
    skylightCubemapIdx->uniform = true;
    skylightCubemapIdx->constSortPos = cspPotentialPrimitive;
    skylightCubemapIdx->constSortPos = cspPotentialPrimitive;
 
 
+   Var* SkylightDamp = new Var("SkylightDamp", "int");
+   SkylightDamp->uniform = true;
+   SkylightDamp->constSortPos = cspPotentialPrimitive;
+
    Var *inProbePosArray = new Var("inProbePosArray", "float4");
    Var *inProbePosArray = new Var("inProbePosArray", "float4");
    inProbePosArray->arraySize = MAX_FORWARD_PROBES;
    inProbePosArray->arraySize = MAX_FORWARD_PROBES;
    inProbePosArray->uniform = true;
    inProbePosArray->uniform = true;
@@ -3115,6 +3119,16 @@ void ReflectionProbeFeatHLSL::processPix(Vector<ShaderComponent*> &componentList
    irradianceCubemapARTex->texture = true;
    irradianceCubemapARTex->texture = true;
    irradianceCubemapARTex->constNum = irradianceCubemapAR->constNum;
    irradianceCubemapARTex->constNum = irradianceCubemapAR->constNum;
 
 
+   Var* WetnessTexture = new Var("WetnessTexture", "SamplerState");
+   WetnessTexture->uniform = true;
+   WetnessTexture->sampler = true;
+   WetnessTexture->constNum = Var::getTexUnitNum();     // used as texture unit num here
+
+   Var* WetnessTextureTex = new Var("texture_WetnessTexture", "Texture2D");
+   WetnessTextureTex->uniform = true;
+   WetnessTextureTex->texture = true;
+   WetnessTextureTex->constNum = WetnessTexture->constNum;
+
    Var* surface = getSurface(componentList, meta, fd);
    Var* surface = getSurface(componentList, meta, fd);
 
 
    if (!surface)
    if (!surface)
@@ -3142,12 +3156,28 @@ void ReflectionProbeFeatHLSL::processPix(Vector<ShaderComponent*> &componentList
       eyePos->constSortPos = cspPass;
       eyePos->constSortPos = cspPass;
    }
    }
 
 
+   Var* accumTime = (Var*)LangElement::find("accumTime");
+   if (!accumTime)
+   {
+      accumTime = new Var("accumTime", "float");
+      accumTime->uniform = true;
+      accumTime->constSortPos = cspPass;
+   }
+
+   Var* dampness = (Var*)LangElement::find("dampness");
+   if (!dampness)
+   {
+      dampness = new Var("dampness", "float");
+      dampness->uniform = true;
+      dampness->constSortPos = cspPass;
+   }
+
    String computeForwardProbes = String("   @ = computeForwardProbes(@,@,@,@,@,@,@,@,@,\r\n\t\t");
    String computeForwardProbes = String("   @ = computeForwardProbes(@,@,@,@,@,@,@,@,@,\r\n\t\t");
-   computeForwardProbes += String("@,TORQUE_SAMPLER2D_MAKEARG(@),\r\n\t\t"); 
+   computeForwardProbes += String("@,@,TORQUE_SAMPLER2D_MAKEARG(@),TORQUE_SAMPLER2D_MAKEARG(@), @, @,\r\n\t\t"); 
    computeForwardProbes += String("TORQUE_SAMPLERCUBEARRAY_MAKEARG(@),TORQUE_SAMPLERCUBEARRAY_MAKEARG(@)).rgb; \r\n");
    computeForwardProbes += String("TORQUE_SAMPLERCUBEARRAY_MAKEARG(@),TORQUE_SAMPLERCUBEARRAY_MAKEARG(@)).rgb; \r\n");
       
       
    meta->addStatement(new GenOp(computeForwardProbes.c_str(), new DecOp(ibl), surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray, eyePos,
    meta->addStatement(new GenOp(computeForwardProbes.c_str(), new DecOp(ibl), surface, cubeMips, numProbes, worldToObjArray, probeConfigData, inProbePosArray, refScaleArray, inRefPosArray, eyePos,
-      skylightCubemapIdx, BRDFTexture,
+      skylightCubemapIdx, SkylightDamp, BRDFTexture, WetnessTexture, accumTime, dampness,
       irradianceCubemapAR, specularCubemapAR));
       irradianceCubemapAR, specularCubemapAR));
    
    
    Var *ambient = (Var *)LangElement::find("ambient");
    Var *ambient = (Var *)LangElement::find("ambient");
@@ -3167,8 +3197,8 @@ ShaderFeature::Resources ReflectionProbeFeatHLSL::getResources(const MaterialFea
 {
 {
    Resources res;
    Resources res;
 
 
-   res.numTex = 3;
-   res.numTexReg = 3;
+   res.numTex = 4;
+   res.numTexReg = 4;
 
 
    return res;
    return res;
 }
 }
@@ -3187,5 +3217,7 @@ void ReflectionProbeFeatHLSL::setTexData(Material::StageData &stageDat,
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mSamplerNames[texIndex] = "IrradianceCubemapAR";
       passData.mSamplerNames[texIndex] = "IrradianceCubemapAR";
       passData.mTexType[texIndex++] = Material::SGCube;
       passData.mTexType[texIndex++] = Material::SGCube;
+      passData.mSamplerNames[texIndex] = "WetnessTexture";
+      passData.mTexType[texIndex++] = Material::Standard;
    }
    }
 }
 }

+ 3 - 0
Engine/source/shaderGen/shaderGenVars.cpp

@@ -50,6 +50,7 @@ const String ShaderGenVars::colorMultiply("$colorMultiply");
 const String ShaderGenVars::alphaTestValue("$alphaTestValue");
 const String ShaderGenVars::alphaTestValue("$alphaTestValue");
 const String ShaderGenVars::texMat("$texMat");
 const String ShaderGenVars::texMat("$texMat");
 const String ShaderGenVars::accumTime("$accumTime");
 const String ShaderGenVars::accumTime("$accumTime");
+const String ShaderGenVars::dampness("$dampness");
 const String ShaderGenVars::minnaertConstant("$minnaertConstant");
 const String ShaderGenVars::minnaertConstant("$minnaertConstant");
 const String ShaderGenVars::subSurfaceParams("$subSurfaceParams");
 const String ShaderGenVars::subSurfaceParams("$subSurfaceParams");
 
 
@@ -90,11 +91,13 @@ const String ShaderGenVars::irradianceCubemapAR("$IrradianceCubemapAR");
 const String ShaderGenVars::probeCount("$inNumProbes");
 const String ShaderGenVars::probeCount("$inNumProbes");
 
 
 const String ShaderGenVars::BRDFTextureMap("$BRDFTexture");
 const String ShaderGenVars::BRDFTextureMap("$BRDFTexture");
+const String ShaderGenVars::WetnessTextureMap("$WetnessTexture");
 
 
 const String ShaderGenVars::maxProbeDrawDistance("$maxProbeDrawDistance");
 const String ShaderGenVars::maxProbeDrawDistance("$maxProbeDrawDistance");
 
 
 //Skylight
 //Skylight
 const String ShaderGenVars::skylightCubemapIdx("$inSkylightCubemapIdx");
 const String ShaderGenVars::skylightCubemapIdx("$inSkylightCubemapIdx");
+const String ShaderGenVars::skylightDamp("$SkylightDamp");
 
 
 // These are ignored by the D3D layers.
 // These are ignored by the D3D layers.
 const String ShaderGenVars::fogMap("$fogMap");
 const String ShaderGenVars::fogMap("$fogMap");

+ 3 - 1
Engine/source/shaderGen/shaderGenVars.h

@@ -59,6 +59,7 @@ struct ShaderGenVars
    const static String alphaTestValue;
    const static String alphaTestValue;
    const static String texMat;
    const static String texMat;
    const static String accumTime;
    const static String accumTime;
+   const static String dampness;   
    const static String minnaertConstant;
    const static String minnaertConstant;
    const static String subSurfaceParams;
    const static String subSurfaceParams;
 
 
@@ -101,11 +102,12 @@ struct ShaderGenVars
    const static String probeCount;
    const static String probeCount;
 
 
    const static String BRDFTextureMap;
    const static String BRDFTextureMap;
-
+   const static String WetnessTextureMap;   
    const static String maxProbeDrawDistance;
    const static String maxProbeDrawDistance;
 
 
    //Skylight
    //Skylight
    const static String skylightCubemapIdx;
    const static String skylightCubemapIdx;
+   const static String skylightDamp;
    
    
    // Textures
    // Textures
    const static String fogMap;
    const static String fogMap;

+ 4 - 2
Templates/BaseGame/game/core/lighting/scripts/advancedLighting_Shaders.tscript

@@ -302,7 +302,8 @@ singleton ShaderData( PFX_ReflectionProbeArray )
    samplerNames[3] = "$BRDFTexture";
    samplerNames[3] = "$BRDFTexture";
    samplerNames[4] = "$specularCubemapAR";
    samplerNames[4] = "$specularCubemapAR";
    samplerNames[5] = "$irradianceCubemapAR";
    samplerNames[5] = "$irradianceCubemapAR";
-   samplerNames[6] = "$ssaoMask";
+   samplerNames[6] = "$WetnessTexture";
+   samplerNames[7] = "$ssaoMask";
 
 
    pixVersion = 2.0;
    pixVersion = 2.0;
 };  
 };  
@@ -331,5 +332,6 @@ singleton GFXStateBlockData( PFX_ReflectionProbeArrayStateBlock )
    samplerStates[3] = SamplerClampPoint;
    samplerStates[3] = SamplerClampPoint;
    samplerStates[4] = SamplerClampLinear;
    samplerStates[4] = SamplerClampLinear;
    samplerStates[5] = SamplerClampLinear;
    samplerStates[5] = SamplerClampLinear;
-   samplerStates[6] = SamplerClampPoint;
+   samplerStates[6] = SamplerWrapPoint;
+   samplerStates[7] = SamplerClampPoint;
 };
 };

+ 0 - 1
Templates/BaseGame/game/core/postFX/scripts/ReflectionProbes/reflectionProbeArrayPostFX.tscript

@@ -15,6 +15,5 @@ singleton PostEffect( reflectionProbeArrayPostFX )
    texture[0] = "#deferred";
    texture[0] = "#deferred";
    texture[1] = "#color";
    texture[1] = "#color";
    texture[2] = "#matinfo";
    texture[2] = "#matinfo";
-
    allowReflectPass = true;
    allowReflectPass = true;
 };
 };

+ 2 - 1
Templates/BaseGame/game/core/rendering/Core_Rendering.tscript

@@ -5,7 +5,8 @@ function Core_Rendering::onCreate(%this)
    $Core::UnAvailableTexturePath = "core/rendering/images/unavailable";
    $Core::UnAvailableTexturePath = "core/rendering/images/unavailable";
    $Core::WarningTexturePath = "core/rendering/images/warnMat";
    $Core::WarningTexturePath = "core/rendering/images/warnMat";
    $Core::CommonShaderPath = "core/rendering/shaders";
    $Core::CommonShaderPath = "core/rendering/shaders";
-   $Core::BRDFTexture = "core/rendering/images/brdfTexture.dds";
+   $Core::BRDFTexture = "core/rendering/images/brdfTexture.dds";   
+   $Core::WetnessTexture = "core/rendering/images/wetMap.png";
    
    
    $Core::NoImageAssetFallback = "Core_Rendering:missingTexture_image";
    $Core::NoImageAssetFallback = "Core_Rendering:missingTexture_image";
    $Core::NoMaterialAssetFallback = "Core_Rendering:noMaterial";
    $Core::NoMaterialAssetFallback = "Core_Rendering:noMaterial";

BIN
Templates/BaseGame/game/core/rendering/images/wetMap.png


+ 8 - 0
Templates/BaseGame/game/core/rendering/images/wetMap_image.asset.taml

@@ -0,0 +1,8 @@
+<ImageAsset
+    canSave="true"
+    canSaveDynamicFields="true"
+    AssetName="wetMap_image"
+    imageFile="@assetFile=wetMap.png"
+    UseMips="true"
+    isHDRImage="false"
+    imageType="Albedo" />

+ 53 - 14
Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl

@@ -367,14 +367,36 @@ vec3 boxProject(vec3 wsPosition, vec3 wsReflectVec, mat4 worldToObj, vec3 refSca
    return posonbox - refPosition.xyz;
    return posonbox - refPosition.xyz;
 }
 }
 
 
+void dampen(inout Surface surface, sampler2D WetnessTexture, float accumTime, float degree)
+{   
+   if (degree<=0.0) return;
+   vec3 n = abs(surface.N);
+
+   float grav = 2.0-pow(dot(float3(0,0,-1),surface.N),3);
+   if (grav<0) grav*=-1.0;
+   
+   float speed = accumTime*(1.0-surface.roughness)*grav;
+   vec2 wetoffset = vec2(speed,speed/2)*0.1; 
+      
+   float wetness = texture(WetnessTexture, vec2(surface.P.xy*0.2+wetoffset)).b;
+   wetness = lerp(wetness,texture(WetnessTexture,vec2(surface.P.zx*0.2+wetoffset)).b,n.y);
+   wetness = lerp(wetness,texture(WetnessTexture,vec2(surface.P.zy*0.2+wetoffset)).b,n.x);
+   wetness = pow(wetness,3)*degree;
+   
+   surface.roughness = lerp(surface.roughness,(1.0-pow(wetness,2))*surface.roughness*0.92f+0.04f,degree);
+   surface.baseColor.rgb = lerp(surface.baseColor.rgb,surface.baseColor.rgb*(2.0-wetness)/2,degree); 
+   updateSurface(surface);
+}
+
 vec4 computeForwardProbes(Surface surface,
 vec4 computeForwardProbes(Surface surface,
     float cubeMips, int numProbes, mat4x4 inWorldToObjArray[MAX_FORWARD_PROBES], vec4 inProbeConfigData[MAX_FORWARD_PROBES], 
     float cubeMips, int numProbes, mat4x4 inWorldToObjArray[MAX_FORWARD_PROBES], vec4 inProbeConfigData[MAX_FORWARD_PROBES], 
     vec4 inProbePosArray[MAX_FORWARD_PROBES], vec4 inRefScaleArray[MAX_FORWARD_PROBES], vec4 inRefPosArray[MAX_FORWARD_PROBES],
     vec4 inProbePosArray[MAX_FORWARD_PROBES], vec4 inRefScaleArray[MAX_FORWARD_PROBES], vec4 inRefPosArray[MAX_FORWARD_PROBES],
-    vec3 wsEyePos, float skylightCubemapIdx, sampler2D BRDFTexture, 
+    vec3 wsEyePos, float skylightCubemapIdx, int SkylightDamp, sampler2D BRDFTexture, sampler2D WetnessTexture, float accumTime, float dampness,
 	samplerCubeArray irradianceCubemapAR, samplerCubeArray specularCubemapAR)
 	samplerCubeArray irradianceCubemapAR, samplerCubeArray specularCubemapAR)
 {
 {
    int i = 0;
    int i = 0;
    float alpha = 1;
    float alpha = 1;
+   float wetAmmout = 0;
    float blendFactor[MAX_FORWARD_PROBES];
    float blendFactor[MAX_FORWARD_PROBES];
    float blendSum = 0;
    float blendSum = 0;
    float blendFacSum = 0;
    float blendFacSum = 0;
@@ -383,7 +405,7 @@ vec4 computeForwardProbes(Surface surface,
    //Set up our struct data
    //Set up our struct data
    float contribution[MAX_FORWARD_PROBES];
    float contribution[MAX_FORWARD_PROBES];
    float blendCap = 0;
    float blendCap = 0;
-  for (i = 0; i < numProbes; ++i)
+  for (i = 0; i < numProbes; i++)
   {
   {
       contribution[i] = 0;
       contribution[i] = 0;
       float atten = 1.0-(length(wsEyePos-inProbePosArray[i].xyz)/maxProbeDrawDistance);
       float atten = 1.0-(length(wsEyePos-inProbePosArray[i].xyz)/maxProbeDrawDistance);
@@ -401,9 +423,15 @@ vec4 computeForwardProbes(Surface surface,
       else
       else
          contribution[i] = 0.0;
          contribution[i] = 0.0;
 
 
+      if (inRefScaleArray[i].w>0)
+         wetAmmout += contribution[i];
+      else
+         wetAmmout -= contribution[i];
+         
       blendSum += contribution[i];
       blendSum += contribution[i];
       blendCap = max(contribution[i],blendCap);
       blendCap = max(contribution[i],blendCap);
    }
    }
+   if (wetAmmout<0) wetAmmout =0;
 
 
    if (probehits > 0.0)
    if (probehits > 0.0)
    {
    {
@@ -415,7 +443,7 @@ vec4 computeForwardProbes(Surface surface,
          blendFacSum += blendFactor[i]; //running tally of results
          blendFacSum += blendFactor[i]; //running tally of results
       }
       }
 
 
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          //normalize, but in the range of the highest value applied
          //normalize, but in the range of the highest value applied
          //to preserve blend vs skylight
          //to preserve blend vs skylight
@@ -425,7 +453,7 @@ vec4 computeForwardProbes(Surface surface,
 
 
 #if (DEBUGVIZ_ATTENUATION == 1)
 #if (DEBUGVIZ_ATTENUATION == 1)
       float contribAlpha = 1;
       float contribAlpha = 1;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribAlpha -= contribution[i];
          contribAlpha -= contribution[i];
       }
       }
@@ -442,7 +470,7 @@ vec4 computeForwardProbes(Surface surface,
 
 
    vec3 finalContribColor = vec3(0, 0, 0);
    vec3 finalContribColor = vec3(0, 0, 0);
    float contribAlpha = 1;
    float contribAlpha = 1;
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       finalContribColor += contribution[i] *probeContribColors[i].rgb;
       finalContribColor += contribution[i] *probeContribColors[i].rgb;
       contribAlpha -= contribution[i];
       contribAlpha -= contribution[i];
@@ -458,10 +486,22 @@ vec4 computeForwardProbes(Surface surface,
    vec3 irradiance = vec3(0, 0, 0);
    vec3 irradiance = vec3(0, 0, 0);
    vec3 specular = vec3(0, 0, 0);
    vec3 specular = vec3(0, 0, 0);
 
 
+   for (i = 0; i < numProbes; i++)
+   {
+      float contrib = contribution[i];
+      if (contrib > 0.0f)
+      {
+         alpha -= contrib;
+      }
+   }
+   if (SkylightDamp>0)
+      wetAmmout += alpha;
+   dampen(surface, WetnessTexture, accumTime, wetAmmout*dampness);
+      
    // Radiance (Specular)
    // Radiance (Specular)
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
 
 
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
@@ -471,16 +511,15 @@ vec4 computeForwardProbes(Surface surface,
 
 
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;
-         alpha -= contrib;
       }
       }
    }
    }
-
+      
    if(skylightCubemapIdx != -1 && alpha >= 0.001)
    if(skylightCubemapIdx != -1 && alpha >= 0.001)
    {
    {
       irradiance = mix(irradiance,textureLod(irradianceCubemapAR, vec4(surface.R, skylightCubemapIdx), 0).xyz, alpha);
       irradiance = mix(irradiance,textureLod(irradianceCubemapAR, vec4(surface.R, skylightCubemapIdx), 0).xyz, alpha);
       specular = mix(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz, alpha);
       specular = mix(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz, alpha);
    }
    }
-
+   
    //energy conservation
    //energy conservation
    vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
    vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
    vec3 kD = 1.0f - F;
    vec3 kD = 1.0f - F;
@@ -521,7 +560,7 @@ vec4 debugVizForwardProbes(Surface surface,
    float probehits = 0;
    float probehits = 0;
    //Set up our struct data
    //Set up our struct data
    float contribution[MAX_FORWARD_PROBES];
    float contribution[MAX_FORWARD_PROBES];
-  for (i = 0; i < numProbes; ++i)
+  for (i = 0; i < numProbes; i++)
   {
   {
       contribution[i] = 0;
       contribution[i] = 0;
 
 
@@ -561,7 +600,7 @@ vec4 debugVizForwardProbes(Surface surface,
       }
       }
 
 
       float invBlendSumWeighted = 1.0f / blendFacSum;
       float invBlendSumWeighted = 1.0f / blendFacSum;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          blendFactor[i] *= invBlendSumWeighted;
          blendFactor[i] *= invBlendSumWeighted;
          contribution[i] *= blendFactor[i];
          contribution[i] *= blendFactor[i];
@@ -571,7 +610,7 @@ vec4 debugVizForwardProbes(Surface surface,
    if(showAtten == 1)
    if(showAtten == 1)
    {
    {
       float contribAlpha = 1;
       float contribAlpha = 1;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribAlpha -= contribution[i];
          contribAlpha -= contribution[i];
       }
       }
@@ -589,7 +628,7 @@ vec4 debugVizForwardProbes(Surface surface,
 
 
       vec3 finalContribColor = vec3(0, 0, 0);
       vec3 finalContribColor = vec3(0, 0, 0);
       float contribAlpha = 1;
       float contribAlpha = 1;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          finalContribColor += contribution[i] *probeContribColors[i].rgb;
          finalContribColor += contribution[i] *probeContribColors[i].rgb;
          contribAlpha -= contribution[i];
          contribAlpha -= contribution[i];
@@ -613,7 +652,7 @@ vec4 debugVizForwardProbes(Surface surface,
       lod = 0;
       lod = 0;
    }
    }
 
 
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)

+ 53 - 13
Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl

@@ -371,14 +371,36 @@ float3 boxProject(float3 wsPosition, float3 wsReflectVec, float4x4 worldToObj, f
    return posonbox-refPosition;
    return posonbox-refPosition;
 }
 }
 
 
+void dampen(inout Surface surface, TORQUE_SAMPLER2D(WetnessTexture), float accumTime, float degree)
+{   
+   if (degree<=0.0) return;
+   float3 n = abs(surface.N);
+
+   float grav = 2.0-pow(dot(float3(0,0,-1),surface.N),3);
+   if (grav<0) grav*=-1.0;
+   
+   float speed = accumTime*(1.0-surface.roughness)*grav;
+   float2 wetoffset = float2(speed,speed/2)*0.1; 
+      
+   float wetness = TORQUE_TEX2D(WetnessTexture, float2(surface.P.xy*0.2+wetoffset)).b; 
+   wetness = lerp(wetness,TORQUE_TEX2D(WetnessTexture,float2(surface.P.zx*0.2+wetoffset)).b,n.y);
+   wetness = lerp(wetness,TORQUE_TEX2D(WetnessTexture,float2(surface.P.zy*0.2+wetoffset)).b,n.x);
+   wetness = pow(wetness,3)*degree;
+   
+   surface.roughness = lerp(surface.roughness,(1.0-pow(wetness,2))*surface.roughness*0.92f+0.04f,degree);
+   surface.baseColor.rgb = lerp(surface.baseColor.rgb,surface.baseColor.rgb*(2.0-wetness)/2,degree);
+   surface.Update(); 
+}
+
 float4 computeForwardProbes(Surface surface,
 float4 computeForwardProbes(Surface surface,
     float cubeMips, int numProbes, float4x4 inWorldToObjArray[MAX_FORWARD_PROBES], float4 inProbeConfigData[MAX_FORWARD_PROBES], 
     float cubeMips, int numProbes, float4x4 inWorldToObjArray[MAX_FORWARD_PROBES], float4 inProbeConfigData[MAX_FORWARD_PROBES], 
     float4 inProbePosArray[MAX_FORWARD_PROBES], float4 inRefScaleArray[MAX_FORWARD_PROBES], float4 inRefPosArray[MAX_FORWARD_PROBES],
     float4 inProbePosArray[MAX_FORWARD_PROBES], float4 inRefScaleArray[MAX_FORWARD_PROBES], float4 inRefPosArray[MAX_FORWARD_PROBES],
-    float3 wsEyePos, float skylightCubemapIdx, TORQUE_SAMPLER2D(BRDFTexture), 
+    float3 wsEyePos, float skylightCubemapIdx, int SkylightDamp, TORQUE_SAMPLER2D(BRDFTexture), TORQUE_SAMPLER2D(WetnessTexture), float accumTime, float dampness,
 	 TORQUE_SAMPLERCUBEARRAY(irradianceCubemapAR), TORQUE_SAMPLERCUBEARRAY(specularCubemapAR))
 	 TORQUE_SAMPLERCUBEARRAY(irradianceCubemapAR), TORQUE_SAMPLERCUBEARRAY(specularCubemapAR))
 {
 {
    int i = 0;
    int i = 0;
    float alpha = 1;
    float alpha = 1;
+   float wetAmmout = 0;
    float blendFactor[MAX_FORWARD_PROBES];
    float blendFactor[MAX_FORWARD_PROBES];
    float blendSum = 0;
    float blendSum = 0;
    float blendFacSum = 0;
    float blendFacSum = 0;
@@ -389,7 +411,7 @@ float4 computeForwardProbes(Surface surface,
    
    
    float blendCap = 0;
    float blendCap = 0;
    //Process prooooobes
    //Process prooooobes
-  for (i = 0; i < numProbes; ++i)
+  for (i = 0; i < numProbes; i++)
   {
   {
       contribution[i] = 0.0;
       contribution[i] = 0.0;
       float atten = 1.0-(length(wsEyePos-inProbePosArray[i].xyz)/maxProbeDrawDistance);
       float atten = 1.0-(length(wsEyePos-inProbePosArray[i].xyz)/maxProbeDrawDistance);
@@ -407,10 +429,16 @@ float4 computeForwardProbes(Surface surface,
       else
       else
          contribution[i] = 0.0;
          contribution[i] = 0.0;
 
 
+      if (inRefScaleArray[i].w>0)
+         wetAmmout += contribution[i];
+      else
+         wetAmmout -= contribution[i];
+         
       blendSum += contribution[i];
       blendSum += contribution[i];
       blendCap = max(contribution[i],blendCap);
       blendCap = max(contribution[i],blendCap);
    }
    }
-
+   if (wetAmmout<0) wetAmmout =0;
+   
    if (probehits > 0.0)
    if (probehits > 0.0)
    {
    {
       invBlendSum = (probehits - blendSum)/probehits; //grab the remainder 
       invBlendSum = (probehits - blendSum)/probehits; //grab the remainder 
@@ -421,7 +449,7 @@ float4 computeForwardProbes(Surface surface,
          blendFacSum += blendFactor[i]; //running tally of results
          blendFacSum += blendFactor[i]; //running tally of results
       }
       }
 
 
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       { 
       { 
          //normalize, but in the range of the highest value applied
          //normalize, but in the range of the highest value applied
          //to preserve blend vs skylight
          //to preserve blend vs skylight
@@ -431,7 +459,7 @@ float4 computeForwardProbes(Surface surface,
 
 
 #if DEBUGVIZ_ATTENUATION == 1
 #if DEBUGVIZ_ATTENUATION == 1
       float contribAlpha = 1;
       float contribAlpha = 1;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribAlpha -= contribution[i];
          contribAlpha -= contribution[i];
       }
       }
@@ -448,7 +476,7 @@ float4 computeForwardProbes(Surface surface,
 
 
    float3 finalContribColor = float3(0, 0, 0);
    float3 finalContribColor = float3(0, 0, 0);
    float contribAlpha = 1;
    float contribAlpha = 1;
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       finalContribColor += contribution[i] *probeContribColors[i].rgb;
       finalContribColor += contribution[i] *probeContribColors[i].rgb;
       contribAlpha -= contribution[i];
       contribAlpha -= contribution[i];
@@ -464,10 +492,22 @@ float4 computeForwardProbes(Surface surface,
    float3 irradiance = float3(0, 0, 0);
    float3 irradiance = float3(0, 0, 0);
    float3 specular = float3(0, 0, 0);
    float3 specular = float3(0, 0, 0);
 
 
+   for (i = 0; i < numProbes; i++)
+   {
+      float contrib = contribution[i];
+      if (contrib > 0.0f)
+      {
+         alpha -= contrib;
+      }
+   }
+   if (SkylightDamp>0)
+      wetAmmout += alpha;
+   dampen(surface, TORQUE_SAMPLER2D_MAKEARG(WetnessTexture), accumTime, wetAmmout*dampness);
+   
    // Radiance (Specular)
    // Radiance (Specular)
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
 
 
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
@@ -477,9 +517,9 @@ float4 computeForwardProbes(Surface surface,
 
 
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;
-         alpha -= contrib;
       }
       }
    }
    }
+   
 
 
    if(skylightCubemapIdx != -1 && alpha >= 0.001)
    if(skylightCubemapIdx != -1 && alpha >= 0.001)
    {
    {
@@ -527,7 +567,7 @@ float4 debugVizForwardProbes(Surface surface,
    float probehits = 0;
    float probehits = 0;
    //Set up our struct data
    //Set up our struct data
    float contribution[MAX_FORWARD_PROBES];
    float contribution[MAX_FORWARD_PROBES];
-  for (i = 0; i < numProbes; ++i)
+  for (i = 0; i < numProbes; i++)
   {
   {
       contribution[i] = 0;
       contribution[i] = 0;
 
 
@@ -567,7 +607,7 @@ float4 debugVizForwardProbes(Surface surface,
       }
       }
 
 
       float invBlendSumWeighted = 1.0f / blendFacSum;
       float invBlendSumWeighted = 1.0f / blendFacSum;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          blendFactor[i] *= invBlendSumWeighted;
          blendFactor[i] *= invBlendSumWeighted;
          contribution[i] *= blendFactor[i];
          contribution[i] *= blendFactor[i];
@@ -577,7 +617,7 @@ float4 debugVizForwardProbes(Surface surface,
    if(showAtten == 1)
    if(showAtten == 1)
    {
    {
       float contribAlpha = 1;
       float contribAlpha = 1;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribAlpha -= contribution[i];
          contribAlpha -= contribution[i];
       }
       }
@@ -595,7 +635,7 @@ float4 debugVizForwardProbes(Surface surface,
 
 
       float3 finalContribColor = float3(0, 0, 0);
       float3 finalContribColor = float3(0, 0, 0);
       float contribAlpha = 1;
       float contribAlpha = 1;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          finalContribColor += contribution[i] *probeContribColors[i].rgb;
          finalContribColor += contribution[i] *probeContribColors[i].rgb;
          contribAlpha -= contribution[i];
          contribAlpha -= contribution[i];
@@ -619,7 +659,7 @@ float4 debugVizForwardProbes(Surface surface,
       lod = 0;
       lod = 0;
    }
    }
 
 
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)

+ 33 - 12
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl

@@ -25,11 +25,13 @@ uniform int numProbes;
 
 
 uniform samplerCubeArray specularCubemapAR;
 uniform samplerCubeArray specularCubemapAR;
 uniform samplerCubeArray irradianceCubemapAR;
 uniform samplerCubeArray irradianceCubemapAR;
-
+uniform sampler2D WetnessTexture;
 #ifdef USE_SSAO_MASK
 #ifdef USE_SSAO_MASK
 uniform sampler2D ssaoMask;
 uniform sampler2D ssaoMask;
-uniform vec4 rtParams6;
+uniform vec4 rtParams7;
 #endif
 #endif
+uniform float accumTime;
+uniform float dampness;
 
 
 uniform vec4    probePosArray[MAX_PROBES];
 uniform vec4    probePosArray[MAX_PROBES];
 uniform vec4    refPosArray[MAX_PROBES];
 uniform vec4    refPosArray[MAX_PROBES];
@@ -42,6 +44,7 @@ uniform vec4    probeContribColors[MAX_PROBES];
 #endif
 #endif
 
 
 uniform int skylightCubemapIdx;
 uniform int skylightCubemapIdx;
+uniform int SkylightDamp;
 
 
 out vec4 OUT_col;
 out vec4 OUT_col;
 
 
@@ -67,6 +70,7 @@ void main()
 
 
 
 
    float alpha = 1;
    float alpha = 1;
+   float wetAmmout = 0;
 
 
 #if SKYLIGHT_ONLY == 0
 #if SKYLIGHT_ONLY == 0
    int i = 0;
    int i = 0;
@@ -82,7 +86,7 @@ void main()
    if (alpha > 0)
    if (alpha > 0)
    {
    {
       //Process prooooobes
       //Process prooooobes
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribution[i] = 0;
          contribution[i] = 0;
 
 
@@ -96,14 +100,20 @@ void main()
             contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g)*atten;
             contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g)*atten;
          }
          }
 
 
-            if (contribution[i]>0.0)
-               probehits++;
+         if (contribution[i]>0.0)
+            probehits++;
          else
          else
             contribution[i] = 0;
             contribution[i] = 0;
 
 
+         if (refScaleArray[i].w>0)
+            wetAmmout += contribution[i];
+         else
+            wetAmmout -= contribution[i];
+         
          blendSum += contribution[i];
          blendSum += contribution[i];
          blendCap = max(contribution[i],blendCap);
          blendCap = max(contribution[i],blendCap);
       }
       }
+      if (wetAmmout<0) wetAmmout =0;
       
       
        if (probehits > 0.0)
        if (probehits > 0.0)
 	   {
 	   {
@@ -115,7 +125,7 @@ void main()
                blendFacSum += blendFactor[i]; //running tally of results
                blendFacSum += blendFactor[i]; //running tally of results
          }
          }
 
 
-         for (i = 0; i < numProbes; ++i)
+         for (i = 0; i < numProbes; i++)
          {
          {
             //normalize, but in the range of the highest value applied
             //normalize, but in the range of the highest value applied
             //to preserve blend vs skylight
             //to preserve blend vs skylight
@@ -125,7 +135,7 @@ void main()
       
       
 #if DEBUGVIZ_ATTENUATION == 1
 #if DEBUGVIZ_ATTENUATION == 1
       float contribAlpha = 0;
       float contribAlpha = 0;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribAlpha += contribution[i];
          contribAlpha += contribution[i];
       }
       }
@@ -136,7 +146,7 @@ void main()
 
 
 #if DEBUGVIZ_CONTRIB == 1
 #if DEBUGVIZ_CONTRIB == 1
       vec3 finalContribColor = vec3(0, 0, 0);
       vec3 finalContribColor = vec3(0, 0, 0);
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          finalContribColor += contribution[i] * vec3(fmod(i+1,2),fmod(i+1,3),fmod(i+1,4));
          finalContribColor += contribution[i] * vec3(fmod(i+1,2),fmod(i+1,3),fmod(i+1,4));
       }
       }
@@ -144,11 +154,23 @@ void main()
       return;
       return;
 #endif
 #endif
    }
    }
+   for (i = 0; i < numProbes; i++)
+   {
+      float contrib = contribution[i];
+      if (contrib > 0.0f)
+      {
+         alpha -= contrib;
+      }
+   }
 #endif
 #endif
 
 
    vec3 irradiance = vec3(0, 0, 0);
    vec3 irradiance = vec3(0, 0, 0);
    vec3 specular = vec3(0, 0, 0);
    vec3 specular = vec3(0, 0, 0);
 
 
+   if (SkylightDamp>0)
+      wetAmmout += alpha;
+   dampen(surface, WetnessTexture, accumTime, wetAmmout*dampness);
+   
    // Radiance (Specular)
    // Radiance (Specular)
 #if DEBUGVIZ_SPECCUBEMAP == 0
 #if DEBUGVIZ_SPECCUBEMAP == 0
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
@@ -157,7 +179,7 @@ void main()
 #endif
 #endif
 
 
 #if SKYLIGHT_ONLY == 0
 #if SKYLIGHT_ONLY == 0
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
@@ -167,17 +189,16 @@ void main()
 
 
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          irradiance += textureLod(irradianceCubemapAR, vec4(dir, cubemapIdx), 0).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;
          specular += textureLod(specularCubemapAR, vec4(dir, cubemapIdx), lod).xyz * contrib;
-         alpha -= contrib;
       }
       }
    }
    }
 #endif
 #endif
-
+      
    if (skylightCubemapIdx != -1 && alpha >= 0.001)
    if (skylightCubemapIdx != -1 && alpha >= 0.001)
    {
    {
       irradiance = lerp(irradiance,textureLod(irradianceCubemapAR, vec4(surface.R, skylightCubemapIdx), 0).xyz,alpha);
       irradiance = lerp(irradiance,textureLod(irradianceCubemapAR, vec4(surface.R, skylightCubemapIdx), 0).xyz,alpha);
       specular = lerp(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz,alpha);
       specular = lerp(specular,textureLod(specularCubemapAR, vec4(surface.R, skylightCubemapIdx), lod).xyz,alpha);
    }
    }
-
+   
 #if DEBUGVIZ_SPECCUBEMAP == 1 && DEBUGVIZ_DIFFCUBEMAP == 0
 #if DEBUGVIZ_SPECCUBEMAP == 1 && DEBUGVIZ_DIFFCUBEMAP == 0
    OUT_col = vec4(specular, 1);
    OUT_col = vec4(specular, 1);
    return;
    return;

+ 30 - 11
Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl

@@ -20,11 +20,14 @@ uniform int numProbes;
 
 
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(specularCubemapAR, 4);
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(specularCubemapAR, 4);
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(irradianceCubemapAR, 5);
 TORQUE_UNIFORM_SAMPLERCUBEARRAY(irradianceCubemapAR, 5);
+TORQUE_UNIFORM_SAMPLER2D(WetnessTexture, 6);
 
 
 #ifdef USE_SSAO_MASK
 #ifdef USE_SSAO_MASK
-TORQUE_UNIFORM_SAMPLER2D(ssaoMask, 6);
-uniform float4 rtParams6;
+TORQUE_UNIFORM_SAMPLER2D(ssaoMask, 7);
+uniform float4 rtParams7;
 #endif
 #endif
+uniform float accumTime;
+uniform float dampness;
 
 
 uniform float4    probePosArray[MAX_PROBES];
 uniform float4    probePosArray[MAX_PROBES];
 uniform float4    refPosArray[MAX_PROBES];
 uniform float4    refPosArray[MAX_PROBES];
@@ -37,6 +40,7 @@ uniform float4    probeContribColors[MAX_PROBES];
 #endif
 #endif
 
 
 uniform int skylightCubemapIdx;
 uniform int skylightCubemapIdx;
+uniform int SkylightDamp;
 
 
 float4 main(PFXVertToPix IN) : SV_TARGET
 float4 main(PFXVertToPix IN) : SV_TARGET
 {
 {
@@ -59,7 +63,7 @@ float4 main(PFXVertToPix IN) : SV_TARGET
    #endif
    #endif
 
 
    float alpha = 1;
    float alpha = 1;
-
+   float wetAmmout = 0;
 #if SKYLIGHT_ONLY == 0
 #if SKYLIGHT_ONLY == 0
    int i = 0;
    int i = 0;
    float blendFactor[MAX_PROBES];
    float blendFactor[MAX_PROBES];
@@ -74,7 +78,7 @@ float4 main(PFXVertToPix IN) : SV_TARGET
    if (alpha > 0)
    if (alpha > 0)
    {
    {
       //Process prooooobes
       //Process prooooobes
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribution[i] = 0.0;
          contribution[i] = 0.0;
 
 
@@ -93,9 +97,15 @@ float4 main(PFXVertToPix IN) : SV_TARGET
          else
          else
             contribution[i] = 0.0;
             contribution[i] = 0.0;
 
 
+         if (refScaleArray[i].w>0)
+            wetAmmout += contribution[i];
+         else
+            wetAmmout -= contribution[i];
+
          blendSum += contribution[i];
          blendSum += contribution[i];
          blendCap = max(contribution[i],blendCap);
          blendCap = max(contribution[i],blendCap);
       }
       }
+      if (wetAmmout<0) wetAmmout =0;
        if (probehits > 0.0)
        if (probehits > 0.0)
 	   {
 	   {
          invBlendSum = (probehits - blendSum)/probehits; //grab the remainder 
          invBlendSum = (probehits - blendSum)/probehits; //grab the remainder 
@@ -106,7 +116,7 @@ float4 main(PFXVertToPix IN) : SV_TARGET
                blendFacSum += blendFactor[i]; //running tally of results
                blendFacSum += blendFactor[i]; //running tally of results
          }
          }
 
 
-         for (i = 0; i < numProbes; ++i)
+         for (i = 0; i < numProbes; i++)
          {
          {
             //normalize, but in the range of the highest value applied
             //normalize, but in the range of the highest value applied
             //to preserve blend vs skylight
             //to preserve blend vs skylight
@@ -116,7 +126,7 @@ float4 main(PFXVertToPix IN) : SV_TARGET
       
       
 #if DEBUGVIZ_ATTENUATION == 1
 #if DEBUGVIZ_ATTENUATION == 1
       float contribAlpha = 0;
       float contribAlpha = 0;
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          contribAlpha += contribution[i];
          contribAlpha += contribution[i];
       }
       }
@@ -126,18 +136,30 @@ float4 main(PFXVertToPix IN) : SV_TARGET
 
 
 #if DEBUGVIZ_CONTRIB == 1
 #if DEBUGVIZ_CONTRIB == 1
       float3 finalContribColor = float3(0, 0, 0);
       float3 finalContribColor = float3(0, 0, 0);
-      for (i = 0; i < numProbes; ++i)
+      for (i = 0; i < numProbes; i++)
       {
       {
          finalContribColor += contribution[i] * float3(fmod(i+1,2),fmod(i+1,3),fmod(i+1,4));
          finalContribColor += contribution[i] * float3(fmod(i+1,2),fmod(i+1,3),fmod(i+1,4));
       }
       }
       return float4(finalContribColor, 1);
       return float4(finalContribColor, 1);
 #endif
 #endif
    }
    }
+   for (i = 0; i < numProbes; i++)
+   {
+      float contrib = contribution[i];
+      if (contrib > 0.0f)
+      {
+         alpha -= contrib;
+      }
+   }
 #endif
 #endif
 
 
    float3 irradiance = float3(0, 0, 0);
    float3 irradiance = float3(0, 0, 0);
    float3 specular = float3(0, 0, 0);
    float3 specular = float3(0, 0, 0);
 
 
+   if (SkylightDamp>0)
+      wetAmmout += alpha;
+   dampen(surface, TORQUE_SAMPLER2D_MAKEARG(WetnessTexture), accumTime, wetAmmout*dampness);
+   
    // Radiance (Specular)
    // Radiance (Specular)
 #if DEBUGVIZ_SPECCUBEMAP == 0
 #if DEBUGVIZ_SPECCUBEMAP == 0
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
    float lod = roughnessToMipLevel(surface.roughness, cubeMips);
@@ -146,7 +168,7 @@ float4 main(PFXVertToPix IN) : SV_TARGET
 #endif
 #endif
 
 
 #if SKYLIGHT_ONLY == 0
 #if SKYLIGHT_ONLY == 0
-   for (i = 0; i < numProbes; ++i)
+   for (i = 0; i < numProbes; i++)
    {
    {
       float contrib = contribution[i];
       float contrib = contribution[i];
       if (contrib > 0.0f)
       if (contrib > 0.0f)
@@ -156,11 +178,9 @@ float4 main(PFXVertToPix IN) : SV_TARGET
 
 
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, dir, cubemapIdx, 0).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;
          specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, dir, cubemapIdx, lod).xyz * contrib;
-         alpha -= contrib;
       }
       }
    }
    }
 #endif
 #endif
-
    if(skylightCubemapIdx != -1 && alpha >= 0.001)
    if(skylightCubemapIdx != -1 && alpha >= 0.001)
    {
    {
       irradiance = lerp(irradiance,TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, surface.R, skylightCubemapIdx, 0).xyz,alpha);
       irradiance = lerp(irradiance,TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, surface.R, skylightCubemapIdx, 0).xyz,alpha);
@@ -172,7 +192,6 @@ float4 main(PFXVertToPix IN) : SV_TARGET
 #elif DEBUGVIZ_DIFFCUBEMAP == 1
 #elif DEBUGVIZ_DIFFCUBEMAP == 1
    return float4(irradiance, 1);
    return float4(irradiance, 1);
 #endif
 #endif
-
    //energy conservation
    //energy conservation
    float3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
    float3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness);
    float3 kD = 1.0f - F;
    float3 kD = 1.0f - F;