summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/app_settings/settings.xml11
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl145
-rw-r--r--indra/newview/pipeline.cpp3
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml9
4 files changed, 166 insertions, 2 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 3bd49b7c4e..ac449e45ef 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10239,6 +10239,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderReflectionProbeVolumes</key>
+ <map>
+ <key>Comment</key>
+ <string>Render influence volumes of Reflection Probes</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderMaxPartCount</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
index 977b2e6b24..865b7e7a47 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
@@ -262,6 +262,40 @@ vec3 sphereIntersect(vec3 origin, vec3 dir, vec3 center, float radius2)
return v;
}
+void swap(inout float a, inout float b)
+{
+ float t = a;
+ a = b;
+ b = a;
+}
+
+// debug implementation, make no assumptions about origin
+bool sphereIntersectDebug(vec3 origin, vec3 dir, vec3 center, float radius2, out float t)
+{
+ float t0, t1; // solutions for t if the ray intersects
+
+ // geometric solution
+ vec3 L = center - origin;
+ float tca = dot(L, dir);
+ // if (tca < 0) return false;
+ float d2 = dot(L, L) - tca * tca;
+ if (d2 > radius2) return false;
+ float thc = sqrt(radius2 - d2);
+ t0 = tca - thc;
+ t1 = tca + thc;
+
+ if (t0 > t1) swap(t0, t1);
+
+ if (t0 < 0) {
+ t0 = t1; // if t0 is negative, let's use t1 instead
+ if (t0 < 0) return false; // both t0 and t1 are negative
+ }
+
+ t = t0;
+
+ return true;
+}
+
// from https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
/*
vec3 DirectionWS = normalize(PositionWS - CameraWS);
@@ -310,6 +344,48 @@ vec3 boxIntersect(vec3 origin, vec3 dir, int i)
return IntersectPositionCS;
}
+// cribbed from https://iquilezles.org/articles/intersectors/
+// axis aligned box centered at the origin, with size boxSize
+bool boxIntersectionDebug( in vec3 ro, in vec3 p, vec3 boxSize, out bool behind)
+{
+ vec3 rd = normalize(p-ro);
+
+ vec3 m = 1.0/rd; // can precompute if traversing a set of aligned boxes
+ vec3 n = m*ro; // can precompute if traversing a set of aligned boxes
+ vec3 k = abs(m)*boxSize;
+ vec3 t1 = -n - k;
+ vec3 t2 = -n + k;
+ float tN = max( max( t1.x, t1.y ), t1.z );
+ float tF = min( min( t2.x, t2.y ), t2.z );
+ if( tN>tF || tF<0.0) return false; // no intersection
+
+ float t = tN < 0 ? tF : tN;
+
+ vec3 v = ro + rd * t;
+
+ v -= ro;
+ vec3 pos = p - ro;
+
+ behind = dot(v,v) > dot(pos,pos);
+
+ return true;
+}
+
+bool boxIntersectDebug(vec3 origin, vec3 pos, int i, out bool behind)
+{
+ mat4 clipToLocal = refBox[i];
+
+ // transform into unit cube space
+ origin = (clipToLocal * vec4(origin, 1.0)).xyz;
+ pos = (clipToLocal * vec4(pos, 1.0)).xyz;
+
+ if (boxIntersectionDebug(origin, pos, vec3(1), behind))
+ {
+ return true;
+ }
+
+ return false;
+}
// Tap a reflection probe
@@ -518,11 +594,76 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
glossenv = sampleProbes(pos, normalize(refnormpersp), lod, errorCorrect);
}
+void debugTapRefMap(vec3 pos, vec3 dir, float depth, int i, inout vec4 col)
+{
+ vec3 origin = vec3(0,0,0);
+
+ bool manual_probe = abs(refIndex[i].w) > 2;
+
+ if (refIndex[i].w < 0)
+ {
+ vec3 v;
+ bool behind;
+
+ if (boxIntersectDebug(origin, pos, i, behind))
+ {
+ float w = 0.5;
+ if (behind)
+ {
+ w *= 0.5;
+ col += vec4(0,0,w,w);
+ }
+ else
+ {
+ col += vec4(w,w,0,w);
+ }
+ }
+ }
+ else
+ {
+ float r = refSphere[i].w; // radius of sphere volume
+ float rr = r * r; // radius squared
+
+ float t = 0.0;
+
+ if (sphereIntersectDebug(origin, dir, refSphere[i].xyz, rr, t))
+ {
+ if (t > depth)
+ {
+ float w = 0.25/((t-depth)*0.125 + 1.0);
+
+ if (manual_probe)
+ {
+ col += vec4(0, 0, w, w);
+ }
+ }
+ else
+ {
+ if (manual_probe)
+ {
+ float w = 0.5;
+
+ col += vec4(w,w,0,w);
+ }
+ }
+ }
+ }
+}
+
vec4 sampleReflectionProbesDebug(vec3 pos)
{
- preProbeSample(pos);
+ vec4 col = vec4(0,0,0,0);
+
+ vec3 dir = normalize(pos);
+
+ float d = length(pos);
- return vec4(probeInfluences*0.25, 0, 0, probeInfluences*0.25);
+ for (int i = 1; i < refmapCount; ++i)
+ {
+ debugTapRefMap(pos, dir, d, i, col);
+ }
+
+ return col;
}
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 9d792d0801..7bc819d553 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -5237,7 +5237,10 @@ void LLPipeline::renderDebug()
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_REFLECTION_PROBES) && !hud_only)
{
mReflectionMapManager.renderDebug();
+ }
+ if (gSavedSettings.getBOOL("RenderReflectionProbeVolumes"))
+ {
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("probe debug display");
bindDeferredShader(gReflectionProbeDisplayProgram, NULL);
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index bb9aab9ec0..2512fadec7 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1465,6 +1465,15 @@ function="World.EnvPreset"
function="Tools.ShowSelectionLightRadius" />
</menu_item_check>
<menu_item_check
+ label="Show Reflection Probe Volumes"
+ name="Show Reflection Probe Volumes">
+ <menu_item_check.on_check
+ control="RenderReflectionProbeVolumes" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="RenderReflectionProbeVolumes" />
+ </menu_item_check>
+ <menu_item_check
label="Show Selection Beam"
name="Show Selection Beam">
<menu_item_check.on_check