Skip to content
Snippets Groups Projects
Commit 6df96774 authored by Rye Mutt's avatar Rye Mutt :bread:
Browse files

Merge branch 'DRTVWR-559' of https://github.com/secondlife/viewer into cronchy

parents 9de87bc3 fcf9db88
No related branches found
No related tags found
2 merge requests!3Update to main branch,!2Rebase onto current main branch
Showing
with 138 additions and 123 deletions
......@@ -10674,7 +10674,7 @@
<key>Comment</key>
<string>Render influence volumes of Reflection Probes</string>
<key>Persist</key>
<integer>1</integer>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
......@@ -10869,16 +10869,27 @@
<key>Value</key>
<real>0</real>
</map>
<key>RenderAutomaticReflectionProbes</key>
<key>RenderDefaultProbeUpdatePeriod</key>
<map>
<key>Comment</key>
<string>Automatic reflection probes control. 0 - disable, 1 - Terrain/water only, 2- Terrain/water + objects. Requires restart.</string>
<string>When RenderReflectionProbeLevel is 0, amount of time in seconds to wait between updates to reflection map.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>20.0</real>
</map>
<key>RenderReflectionProbeLevel</key>
<map>
<key>Comment</key>
<string>Reflection probes control. 0 - disable (one probe to rule them all), 1 - manual probes only, 2 - manual + terrain/water, 3 - Manual + Terrain/water + objects.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>2</integer>
<integer>3</integer>
</map>
<key>RenderReflectionRes</key>
<map>
......
......@@ -122,6 +122,7 @@ bool shouldSampleProbe(int i, vec3 pos)
// populate "probeIndex" with N probe indices that influence pos where N is REF_SAMPLE_COUNT
void preProbeSample(vec3 pos)
{
#if REFMAP_LEVEL > 0
// TODO: make some sort of structure that reduces the number of distance checks
for (int i = 1; i < refmapCount; ++i)
{
......@@ -213,6 +214,9 @@ void preProbeSample(vec3 pos)
{ // probe at index 0 is a special probe for smoothing out automatic probes
probeIndex[probeInfluences++] = 0;
}
#else
probeIndex[probeInfluences++] = 0;
#endif
}
// from https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection
......
......@@ -245,20 +245,6 @@ void main()
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
#if 0 // wrong implementation
if (spec.a > 0.0) // specular reflection
{
float sa = dot(normalize(refnormpersp), light_dir.xyz);
vec3 dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
// add the two types of shiny together
vec3 spec_contrib = dumbshiny * spec.rgb;
color.rgb += spec_contrib;
// add radiance map
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
}
#else //right implementation (ported from pointLightF.glsl)
if (spec.a > 0.0)
{
vec3 lv = light_dir.xyz;
......@@ -283,7 +269,6 @@ void main()
// add radiance map
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
}
#endif
color.rgb = mix(color.rgb, baseColor.rgb, baseColor.a);
......
version 54
version 55
// The version number above should be incremented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
......@@ -62,6 +62,7 @@ Disregard96DefaultDrawDistance 1 1
RenderCompressTextures 1 1
RenderShaderLightingMaxLevel 1 3
RenderReflectionProbeCount 1 256
RenderReflectionProbeLevel 1 3
RenderDeferred 1 1
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
......@@ -102,6 +103,7 @@ WLSkyDetail 1 96
RenderFSAASamples 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 8
RenderReflectionProbeLevel 1 0
//
// Medium Low Graphics Settings
......@@ -130,6 +132,7 @@ WLSkyDetail 1 96
RenderFSAASamples 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 16
RenderReflectionProbeLevel 1 1
//
// Medium Graphics Settings (standard)
......@@ -158,6 +161,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 32
RenderReflectionProbeLevel 1 2
//
// Medium High Graphics Settings (deferred enabled)
......@@ -186,6 +190,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 1
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 64
RenderReflectionProbeLevel 1 2
//
// High Graphics Settings (deferred + SSAO)
......@@ -214,6 +219,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 1
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 128
RenderReflectionProbeLevel 1 3
//
// High Ultra Graphics Settings (deferred + SSAO + shadows)
......@@ -242,6 +248,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 1
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 256
RenderReflectionProbeLevel 1 3
//
// Ultra graphics (REALLY PURTY!)
......@@ -270,6 +277,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 1
RenderScreenSpaceReflections 1 1
RenderReflectionProbeCount 1 256
RenderReflectionProbeLevel 1 3
//
// Class Unknown Hardware (unknown)
......
version 49
version 50
// The version number above should be incremented IF AND ONLY IF some
// change has been made that is sufficiently important to justify
// resetting the graphics preferences of all users to the recommended
......@@ -72,7 +72,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 2
RenderScreenSpaceReflections 1 1
RenderReflectionProbeCount 1 256
RenderReflectionProbeResolution 1 128
RenderReflectionProbeLevel 1 3
//
// Low Graphics Settings
......@@ -101,6 +101,7 @@ RenderReflectionsEnabled 1 0
RenderReflectionProbeDetail 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 8
RenderReflectionProbeLevel 1 0
//
// Medium Low Graphics Settings
......@@ -129,6 +130,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 16
RenderReflectionProbeLevel 1 1
//
// Medium Graphics Settings (standard)
......@@ -157,6 +159,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 32
RenderReflectionProbeLevel 1 2
//
// Medium High Graphics Settings (deferred enabled)
......@@ -185,6 +188,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 64
RenderReflectionProbeLevel 1 2
//
// High Graphics Settings (deferred + SSAO)
......@@ -213,6 +217,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 1
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 128
RenderReflectionProbeLevel 1 3
//
// High Ultra Graphics Settings (deferred + SSAO + shadows)
......@@ -241,6 +246,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 1
RenderScreenSpaceReflections 1 0
RenderReflectionProbeCount 1 256
RenderReflectionProbeLevel 1 3
//
// Ultra graphics (REALLY PURTY!)
......@@ -269,6 +275,7 @@ RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 1
RenderScreenSpaceReflections 1 1
RenderReflectionProbeCount 1 256
RenderReflectionProbeLevel 1 3
//
// Class Unknown Hardware (unknown)
......
......@@ -263,6 +263,30 @@ bool LLReflectionMap::isActive()
return mCubeIndex != -1;
}
bool LLReflectionMap::isRelevant()
{
static LLCachedControl<S32> RenderReflectionProbeLevel(gSavedSettings, "RenderReflectionProbeLevel", 3);
if (mViewerObject && RenderReflectionProbeLevel > 0)
{ // not an automatic probe
return true;
}
if (RenderReflectionProbeLevel == 3)
{ // all automatics are relevant
return true;
}
if (RenderReflectionProbeLevel == 2)
{ // terrain and water only, ignore probes that have a group
return !mGroup;
}
// no automatic probes, yes manual probes
return mViewerObject != nullptr;
}
void LLReflectionMap::doOcclusion(const LLVector4a& eye)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
......
......@@ -72,6 +72,9 @@ class alignas(16) LLReflectionMap : public LLRefCount
// perform occlusion query/readback
void doOcclusion(const LLVector4a& eye);
// return false if this probe isn't currently relevant (for example, disabled due to graphics preferences)
bool isRelevant();
// point at which environment map was last generated from (in agent space)
LLVector4a mOrigin;
......
......@@ -173,6 +173,8 @@ void LLReflectionMapManager::update()
bool did_update = false;
static LLCachedControl<S32> sDetail(gSavedSettings, "RenderReflectionProbeDetail", -1);
static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3);
bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
LLReflectionMap* closestDynamic = nullptr;
......@@ -198,6 +200,11 @@ void LLReflectionMapManager::update()
continue;
}
if (probe != mDefaultProbe && !probe->isRelevant())
{
continue;
}
probe->mProbeIndex = i;
LLVector4a d;
......@@ -270,6 +277,13 @@ void LLReflectionMapManager::update()
mRadiancePass = radiance_pass;
}
static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 20.f);
if (sLevel == 0 &&
gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime < sUpdatePeriod)
{ // when probes are disabled don't update the default probe more often than once every 20 seconds
oldestProbe = nullptr;
}
// switch to updating the next oldest probe
if (!did_update && oldestProbe != nullptr)
{
......@@ -360,17 +374,13 @@ void LLReflectionMapManager::getReflectionMaps(std::vector<LLReflectionMap*>& ma
LLReflectionMap* LLReflectionMapManager::registerSpatialGroup(LLSpatialGroup* group)
{
static LLCachedControl<S32> automatic_probes(gSavedSettings, "RenderAutomaticReflectionProbes", 2);
if (automatic_probes > 1)
if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_VOLUME)
{
if (group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_VOLUME)
OctreeNode* node = group->getOctreeNode();
F32 size = node->getSize().getF32ptr()[0];
if (size >= 15.f && size <= 17.f)
{
OctreeNode* node = group->getOctreeNode();
F32 size = node->getSize().getF32ptr()[0];
if (size >= 15.f && size <= 17.f)
{
return addProbe(group);
}
return addProbe(group);
}
}
......
......@@ -77,6 +77,7 @@ class alignas(16) LLReflectionMapManager
// presently hacked into LLViewerObject::setTE
// Used by LLViewerObjects that are Reflection Probes
// vobj must not be null
// Guaranteed to not return null
LLReflectionMap* registerViewerObject(LLViewerObject* vobj);
......
......@@ -449,6 +449,7 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
gPipeline.releaseGLBuffers();
gPipeline.createGLBuffers();
LLViewerShaderMgr::instance()->setShaders();
gPipeline.mReflectionMapManager.reset();
}
return true;
}
......@@ -686,7 +687,7 @@ void settings_setup_listeners()
// [SL:KB] - Patch: Settings-RenderResolutionMultiplier | Checked: Catznip-5.4
setting_setup_signal_listener(gSavedSettings, "RenderResolutionMultiplier", handleRenderResolutionDivisorChanged);
// [/SL:KB]
//setting_setup_signal_listener(gSavedSettings, "RenderWaterRefResolution", handleReleaseGLBufferChanged); // DEPRECATED
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);
setting_setup_signal_listener(gSavedSettings, "RenderScreenSpaceReflections", handleReflectionProbeDetailChanged);
......
......@@ -1303,43 +1303,40 @@ U32 LLViewerRegion::getNumOfVisibleGroups() const
void LLViewerRegion::updateReflectionProbes()
{
static LLCachedControl<S32> automatic_probes(gSavedSettings, "RenderAutomaticReflectionProbes", 2);
if (automatic_probes > 0)
{
const F32 probe_spacing = 32.f;
const F32 probe_radius = sqrtf((probe_spacing * 0.5f) * (probe_spacing * 0.5f) * 3.f);
const F32 hover_height = 2.f;
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
const F32 probe_spacing = 32.f;
const F32 probe_radius = sqrtf((probe_spacing * 0.5f) * (probe_spacing * 0.5f) * 3.f);
const F32 hover_height = 2.f;
F32 start = probe_spacing * 0.5f;
F32 start = probe_spacing * 0.5f;
U32 grid_width = REGION_WIDTH_METERS / probe_spacing;
U32 grid_width = REGION_WIDTH_METERS / probe_spacing;
mReflectionMaps.resize(grid_width * grid_width);
mReflectionMaps.resize(grid_width * grid_width);
F32 water_height = getWaterHeight();
LLVector3 origin = getOriginAgent();
F32 water_height = getWaterHeight();
LLVector3 origin = getOriginAgent();
for (U32 i = 0; i < grid_width; ++i)
for (U32 i = 0; i < grid_width; ++i)
{
F32 x = i * probe_spacing + start;
for (U32 j = 0; j < grid_width; ++j)
{
F32 x = i * probe_spacing + start;
for (U32 j = 0; j < grid_width; ++j)
{
F32 y = j * probe_spacing + start;
F32 y = j * probe_spacing + start;
U32 idx = i * grid_width + j;
U32 idx = i * grid_width + j;
if (mReflectionMaps[idx].isNull())
{
mReflectionMaps[idx] = gPipeline.mReflectionMapManager.addProbe();
}
if (mReflectionMaps[idx].isNull())
{
mReflectionMaps[idx] = gPipeline.mReflectionMapManager.addProbe();
}
LLVector3 probe_origin = LLVector3(x, y, llmax(water_height, mImpl->mLandp->resolveHeightRegion(x, y)));
probe_origin.mV[2] += hover_height;
probe_origin += origin;
LLVector3 probe_origin = LLVector3(x, y, llmax(water_height, mImpl->mLandp->resolveHeightRegion(x, y)));
probe_origin.mV[2] += hover_height;
probe_origin += origin;
mReflectionMaps[idx]->mOrigin.load3(probe_origin.mV);
mReflectionMaps[idx]->mRadius = probe_radius;
}
mReflectionMaps[idx]->mOrigin.load3(probe_origin.mV);
mReflectionMaps[idx]->mRadius = probe_radius;
}
}
}
......
......@@ -673,6 +673,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
bool has_reflection_probes = gSavedSettings.getBOOL("RenderReflectionsEnabled") && gGLManager.mGLVersion > 3.99f;
S32 probe_count = llclamp(gSavedSettings.getS32("RenderReflectionProbeCount"), 1, LL_MAX_REFLECTION_PROBE_COUNT);
S32 probe_level = llclamp(gSavedSettings.getS32("RenderReflectionProbeLevel"), 0, 3);
if (ambient_kill)
{
......@@ -709,6 +710,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
if (has_reflection_probes)
{
attribs["REFMAP_COUNT"] = std::to_string(probe_count);
attribs["REFMAP_LEVEL"] = std::to_string(probe_level);
attribs["REF_SAMPLE_COUNT"] = "32";
}
......
......@@ -682,27 +682,13 @@
value="2"/>
</combo_box>
<check_box
control_name="RenderReflectionsEnabled"
height="16"
initial_value="true"
label="Reflections"
layout="topleft"
left="420"
name="ReflectionsEnabled"
top_delta="16"
width="240">
<check_box.commit_callback
function="Pref.RenderOptionUpdate" />
</check_box>
<check_box
control_name="RenderScreenSpaceReflections"
height="16"
initial_value="true"
label="Screen Space Reflections"
layout="topleft"
left="440"
left="420"
name="ScreenSpaceReflections"
top_delta="16"
width="240">
......@@ -716,7 +702,7 @@
follows="left|top"
height="16"
layout="topleft"
left="440"
left="420"
name="ReflectionDetailText"
text_readonly_color="LabelDisabledColor"
top_delta="16"
......@@ -728,7 +714,7 @@
control_name="RenderReflectionProbeDetail"
height="18"
layout="topleft"
left_delta="110"
left_delta="130"
top_delta="0"
name="ReflectionDetail"
width="150">
......@@ -746,7 +732,6 @@
value="2"/>
</combo_box>
<text
type="string"
length="1"
......@@ -754,63 +739,40 @@
height="16"
layout="topleft"
left="420"
name="RenderTonemapperText"
name="ReflectionProbeText"
text_readonly_color="LabelDisabledColor"
top_delta="24"
top_delta="16"
width="128">
Tonemapper:
Reflection Coverage:
</text>
<combo_box
control_name="RenderToneMapType"
control_name="RenderReflectionProbeLevel"
height="18"
layout="topleft"
left_delta="130"
top_delta="0"
name="ToneMapper"
name="ReflectionLevel"
width="150">
<combo_box.item
label="Linear"
name="toneLinear"
value="1" />
<combo_box.item
label="Reinhard"
name="toneReinhard"
value="2" />
<combo_box.item
label="Reinhard2"
name="toneReinhard2"
value="3" />
<combo_box.item
label="Filmic"
name="toneFilmic"
value="4" />
<combo_box.item
label="Unreal"
name="toneUnreal"
value="5" />
<combo_box.item
label="ACES Narkowicz"
name="toneACES"
value="6" />
<combo_box.item
label="ACES Hill"
name="toneACES"
value="10" />
<combo_box.item
label="Uchimura"
name="toneUchimura"
value="7" />
<combo_box.item
label="AMD Tonemapper"
name="toneAMD"
value="8" />
<combo_box.item
label="Uncharted"
name="toneUncharted"
value="9" />
<combo_box.item
label="None"
name="0"
value="0"/>
<combo_box.item
label="Manual only"
name="1"
value="1"/>
<combo_box.item
label="Manual + terrain and water"
name="2"
value="2"/>
<combo_box.item
label="Full scene"
name="3"
value="3"/>
</combo_box>
<slider
<slider
control_name="RenderExposure"
decimal_digits="1"
follows="left|top"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment