Fixes for switching between atmospherics implementations on the fly.

meow-7.2.2
Graham Linden 2018-09-10 20:39:48 +01:00
parent e5c0022a7c
commit 642a4ddd60
8 changed files with 90 additions and 21 deletions

View File

@ -24,7 +24,7 @@
*/
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_data[4];
out vec4 frag_data[3];
#else
#define frag_data gl_FragData
#endif

View File

@ -163,7 +163,7 @@ void LLDrawPoolWLSky::renderDome(const LLVector3& camPosLocal, F32 camHeightLoca
void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 camHeightLocal) const
{
if (gPipeline.useAdvancedAtmospherics() && gPipeline.canUseWindLightShaders() && gAtmosphere)
if (gPipeline.useAdvancedAtmospherics() && gPipeline.canUseWindLightShaders())
{
sky_shader->bind();
@ -192,7 +192,7 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca
sky_shader->uniform3f(sCamPosLocal, camPosLocal.mV[0], camPosLocal.mV[1], camPosLocal.mV[2]);
renderFsSky(camPosLocal, camHeightLocal, sky_shader);
sky_shader->unbind();
}
}
@ -497,18 +497,22 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass)
if (gPipeline.canUseWindLightShaders())
{
if (gPipeline.useAdvancedAtmospherics())
{
renderSkyHazeDeferred(origin, camHeightLocal);
renderHeavenlyBodies();
}
else
{
// Disable depth-test for sky, but re-enable depth writes for the cloud
// rendering below so the cloud shader can write out depth for the stars to test against
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
renderSkyHaze(origin, camHeightLocal);
renderHeavenlyBodies();
if (gPipeline.useAdvancedAtmospherics())
{
//LLGLSquashToFarClip far_clip(get_current_projection());
renderSkyHazeDeferred(origin, camHeightLocal);
}
else
{
// Disable depth-test for sky, but re-enable depth writes for the cloud
// rendering below so the cloud shader can write out depth for the stars to test against
renderSkyHaze(origin, camHeightLocal);
}
renderHeavenlyBodies();
}
renderSkyClouds(origin, camHeightLocal);
}

View File

@ -62,6 +62,8 @@
#include "llenvironment.h"
#include "lltrans.h"
#pragma optimize("", off)
extern LLControlGroup gSavedSettings;
//=========================================================================
@ -198,9 +200,33 @@ BOOL LLFloaterEditExtDayCycle::postBuild()
LLTabContainer* tab_container = mSkyTabLayoutContainer->getChild<LLTabContainer>("sky_tabs");
S32 tab_count = tab_container->getTabCount();
LLSettingsEditPanel *panel = nullptr;
// Add or remove density tab as necessary
// Must be before operation on all tabs below
if (gSavedSettings.getBOOL("RenderUseAdvancedAtmospherics"))
{
panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("panel_settings_sky_density"));
if (!panel)
{
panel = new LLPanelSettingsSkyDensityTab;
panel->buildFromFile("panel_settings_sky_density.xml");
tab_container->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(false));
}
}
else
{
panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("panel_settings_sky_density"));
if (panel)
{
tab_container->removeTabPanel(panel);
}
delete panel;
}
for (S32 idx = 0; idx < tab_count; ++idx)
{
LLSettingsEditPanel *panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
panel = static_cast<LLSettingsEditPanel *>(tab_container->getPanelByIndex(idx));
if (panel)
panel->setOnDirtyFlagChanged([this](LLPanel *, bool val) { onPanelDirtyFlagChanged(val); });
}
@ -813,7 +839,7 @@ void LLFloaterEditExtDayCycle::updateWaterTabs(const LLSettingsWaterPtr_t &p_wat
void LLFloaterEditExtDayCycle::updateSkyTabs(const LLSettingsSkyPtr_t &p_sky)
{
LLView* tab_container = mSkyTabLayoutContainer->getChild<LLView>(TABS_SKYS); //can't extract panels directly, since they are in 'tuple'
LLTabContainer* tab_container = mSkyTabLayoutContainer->getChild<LLTabContainer>(TABS_SKYS); //can't extract panels directly, since they are in 'tuple'
LLPanelSettingsSky* panel;
panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("atmosphere_panel"));
@ -831,6 +857,29 @@ void LLFloaterEditExtDayCycle::updateSkyTabs(const LLSettingsSkyPtr_t &p_sky)
{
panel->setSky(p_sky);
}
if (gSavedSettings.getBOOL("RenderUseAdvancedAtmospherics"))
{
panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("panel_settings_sky_density"));
if (!panel)
{
panel = new LLPanelSettingsSkyDensityTab;
panel->buildFromFile("panel_settings_sky_density.xml");
panel->setOnDirtyFlagChanged([this](LLPanel *, bool value) { onPanelDirtyFlagChanged(value); });
tab_container->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(false));
}
panel->setSky(std::static_pointer_cast<LLSettingsSky>(p_sky));
}
else
{
panel = dynamic_cast<LLPanelSettingsSky*>(tab_container->getChildView("panel_settings_sky_density"));
if (panel)
{
tab_container->removeTabPanel(panel);
}
delete panel;
}
}
void LLFloaterEditExtDayCycle::updateButtons()

