shift attenuation to probes in general.

This commit is contained in:
AzaezelX 2025-01-07 16:58:50 -06:00
parent 67ae3d136b
commit 5a2ec2731f
8 changed files with 21 additions and 31 deletions

View file

@ -94,8 +94,6 @@ void BoxEnvironmentProbe::initPersistFields()
// SceneObject already handles exposing the transform // SceneObject already handles exposing the transform
Parent::initPersistFields(); Parent::initPersistFields();
addField("attenuation", TypeF32, Offset(mAtten, BoxEnvironmentProbe), "falloff percent");
removeField("radius"); 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 // Allow the Parent to get a crack at writing its info
U32 retMask = Parent::packUpdate(conn, mask, stream); U32 retMask = Parent::packUpdate(conn, mask, stream);
if (stream->writeFlag(mask & StaticDataMask))
{
stream->write(mAtten);
}
return retMask; return retMask;
} }
@ -141,12 +133,6 @@ void BoxEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
// Let the Parent read any info it sent // Let the Parent read any info it sent
Parent::unpackUpdate(conn, stream); Parent::unpackUpdate(conn, stream);
if (stream->readFlag()) // StaticDataMask
{
stream->read(&mAtten);
mDirty = true;
}
if (mDirty) if (mDirty)
{ {
updateProbeParams(); updateProbeParams();
@ -160,8 +146,6 @@ void BoxEnvironmentProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
void BoxEnvironmentProbe::updateProbeParams() void BoxEnvironmentProbe::updateProbeParams()
{ {
mProbeShapeType = ProbeInfo::Box; mProbeShapeType = ProbeInfo::Box;
mProbeInfo.mAtten = mAtten;
Parent::updateProbeParams(); Parent::updateProbeParams();
} }

View file

@ -56,7 +56,6 @@ class BaseMatInstance;
class BoxEnvironmentProbe : public ReflectionProbe class BoxEnvironmentProbe : public ReflectionProbe
{ {
typedef ReflectionProbe Parent; typedef ReflectionProbe Parent;
F32 mAtten;
private: private:
//Debug rendering //Debug rendering

View file

@ -152,10 +152,11 @@ ReflectionProbe::~ReflectionProbe()
void ReflectionProbe::initPersistFields() void ReflectionProbe::initPersistFields()
{ {
docsURL; docsURL;
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");
addField("canDamp", TypeBool, Offset(mCanDamp, ReflectionProbe),"wetness allowed");
addField("attenuation", TypeF32, Offset(mAtten, ReflectionProbe), "falloff percent");
endGroup("Rendering"); endGroup("Rendering");
addGroup("Reflection"); addGroup("Reflection");
@ -436,6 +437,7 @@ U32 ReflectionProbe::packUpdate(NetConnection *conn, U32 mask, BitStream *stream
stream->write(mProbeUniqueID); stream->write(mProbeUniqueID);
stream->write((U32)mReflectionModeType); stream->write((U32)mReflectionModeType);
stream->writeString(mCubemapName); stream->writeString(mCubemapName);
stream->write(mAtten);
} }
if (stream->writeFlag(mask & EnabledMask)) if (stream->writeFlag(mask & EnabledMask))
@ -490,6 +492,7 @@ void ReflectionProbe::unpackUpdate(NetConnection *conn, BitStream *stream)
if(oldReflectModeType != mReflectionModeType || oldCubemapName != mCubemapName) if(oldReflectModeType != mReflectionModeType || oldCubemapName != mCubemapName)
mCubemapDirty = true; mCubemapDirty = true;
stream->read(&mAtten);
mDirty = true; mDirty = true;
} }
@ -565,6 +568,7 @@ void ReflectionProbe::updateProbeParams()
mProbeInfo.mProbeRefOffset = mProbeRefOffset; mProbeInfo.mProbeRefOffset = mProbeRefOffset;
mProbeInfo.mProbeRefScale = mProbeRefScale; mProbeInfo.mProbeRefScale = mProbeRefScale;
mProbeInfo.mCanDamp = mCanDamp; mProbeInfo.mCanDamp = mCanDamp;
mProbeInfo.mAtten = mAtten;
mProbeInfo.mDirty = true; mProbeInfo.mDirty = true;

View file

@ -167,6 +167,7 @@ protected:
/// Whether this probe is enabled or not /// Whether this probe is enabled or not
/// </summary> /// </summary>
bool mEnabled; bool mEnabled;
F32 mAtten;
bool mDirty; bool mDirty;

View file

@ -351,8 +351,9 @@ vec4 compute4Lights( Surface surface,
//Probe IBL stuff //Probe IBL stuff
float defineSphereSpaceInfluence(vec3 wsPosition, vec3 wsProbePosition, float radius) float defineSphereSpaceInfluence(vec3 wsPosition, vec3 wsProbePosition, float radius)
{ {
vec3 L = wsProbePosition.xyz - wsPosition; float3 L = (wsProbePosition.xyz - wsPosition);
float contribution = 1.0 - length(L) / radius; float innerRadius = radius-(radius*atten);
float contribution = 1.0-saturate(mix(length(L), radius-innerRadius, atten)/radius);
return saturate(contribution); return saturate(contribution);
} }
@ -436,7 +437,7 @@ vec4 computeForwardProbes(Surface surface,
} }
else if (inProbeConfigData[i].r == 1) //sphere 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) if (contribution[i]>0.0)
@ -593,7 +594,7 @@ vec4 debugVizForwardProbes(Surface surface,
} }
else if (inProbeConfigData[i].r == 1) //sphere 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) if (contribution[i] > 0.0)
probehits++; probehits++;
} }

View file

@ -352,10 +352,11 @@ float4 compute4Lights( Surface surface,
} }
//Probe IBL stuff //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; float3 L = (wsProbePosition.xyz - wsPosition);
float contribution = 1.0 - length(L) / radius; float innerRadius = radius-(radius*atten);
float contribution = 1.0-saturate(lerp(length(L), radius-innerRadius, atten)/radius);
return saturate(contribution); return saturate(contribution);
} }
@ -441,7 +442,7 @@ float4 computeForwardProbes(Surface surface,
} }
else if (inProbeConfigData[i].r == 1) //sphere 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) if (contribution[i]>0.0)
@ -599,7 +600,7 @@ float4 debugVizForwardProbes(Surface surface,
} }
else if (inProbeConfigData[i].r == 1) //sphere 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) if (contribution[i] > 0.0)
probehits++; probehits++;
} }

View file

@ -94,7 +94,7 @@ void main()
} }
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) if (contribution[i]>0.0)

View file

@ -83,12 +83,12 @@ float4 main(PFXVertToPix IN) : SV_TARGET
float atten =1.0-(length(eyePosWorld-probePosArray[i].xyz)/maxProbeDrawDistance); float atten =1.0-(length(eyePosWorld-probePosArray[i].xyz)/maxProbeDrawDistance);
if (probeConfigData[i].r == 0) //box if (probeConfigData[i].r == 0) //box
{ {
contribution[i] = defineBoxSpaceInfluence(surface.P, worldToObjArray[i], probeConfigData[i].b)*atten; 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) if (contribution[i]>0.0)