diff --git a/Engine/source/T3D/lighting/boxEnvironmentProbe.cpp b/Engine/source/T3D/lighting/boxEnvironmentProbe.cpp index 4104ec87d..a4ad8136d 100644 --- a/Engine/source/T3D/lighting/boxEnvironmentProbe.cpp +++ b/Engine/source/T3D/lighting/boxEnvironmentProbe.cpp @@ -94,8 +94,6 @@ void BoxEnvironmentProbe::initPersistFields() // SceneObject already handles exposing the transform Parent::initPersistFields(); - addField("attenuation", TypeF32, Offset(mAtten, BoxEnvironmentProbe), "falloff percent"); - removeField("radius"); } @@ -127,12 +125,6 @@ U32 BoxEnvironmentProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *st { // Allow the Parent to get a crack at writing its info U32 retMask = Parent::packUpdate(conn, mask, stream); - - if (stream->writeFlag(mask & StaticDataMask)) - { - stream->write(mAtten); - } - return retMask; } @@ -141,12 +133,6 @@ void BoxEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream) // Let the Parent read any info it sent Parent::unpackUpdate(conn, stream); - if (stream->readFlag()) // StaticDataMask - { - stream->read(&mAtten); - mDirty = true; - } - if (mDirty) { updateProbeParams(); @@ -160,8 +146,6 @@ void BoxEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream) void BoxEnvironmentProbe::updateProbeParams() { mProbeShapeType = ProbeInfo::Box; - mProbeInfo.mAtten = mAtten; - Parent::updateProbeParams(); } diff --git a/Engine/source/T3D/lighting/boxEnvironmentProbe.h b/Engine/source/T3D/lighting/boxEnvironmentProbe.h index 10509aa1e..95758874a 100644 --- a/Engine/source/T3D/lighting/boxEnvironmentProbe.h +++ b/Engine/source/T3D/lighting/boxEnvironmentProbe.h @@ -56,7 +56,6 @@ class BaseMatInstance; class BoxEnvironmentProbe : public ReflectionProbe { typedef ReflectionProbe Parent; - F32 mAtten; private: //Debug rendering diff --git a/Engine/source/T3D/lighting/reflectionProbe.cpp b/Engine/source/T3D/lighting/reflectionProbe.cpp index 57f6e9485..e5951cea0 100644 --- a/Engine/source/T3D/lighting/reflectionProbe.cpp +++ b/Engine/source/T3D/lighting/reflectionProbe.cpp @@ -152,10 +152,11 @@ ReflectionProbe::~ReflectionProbe() void ReflectionProbe::initPersistFields() { docsURL; - addField("canDamp", TypeBool, Offset(mCanDamp, ReflectionProbe),"wetness allowed"); addGroup("Rendering"); addProtectedField("enabled", TypeBool, Offset(mEnabled, ReflectionProbe), &_setEnabled, &defaultProtectedGetFn, "Is the probe enabled or not"); + addField("canDamp", TypeBool, Offset(mCanDamp, ReflectionProbe),"wetness allowed"); + addField("attenuation", TypeF32, Offset(mAtten, ReflectionProbe), "falloff percent"); endGroup("Rendering"); addGroup("Reflection"); @@ -436,6 +437,7 @@ U32 ReflectionProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *stream stream->write(mProbeUniqueID); stream->write((U32)mReflectionModeType); stream->writeString(mCubemapName); + stream->write(mAtten); } if (stream->writeFlag(mask & EnabledMask)) @@ -490,6 +492,7 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream) if(oldReflectModeType != mReflectionModeType || oldCubemapName != mCubemapName) mCubemapDirty = true; + stream->read(&mAtten); mDirty = true; } @@ -565,6 +568,7 @@ void ReflectionProbe::updateProbeParams() mProbeInfo.mProbeRefOffset = mProbeRefOffset; mProbeInfo.mProbeRefScale = mProbeRefScale; mProbeInfo.mCanDamp = mCanDamp; + mProbeInfo.mAtten = mAtten; mProbeInfo.mDirty = true; diff --git a/Engine/source/T3D/lighting/reflectionProbe.h b/Engine/source/T3D/lighting/reflectionProbe.h index 1107efd0e..e6759d20f 100644 --- a/Engine/source/T3D/lighting/reflectionProbe.h +++ b/Engine/source/T3D/lighting/reflectionProbe.h @@ -167,6 +167,7 @@ protected: /// Whether this probe is enabled or not /// bool mEnabled; + F32 mAtten; bool mDirty; diff --git a/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl b/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl index 06d1bb621..68f34f1ec 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl +++ b/Templates/BaseGame/game/core/rendering/shaders/gl/lighting.glsl @@ -351,8 +351,9 @@ vec4 compute4Lights( Surface surface, //Probe IBL stuff float defineSphereSpaceInfluence(vec3 wsPosition, vec3 wsProbePosition, float radius) { - vec3 L = wsProbePosition.xyz - wsPosition; - float contribution = 1.0 - length(L) / radius; + float3 L = (wsProbePosition.xyz - wsPosition); + float innerRadius = radius-(radius*atten); + float contribution = 1.0-saturate(mix(length(L), radius-innerRadius, atten)/radius); return saturate(contribution); } @@ -436,7 +437,7 @@ vec4 computeForwardProbes(Surface surface, } else if (inProbeConfigData[i].r == 1) //sphere { - contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g)*atten; + contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g, inProbeConfigData[i].b*atten); } if (contribution[i]>0.0) @@ -593,7 +594,7 @@ vec4 debugVizForwardProbes(Surface surface, } else if (inProbeConfigData[i].r == 1) //sphere { - contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g); + contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g, inProbeConfigData[i].b); if (contribution[i] > 0.0) probehits++; } diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl index 036d686f6..58789ee20 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting.hlsl @@ -352,10 +352,11 @@ float4 compute4Lights( Surface surface, } //Probe IBL stuff -float defineSphereSpaceInfluence(float3 wsPosition, float3 wsProbePosition, float radius) +float defineSphereSpaceInfluence(float3 wsPosition, float3 wsProbePosition, float radius, float atten) { - float3 L = wsProbePosition.xyz - wsPosition; - float contribution = 1.0 - length(L) / radius; + float3 L = (wsProbePosition.xyz - wsPosition); + float innerRadius = radius-(radius*atten); + float contribution = 1.0-saturate(lerp(length(L), radius-innerRadius, atten)/radius); return saturate(contribution); } @@ -441,7 +442,7 @@ float4 computeForwardProbes(Surface surface, } else if (inProbeConfigData[i].r == 1) //sphere { - contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g)*atten; + contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g, inProbeConfigData[i].b*atten); } if (contribution[i]>0.0) @@ -599,7 +600,7 @@ float4 debugVizForwardProbes(Surface surface, } else if (inProbeConfigData[i].r == 1) //sphere { - contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g); + contribution[i] = defineSphereSpaceInfluence(surface.P, inProbePosArray[i].xyz, inProbeConfigData[i].g, inProbeConfigData[i].b); if (contribution[i] > 0.0) probehits++; } diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl index 2c8d8946d..c3cc37863 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/gl/reflectionProbeArrayP.glsl @@ -94,7 +94,7 @@ void main() } else if (probeConfigData[i].r == 1) //sphere { - contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g)*atten; + contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g, probeConfigData[i].b*atten); } if (contribution[i]>0.0) diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl index 2b2f46589..fdb89a24c 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl @@ -83,12 +83,12 @@ float4 main(PFXVertToPix IN) : SV_TARGET float atten =1.0-(length(eyePosWorld-probePosArray[i].xyz)/maxProbeDrawDistance); if (probeConfigData[i].r == 0) //box - { + { contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b)*atten; } - else if (probeConfigData[i].r == 1) //sphere + else if (probeConfigData[i].r == 1) //sphere { - contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g)*atten; + contribution[i] = defineSphereSpaceInfluence(surface.P, probePosArray[i].xyz, probeConfigData[i].g, probeConfigData[i].b*atten); } if (contribution[i]>0.0)