Corrected box influence logic for probes to accommodate rotations.

Also uncommented line so probe transform is passed along to the render manager.
This commit is contained in:
Areloch 2018-10-16 16:18:22 -05:00
parent aad37bc0f5
commit ef81708e12
3 changed files with 20 additions and 33 deletions

View file

@ -470,7 +470,7 @@ void ReflectionProbe::updateProbeParams()
mProbeInfo->mProbeShapeType = mProbeShapeType;
//mProbeInfo->mTransform = getWorldTransform();
mProbeInfo->mTransform = getWorldTransform();
mProbeInfo->setPosition(getPosition());
//Point3F pos = mProbeInfo->mTransform.getPosition();

View file

@ -117,20 +117,22 @@ float defineSphereSpaceInfluence(vec3 centroidPosVS, float rad, vec2 atten, vec3
return saturate( nDotL * attn );
}
float defineBoxSpaceInfluence(vec3 surfPosWS, vec3 probePos, float rad, vec2 atten) //atten currently unused
float defineBoxSpaceInfluence(vec3 surfPosWS, vec3 probePos, float radius, float atten)
{
vec3 surfPosLS = mul( worldToObj, vec4(surfPosWS,1.0)).xyz;
vec3 lsBoxMin = mul(worldToObj, vec4(boxMin,1)).xyz;
vec3 lsBoxMax = mul(worldToObj, vec4(boxMax,1)).xyz;
vec3 boxMinLS = probePos-(vec3(1,1,1)*radius);
vec3 boxMaxLS = probePos+(vec3(1,1,1)*radius);
float boxOuterRange = length(lsBoxMax - lsBoxMin);
float boxInnerRange = boxOuterRange / 3.5;
float boxInnerRange = boxOuterRange / atten;
vec3 localDir = vec3(abs(surfPosLS.x), abs(surfPosLS.y), abs(surfPosLS.z));
localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange);
return max(localDir.x, max(localDir.y, localDir.z));
float influenceVal = max(localDir.x, max(localDir.y, localDir.z)) * -1;
return influenceVal;
}
float defineDepthInfluence(vec3 probePosWS, vec3 surfPosWS, samplerCube radianceCube)
@ -190,18 +192,8 @@ void main()
}
else
{
if(worldPos.x > bbMax.x || worldPos.y > bbMax.y || worldPos.z > bbMax.z ||
worldPos.x < bbMin.x || worldPos.y < bbMin.y || worldPos.z < bbMin.z)
{
OUT_col = vec4(0.0);
OUT_col1 = vec4(0.0);
return;
}
blendVal = defineBoxSpaceInfluence(worldPos, probeWSPos, bbMin, bbMax, attenuation);
//flip it around
blendVal *= -1;
float tempAttenVal = 3.5;
blendVal = defineBoxSpaceInfluence(worldPos, probeWSPos, radius, tempAttenVal);
}
if (blendVal<0)
{

View file

@ -125,20 +125,22 @@ float defineSphereSpaceInfluence(float3 centroidPosVS, float rad, float2 atten,
return saturate( nDotL * attn );
}
float defineBoxSpaceInfluence(float3 surfPosWS, float3 probePos, float3 boxMin, float3 boxMax, float2 atten)
float defineBoxSpaceInfluence(float3 surfPosWS, float3 probePos, float radius, float atten)
{
float3 surfPosLS = mul( worldToObj, float4(surfPosWS,1.0)).xyz;
float3 lsBoxMin = mul(worldToObj, float4(boxMin,1)).xyz;
float3 lsBoxMax = mul(worldToObj, float4(boxMax,1)).xyz;
float3 boxMinLS = probePos-(float3(1,1,1)*radius);
float3 boxMaxLS = probePos+(float3(1,1,1)*radius);
float boxOuterRange = length(lsBoxMax - lsBoxMin);
float boxInnerRange = boxOuterRange / 3.5;
float boxOuterRange = length(boxMaxLS - boxMinLS);
float boxInnerRange = boxOuterRange / atten;
float3 localDir = float3(abs(surfPosLS.x), abs(surfPosLS.y), abs(surfPosLS.z));
localDir = (localDir - boxInnerRange) / (boxOuterRange - boxInnerRange);
return max(localDir.x, max(localDir.y, localDir.z));
float influenceVal = max(localDir.x, max(localDir.y, localDir.z)) * -1;
return influenceVal;
}
float defineDepthInfluence(float3 probePosWS, float3 surfPosWS, TORQUE_SAMPLERCUBE(radianceCube))
@ -192,15 +194,8 @@ PS_OUTPUT main( ConvexConnectP IN )
}
else
{
if(worldPos.x > bbMax.x || worldPos.y > bbMax.y || worldPos.z > bbMax.z ||
worldPos.x < bbMin.x || worldPos.y < bbMin.y || worldPos.z < bbMin.z)
clip(-1);
blendVal = defineBoxSpaceInfluence(worldPos, probeWSPos, bbMin, bbMax, attenuation);
//flip it around
blendVal *= -1;
//blendVal = defineBoxSpaceInfluence(worldPos, probeWSPos, radius*2, attenuation);
float tempAttenVal = 3.5;
blendVal = defineBoxSpaceInfluence(worldPos, probeWSPos, radius, tempAttenVal);
}
clip(blendVal);