View File

@ -55,6 +55,8 @@
#include "llsettingsvo.h"
#include "llinventorymodel.h"
#pragma optimize("", off)
extern LLControlGroup gSavedSettings;
namespace

View File

@ -410,6 +410,17 @@ static bool handleRenderDeferredChanged(const LLSD& newvalue)
return true;
}
static bool handleRenderUseAdvancedAtmosphericsChanged(const LLSD& newvalue)
{
if (gPipeline.isInit())
{
LLPipeline::refreshCachedSettings();
// Need to reload shaders when changing atmospherics implementations...
LLViewerShaderMgr::instance()->setShaders();
}
return true;
}
// This looks a great deal like handleRenderDeferredChanged because
// Advanced Lighting (Materials) implies bumps and shiny so disabling
// bumps should further disable that feature.
@ -644,6 +655,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2));
gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2));
gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2));
gSavedSettings.getControl("RenderUseAdvancedAtmospherics")->getSignal()->connect(boost::bind(&handleRenderUseAdvancedAtmosphericsChanged, _2));
gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));

View File

@ -2139,7 +2139,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyF.glsl", GL_FRAGMENT_SHADER_ARB));
gDeferredWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_WINDLIGHT];
gDeferredWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY;
if (mVertexShaderLevel[SHADER_WINDLIGHT] >= 3)
if (mVertexShaderLevel[SHADER_WINDLIGHT] > 1)
{
gDeferredWLSkyProgram.mExtraLinkObject = gAtmosphere->getAtmosphericShaderForLink();
}
@ -3537,13 +3537,13 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
return TRUE;
}
if (mVertexShaderLevel[SHADER_WINDLIGHT] >= 3)
if (mVertexShaderLevel[SHADER_WINDLIGHT] > 1)
{
// Prepare precomputed atmospherics textures using libatmosphere
LLAtmosphere::initClass();
}
if (success && (mVertexShaderLevel[SHADER_WINDLIGHT] < 3))
if (success)
{
gWLSkyProgram.mName = "Windlight Sky Shader";
//gWLSkyProgram.mFeatures.hasGamma = true;
@ -3567,7 +3567,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
success = gWLCloudProgram.createShader(NULL, NULL);
}
if (success && (mVertexShaderLevel[SHADER_WINDLIGHT] < 3))
if (success)
{
gWLSunProgram.mName = "Windlight Sun Program";
gWLSunProgram.mShaderFiles.clear();
@ -3585,7 +3585,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
success = gWLSunProgram.createShader(NULL, NULL);
}
if (success && (mVertexShaderLevel[SHADER_WINDLIGHT] < 3))
if (success)
{
gWLMoonProgram.mName = "Windlight Moon Program";
gWLMoonProgram.mShaderFiles.clear();

View File

@ -1048,7 +1048,7 @@ void LLPipeline::refreshCachedSettings()
RenderAvatarVP = gSavedSettings.getBOOL("RenderAvatarVP");
WindLightUseAtmosShaders = gSavedSettings.getBOOL("WindLightUseAtmosShaders");
RenderDeferred = gSavedSettings.getBOOL("RenderDeferred");
sUseAdvancedAtmospherics = gSavedSettings.getBOOL("RenderUseAdvancedAtmospherics");
sUseAdvancedAtmospherics = WindLightUseAtmosShaders && gSavedSettings.getBOOL("RenderUseAdvancedAtmospherics");
RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
RenderFSAASamples = gSavedSettings.getU32("RenderFSAASamples");
RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");

View File

@ -520,6 +520,7 @@ Select a key frame from the timeline above to edit settings.
left_delta="0"
top_pad="5"
name="moon_panel" />
<!-- added programatically so it doesn't show up whether we want it or not
<panel
border="true"
class="panel_settings_density"
@ -529,6 +530,7 @@ Select a key frame from the timeline above to edit settings.
left_delta="0"
top_pad="5"
name="density_panel" />
-->
</tab_container>
</layout_panel>
</layout_stack>