diff --git a/indra/newview/alcontrolcache.cpp b/indra/newview/alcontrolcache.cpp index f07ea55c93892694a7b14c33b6d5ecd33ca3f8be..94404221d66eb22a3a813bd0cab9e230f2e2f54f 100644 --- a/indra/newview/alcontrolcache.cpp +++ b/indra/newview/alcontrolcache.cpp @@ -27,7 +27,6 @@ bool ALControlCache::SnapEnabled; S32 ALControlCache::ToastGap; F32 ALControlCache::YawFromMousePosition = 90.f; F32 ALControlCache::PitchFromMousePosition = 90.f; -U32 ALControlCache::RenderToneMapType = 0; #define DECLARE_CTRL(ctrl, type, ctrl_type) \ @@ -81,6 +80,4 @@ void ALControlCache::initControls() DECLARE_CTRL_S32(ToastGap); DECLARE_CTRL_F32(YawFromMousePosition); DECLARE_CTRL_F32(PitchFromMousePosition); - - DECLARE_CTRL_U32(RenderToneMapType); } diff --git a/indra/newview/alcontrolcache.h b/indra/newview/alcontrolcache.h index a5c4715f1a6fbfb5d3fc560d66dd9f0448f6e74c..44b6fa2aae488f38a7f136681fad76b3c1473db9 100644 --- a/indra/newview/alcontrolcache.h +++ b/indra/newview/alcontrolcache.h @@ -29,7 +29,6 @@ struct ALControlCache static S32 ToastGap; static F32 YawFromMousePosition; static F32 PitchFromMousePosition; - static U32 RenderToneMapType; }; #endif \ No newline at end of file diff --git a/indra/newview/alfloaterlightbox.cpp b/indra/newview/alfloaterlightbox.cpp index 13636e98fb1149de1eec2306befae108ba65056c..e3385bba452712bbd8d99f7ec72df6bc3e5141f3 100644 --- a/indra/newview/alfloaterlightbox.cpp +++ b/indra/newview/alfloaterlightbox.cpp @@ -31,6 +31,7 @@ #include "llviewerprecompiledheaders.h" #include "alfloaterlightbox.h" +#include "alrenderutils.h" #include "llviewercontrol.h" #include "llspinctrl.h" #include "llsliderctrl.h" @@ -43,23 +44,26 @@ ALFloaterLightBox::ALFloaterLightBox(const LLSD& key) mCommitCallbackRegistrar.add("LightBox.ResetControlDefault", std::bind(&ALFloaterLightBox::onClickResetControlDefault, this, std::placeholders::_2)); mCommitCallbackRegistrar.add("LightBox.ResetGroupDefault", std::bind(&ALFloaterLightBox::onClickResetGroupDefault, this, std::placeholders::_2)); mCommitCallbackRegistrar.add("LightBox.CASSelect", boost::bind(&ALFloaterLightBox::updateCAS, this)); - mCommitCallbackRegistrar.add("LightBox.TonemapperSelect", boost::bind(&ALFloaterLightBox::updateTonemapper, this)); - mCommitCallbackRegistrar.add("LightBox.TonemapperCommit", std::bind(&ALFloaterLightBox::commitTonemapper, this, std::placeholders::_2)); mCommitCallbackRegistrar.add("LightBox.CASCommit", std::bind(&ALFloaterLightBox::commitCAS, this, std::placeholders::_2)); mCommitCallbackRegistrar.add("LightBox.SSAOCommit", std::bind(&ALFloaterLightBox::commitSSAO, this, std::placeholders::_2)); } +ALFloaterLightBox::~ALFloaterLightBox() +{ + mTonemapConnection.disconnect(); +} + BOOL ALFloaterLightBox::postBuild() { + updateTonemapper(); + mTonemapConnection = gSavedSettings.getControl("RenderToneMapType")->getSignal()->connect([&](LLControlVariable* control, const LLSD&, const LLSD&){ updateTonemapper(); }); return TRUE; } void ALFloaterLightBox::draw() { - updateTonemapper(); updateSSAO(); updateCAS(); - LLFloater::draw(); } @@ -76,10 +80,9 @@ void ALFloaterLightBox::onClickResetControlDefault(const LLSD& userdata) void ALFloaterLightBox::onClickResetGroupDefault(const LLSD& userdata) { const std::string& setting_group = userdata.asString(); - LLControlVariable* controlp = nullptr; if (setting_group == "sharpen") { - controlp = gSavedSettings.getControl("RenderSharpenMethod"); + LLControlVariable* controlp = gSavedSettings.getControl("RenderSharpenMethod"); if (controlp) { controlp->resetToDefault(true); @@ -89,7 +92,7 @@ void ALFloaterLightBox::onClickResetGroupDefault(const LLSD& userdata) { controlp->resetToDefault(true); } - controlp = gSavedSettings.getControl("RenderSharpenDLSParams"); + controlp = gSavedSettings.getControl("RenderSharpenDLSParams"); if (controlp) { controlp->resetToDefault(true); @@ -97,412 +100,400 @@ void ALFloaterLightBox::onClickResetGroupDefault(const LLSD& userdata) } else if (setting_group == "tonemap") { - controlp = gSavedSettings.getControl("RenderToneMapType"); - if (controlp) { - controlp->resetToDefault(true); + LLControlVariable* controlp = gSavedSettings.getControl("RenderExposure"); + if (controlp) + { + controlp->resetToDefault(true); + } } - controlp = gSavedSettings.getControl("RenderExposure"); - if (controlp) + + U32 tone_map_type = gSavedSettings.getU32("RenderToneMapType"); + switch (tone_map_type) { - controlp->resetToDefault(true); + case ALRenderUtil::TONEMAP_AMD: + { + LLControlVariable* controlp = gSavedSettings.getControl("AlchemyToneMapAMDHDRMax"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapAMDContrast"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapAMDShoulder"); + if (controlp) + { + controlp->resetToDefault(true); + } + break; + } + case ALRenderUtil::TONEMAP_UCHIMURA: + { + LLControlVariable* controlp = gSavedSettings.getControl("AlchemyToneMapUchimuraMaxBrightness"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapUchimuraContrast"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapUchimuraLinearStart"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapUchimuraLinearLength"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapUchimuraBlackLevel"); + if (controlp) + { + controlp->resetToDefault(true); + } + break; + } + case ALRenderUtil::TONEMAP_UNCHARTED: + { + LLControlVariable* controlp = gSavedSettings.getControl("AlchemyToneMapFilmicToeStr"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapFilmicToeLen"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapFilmicShoulderStr"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapFilmicShoulderLen"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapFilmicShoulderAngle"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapFilmicGamma"); + if (controlp) + { + controlp->resetToDefault(true); + } + controlp = gSavedSettings.getControl("AlchemyToneMapFilmicWhitePoint"); + if (controlp) + { + controlp->resetToDefault(true); + } + break; + } } - controlp = gSavedSettings.getControl("RenderToneMapUchimuraA"); - if (controlp) - { - controlp->resetToDefault(true); - } - controlp = gSavedSettings.getControl("RenderToneMapUchimuraB"); - if (controlp) - { - controlp->resetToDefault(true); - } - controlp = gSavedSettings.getControl("RenderToneMapLottesA"); - if (controlp) - { - controlp->resetToDefault(true); - } - controlp = gSavedSettings.getControl("RenderToneMapLottesB"); - if (controlp) - { - controlp->resetToDefault(true); - } - controlp = gSavedSettings.getControl("RenderToneMapUnchartedA"); - if (controlp) - { - controlp->resetToDefault(true); - } - controlp = gSavedSettings.getControl("RenderToneMapUnchartedB"); - if (controlp) - { - controlp->resetToDefault(true); - } - controlp = gSavedSettings.getControl("RenderToneMapUnchartedC"); - if (controlp) - { - controlp->resetToDefault(true); - } } } void ALFloaterLightBox::updateTonemapper() { - //TODO: We should figure out how to call this on floater open, otherwise it'll be weird. - - //Init Text - LLTextBox* text1 = getChild<LLTextBox>("tonemapper_dynamic_text1"); - LLTextBox* text2 = getChild<LLTextBox>("tonemapper_dynamic_text2"); - LLTextBox* text3 = getChild<LLTextBox>("tonemapper_dynamic_text3"); - LLTextBox* text4 = getChild<LLTextBox>("tonemapper_dynamic_text4"); - LLTextBox* text5 = getChild<LLTextBox>("tonemapper_dynamic_text5"); - LLTextBox* text6 = getChild<LLTextBox>("tonemapper_dynamic_text6"); - LLTextBox* text7 = getChild<LLTextBox>("tonemapper_dynamic_text7"); - LLTextBox* text8 = getChild<LLTextBox>("tonemapper_dynamic_text8"); + //Init Text + LLTextBox* text1 = getChild<LLTextBox>("tonemapper_dynamic_text1"); + LLTextBox* text2 = getChild<LLTextBox>("tonemapper_dynamic_text2"); + LLTextBox* text3 = getChild<LLTextBox>("tonemapper_dynamic_text3"); + LLTextBox* text4 = getChild<LLTextBox>("tonemapper_dynamic_text4"); + LLTextBox* text5 = getChild<LLTextBox>("tonemapper_dynamic_text5"); + LLTextBox* text6 = getChild<LLTextBox>("tonemapper_dynamic_text6"); + LLTextBox* text7 = getChild<LLTextBox>("tonemapper_dynamic_text7"); //Init Spinners - LLSpinCtrl* spinner1 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner1"); - LLSpinCtrl* spinner2 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner2"); - LLSpinCtrl* spinner3 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner3"); - LLSpinCtrl* spinner4 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner4"); - LLSpinCtrl* spinner5 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner5"); - LLSpinCtrl* spinner6 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner6"); - LLSpinCtrl* spinner7 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner7"); - LLSpinCtrl* spinner8 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner8"); - - // Init Sliders - LLSliderCtrl* slider1 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider1"); - LLSliderCtrl* slider2 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider2"); - LLSliderCtrl* slider3 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider3"); - LLSliderCtrl* slider4 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider4"); - LLSliderCtrl* slider5 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider5"); - LLSliderCtrl* slider6 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider6"); - LLSliderCtrl* slider7 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider7"); - LLSliderCtrl* slider8 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider8"); - - // Check the state of RenderToneMapType - U32 TMap = gSavedSettings.getU32("RenderToneMapType"); - - //Init Ctrl Objects - ALToneMapCtrl tm1; - ALToneMapCtrl tm2; - ALToneMapCtrl tm3; - ALToneMapCtrl tm4; - ALToneMapCtrl tm5; - ALToneMapCtrl tm6; - ALToneMapCtrl tm7; - ALToneMapCtrl tm8; - - //These get to live on their own, lucky! - LLVector3 vTM_A; - LLVector3 vTM_B; - LLVector3 vTM_C; - - if (TMap == 7) // Uchimura - { - vTM_A = gSavedSettings.getVector3("RenderToneMapUchimuraA"); - - // max display brightness - tm1.TM_Enable = TRUE; - tm1.TM_CtrlName = "Max Brightness:"; - tm1.TM_Min = 0.0f; - tm1.TM_Max = 1.0f; - - // contrast - tm2.TM_Enable = TRUE; - tm2.TM_CtrlName = "Contrast:"; - tm2.TM_Min = 0.01f; - tm2.TM_Max = 1.0f; - - // linear section start - tm3.TM_Enable = TRUE; - tm3.TM_CtrlName = "Linear Start:"; - tm3.TM_Min = 0.01f; - tm3.TM_Max = 2.0f; - - vTM_B = gSavedSettings.getVector3("RenderToneMapUchimuraB"); - - // linear section length - tm4.TM_Enable = TRUE; - tm4.TM_CtrlName = "Linear Length:"; - tm4.TM_Min = 0.01f; - tm4.TM_Max = 1.0f; - - // black - tm5.TM_Enable = TRUE; - tm5.TM_CtrlName = "Black Level:"; - tm5.TM_Min = -4.0f; - tm5.TM_Max = 4.0f; - - // pedestal - tm6.TM_Enable = TRUE; - tm6.TM_CtrlName = "Pedestal:"; - tm6.TM_Min = -2.0f; - tm6.TM_Max = 2.0f; - } - else if (TMap == 8) // Lottes - { - //TODO: Better names? - vTM_A = gSavedSettings.getVector3("RenderToneMapLottesA"); - - // a - tm1.TM_Enable = TRUE; - tm1.TM_CtrlName = "A:"; - tm1.TM_Min = 0.0f; - tm1.TM_Max = 1.0f; - - // d - tm2.TM_Enable = TRUE; - tm2.TM_CtrlName = "D:"; - tm2.TM_Min = 0.01f; - tm2.TM_Max = 1.0f; - - // maxhdr - tm3.TM_Enable = TRUE; - tm3.TM_CtrlName = "Max HDR:"; - tm3.TM_Min = 0.01f; - tm3.TM_Max = 2.0f; - - vTM_B = gSavedSettings.getVector3("RenderToneMapLottesB"); - - // midln - tm4.TM_Enable = TRUE; - tm4.TM_CtrlName = "Mid Level:"; - tm4.TM_Min = 0.01f; - tm4.TM_Max = 1.0f; - - // black - tm5.TM_Enable = TRUE; - tm5.TM_CtrlName = "Black Level:"; - tm5.TM_Min = -4.0f; - tm5.TM_Max = 4.0f; - } - else if (TMap == 9) // Uncharted - { - //TODO: What in the world are these settings actually called?! - vTM_A = gSavedSettings.getVector3("RenderToneMapUnchartedA"); - - // a - tm1.TM_Enable = TRUE; - tm1.TM_CtrlName = "A:"; - tm1.TM_Min = 0.0f; - tm1.TM_Max = 4.0f; - - // b - tm2.TM_Enable = TRUE; - tm2.TM_CtrlName = "B:"; - tm2.TM_Min = 0.0f; - tm2.TM_Max = 4.0f; - - // c - tm3.TM_Enable = TRUE; - tm3.TM_CtrlName = "C:"; - tm3.TM_Min = 0.0f; - tm3.TM_Max = 4.0f; - - vTM_B = gSavedSettings.getVector3("RenderToneMapUnchartedB"); - - // d - tm4.TM_Enable = TRUE; - tm4.TM_CtrlName = "D:"; - tm4.TM_Min = 0.0f; - tm4.TM_Max = 4.0f; - - // e - tm5.TM_Enable = TRUE; - tm5.TM_CtrlName = "E:"; - tm5.TM_Min = -0.5f; - tm5.TM_Max = 0.05f; - tm5.TM_Inc = 0.001f; - tm5.TM_Precision = 3; - - // f - tm6.TM_Enable = TRUE; - tm6.TM_CtrlName = "F:"; - tm6.TM_Min = 0.04f; - tm6.TM_Max = 4.0f; - - vTM_C = gSavedSettings.getVector3("RenderToneMapUnchartedC"); - - // w - tm7.TM_Enable = TRUE; - tm7.TM_CtrlName = "W:"; - tm7.TM_Min = 0.0f; - tm7.TM_Max = 12.0f; - - // exposure bias - tm8.TM_Enable = TRUE; - tm8.TM_CtrlName = "Exposure Bias:"; - tm8.TM_Min = 0.0f; - tm8.TM_Max = 16.0f; - } - - //Set Controls - - //Visibilty - text1->setVisible(tm1.TM_Enable); - text1->setText(tm1.TM_CtrlName); - spinner1->setVisible(tm1.TM_Enable); - slider1->setVisible(tm1.TM_Enable); - - text2->setVisible(tm2.TM_Enable); - text2->setText(tm2.TM_CtrlName); - spinner2->setVisible(tm2.TM_Enable); - slider2->setVisible(tm2.TM_Enable); - - text3->setVisible(tm3.TM_Enable); - text3->setText(tm3.TM_CtrlName); - spinner3->setVisible(tm3.TM_Enable); - slider3->setVisible(tm3.TM_Enable); - - text4->setVisible(tm4.TM_Enable); - text4->setText(tm4.TM_CtrlName); - spinner4->setVisible(tm4.TM_Enable); - slider4->setVisible(tm4.TM_Enable); - - text5->setVisible(tm5.TM_Enable); - text5->setText(tm5.TM_CtrlName); - spinner5->setVisible(tm5.TM_Enable); - slider5->setVisible(tm5.TM_Enable); - - text6->setVisible(tm6.TM_Enable); - text6->setText(tm6.TM_CtrlName); - spinner6->setVisible(tm6.TM_Enable); - slider6->setVisible(tm6.TM_Enable); - - text7->setVisible(tm7.TM_Enable); - text7->setText(tm7.TM_CtrlName); - spinner7->setVisible(tm7.TM_Enable); - slider7->setVisible(tm7.TM_Enable); - - text8->setVisible(tm8.TM_Enable); - text8->setText(tm8.TM_CtrlName); - spinner8->setVisible(tm8.TM_Enable); - slider8->setVisible(tm8.TM_Enable); - - //Min Values - spinner1->setMinValue(tm1.TM_Min); - slider1->setMinValue(tm1.TM_Min); - - spinner2->setMinValue(tm2.TM_Min); - slider2->setMinValue(tm2.TM_Min); - - spinner3->setMinValue(tm3.TM_Min); - slider3->setMinValue(tm3.TM_Min); - - spinner4->setMinValue(tm4.TM_Min); - slider4->setMinValue(tm4.TM_Min); - - spinner5->setMinValue(tm5.TM_Min); - slider5->setMinValue(tm5.TM_Min); - - spinner6->setMinValue(tm6.TM_Min); - slider6->setMinValue(tm6.TM_Min); - - spinner7->setMinValue(tm7.TM_Min); - slider7->setMinValue(tm7.TM_Min); - - spinner8->setMinValue(tm8.TM_Min); - slider8->setMinValue(tm8.TM_Min); - - //Max Values - spinner1->setMaxValue(tm1.TM_Max); - slider1->setMaxValue(tm1.TM_Max); - - spinner2->setMaxValue(tm2.TM_Max); - slider2->setMaxValue(tm2.TM_Max); - - spinner3->setMaxValue(tm3.TM_Max); - slider3->setMaxValue(tm3.TM_Max); - - spinner4->setMaxValue(tm4.TM_Max); - slider4->setMaxValue(tm4.TM_Max); - - spinner5->setMaxValue(tm5.TM_Max); - slider5->setMaxValue(tm5.TM_Max); - - spinner6->setMaxValue(tm6.TM_Max); - slider6->setMaxValue(tm6.TM_Max); - - spinner7->setMaxValue(tm7.TM_Max); - slider7->setMaxValue(tm7.TM_Max); - - spinner8->setMaxValue(tm8.TM_Max); - slider8->setMaxValue(tm8.TM_Max); - - //Precision - spinner1->setPrecision(tm1.TM_Precision); - slider1->setPrecision(tm1.TM_Precision); - - spinner2->setPrecision(tm2.TM_Precision); - slider2->setPrecision(tm2.TM_Precision); - - spinner3->setPrecision(tm3.TM_Precision); - slider3->setPrecision(tm3.TM_Precision); - - spinner4->setPrecision(tm4.TM_Precision); - slider4->setPrecision(tm4.TM_Precision); - - spinner5->setPrecision(tm5.TM_Precision); - slider5->setPrecision(tm5.TM_Precision); - - spinner6->setPrecision(tm6.TM_Precision); - slider6->setPrecision(tm6.TM_Precision); - - spinner7->setPrecision(tm7.TM_Precision); - slider7->setPrecision(tm7.TM_Precision); - - spinner8->setPrecision(tm8.TM_Precision); - slider8->setPrecision(tm8.TM_Precision); - - //Increment - spinner1->setIncrement(tm1.TM_Inc); - slider1->setIncrement(tm1.TM_Inc); - - spinner2->setIncrement(tm2.TM_Inc); - slider2->setIncrement(tm2.TM_Inc); - - spinner3->setIncrement(tm3.TM_Inc); - slider3->setIncrement(tm3.TM_Inc); - - spinner4->setIncrement(tm4.TM_Inc); - slider4->setIncrement(tm4.TM_Inc); - - spinner5->setIncrement(tm5.TM_Inc); - slider5->setIncrement(tm5.TM_Inc); - - spinner6->setIncrement(tm6.TM_Inc); - slider6->setIncrement(tm6.TM_Inc); - - spinner7->setIncrement(tm7.TM_Inc); - slider7->setIncrement(tm7.TM_Inc); - - spinner8->setIncrement(tm8.TM_Inc); - slider8->setIncrement(tm8.TM_Inc); - - // Values - spinner1->setValue(vTM_A[VX]); - slider1->setValue(vTM_A[VX]); - - spinner2->setValue(vTM_A[VY]); - slider2->setValue(vTM_A[VY]); - - spinner3->setValue(vTM_A[VZ]); - slider3->setValue(vTM_A[VZ]); - - spinner4->setValue(vTM_B[VX]); - slider4->setValue(vTM_B[VX]); - - spinner5->setValue(vTM_B[VY]); - slider5->setValue(vTM_B[VY]); - - spinner6->setValue(vTM_B[VZ]); - slider6->setValue(vTM_B[VZ]); - - spinner7->setValue(vTM_C[VX]); - slider7->setValue(vTM_C[VX]); - - spinner8->setValue(vTM_C[VY]); - slider8->setValue(vTM_C[VY]); + LLSpinCtrl* spinner1 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner1"); + LLSpinCtrl* spinner2 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner2"); + LLSpinCtrl* spinner3 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner3"); + LLSpinCtrl* spinner4 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner4"); + LLSpinCtrl* spinner5 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner5"); + LLSpinCtrl* spinner6 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner6"); + LLSpinCtrl* spinner7 = getChild<LLSpinCtrl>("tonemapper_dynamic_spinner7"); + + // Init Sliders + LLSliderCtrl* slider1 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider1"); + LLSliderCtrl* slider2 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider2"); + LLSliderCtrl* slider3 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider3"); + LLSliderCtrl* slider4 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider4"); + LLSliderCtrl* slider5 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider5"); + LLSliderCtrl* slider6 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider6"); + LLSliderCtrl* slider7 = getChild<LLSliderCtrl>("tonemapper_dynamic_slider7"); + + // Check the state of RenderToneMapType + switch (gSavedSettings.getU32("RenderToneMapType")) + { + default: + { + text1->setVisible(FALSE); + spinner1->setVisible(FALSE); + slider1->setVisible(FALSE); + + text2->setVisible(FALSE); + spinner2->setVisible(FALSE); + slider2->setVisible(FALSE); + + text3->setVisible(FALSE); + spinner3->setVisible(FALSE); + slider3->setVisible(FALSE); + + text4->setVisible(FALSE); + spinner4->setVisible(FALSE); + slider4->setVisible(FALSE); + + text5->setVisible(FALSE); + spinner5->setVisible(FALSE); + slider5->setVisible(FALSE); + + text6->setVisible(FALSE); + spinner6->setVisible(FALSE); + slider6->setVisible(FALSE); + + text7->setVisible(FALSE); + spinner7->setVisible(FALSE); + slider7->setVisible(FALSE); + break; + } + case ALRenderUtil::TONEMAP_UCHIMURA: + { + text1->setVisible(TRUE); + text1->setText(std::string("Max Brightness")); + spinner1->setVisible(TRUE); + spinner1->setMinValue(0.01); + spinner1->setMaxValue(8.0); + spinner1->setIncrement(0.1); + spinner1->setControlName("AlchemyToneMapUchimuraMaxBrightness"); + slider1->setVisible(TRUE); + slider1->setMinValue(0.01); + slider1->setMaxValue(8.0); + slider1->setIncrement(0.1); + slider1->setControlName("AlchemyToneMapUchimuraMaxBrightness", nullptr); + + text2->setVisible(TRUE); + text2->setText(std::string("Contrast")); + spinner2->setVisible(TRUE); + spinner2->setMinValue(0.01); + spinner2->setMaxValue(2.0); + spinner2->setIncrement(0.01); + spinner2->setControlName("AlchemyToneMapUchimuraContrast"); + slider2->setVisible(TRUE); + slider2->setMinValue(0.01); + slider2->setMaxValue(2.0); + slider2->setIncrement(0.01); + slider2->setControlName("AlchemyToneMapUchimuraContrast", nullptr); + + text3->setVisible(TRUE); + text3->setText(std::string("Linear Start")); + spinner3->setVisible(TRUE); + spinner3->setMinValue(0.01); + spinner3->setMaxValue(1.0); + spinner3->setIncrement(0.01); + spinner3->setControlName("AlchemyToneMapUchimuraLinearStart"); + slider3->setVisible(TRUE); + slider3->setMinValue(0.01); + slider3->setMaxValue(1.0); + slider3->setIncrement(0.01); + slider3->setControlName("AlchemyToneMapUchimuraLinearStart", nullptr); + + text4->setVisible(TRUE); + text4->setText(std::string("Linear Length")); + spinner4->setVisible(TRUE); + spinner4->setMinValue(0.01); + spinner4->setMaxValue(1.0); + spinner4->setIncrement(0.01); + spinner4->setControlName("AlchemyToneMapUchimuraLinearLength"); + slider4->setVisible(TRUE); + slider4->setMinValue(0.01); + slider4->setMaxValue(1.0); + slider4->setIncrement(0.01); + slider4->setControlName("AlchemyToneMapUchimuraLinearLength", nullptr); + + text5->setVisible(TRUE); + text5->setText(std::string("Black Level")); + spinner5->setVisible(TRUE); + spinner5->setMinValue(0.01); + spinner5->setMaxValue(4.0); + spinner5->setIncrement(0.01); + spinner5->setControlName("AlchemyToneMapUchimuraBlackLevel"); + slider5->setVisible(TRUE); + slider5->setMinValue(0.01); + slider5->setMaxValue(4.0); + slider5->setIncrement(0.01); + slider5->setControlName("AlchemyToneMapUchimuraBlackLevel", nullptr); + + text6->setVisible(FALSE); + spinner6->setVisible(FALSE); + slider6->setVisible(FALSE); + + text7->setVisible(FALSE); + spinner7->setVisible(FALSE); + slider7->setVisible(FALSE); + break; + } + case ALRenderUtil::TONEMAP_AMD: + { + text1->setVisible(TRUE); + text1->setText(std::string("HDR Max")); + spinner1->setVisible(TRUE); + spinner1->setMinValue(1.0); + spinner1->setMaxValue(24.0); + spinner1->setIncrement(0.1); + spinner1->setControlName("AlchemyToneMapAMDHDRMax"); + slider1->setVisible(TRUE); + slider1->setMinValue(1.0); + slider1->setMaxValue(24.0); + slider1->setIncrement(0.1); + slider1->setControlName("AlchemyToneMapAMDHDRMax", nullptr); + + text2->setVisible(TRUE); + text2->setText(std::string("Contrast")); + spinner2->setVisible(TRUE); + spinner2->setMinValue(0.5); + spinner2->setMaxValue(4.0); + spinner2->setControlName("AlchemyToneMapAMDContrast"); + spinner2->setIncrement(0.01); + slider2->setVisible(TRUE); + slider2->setMinValue(0.5); + slider2->setMaxValue(4.0); + slider2->setIncrement(0.01); + slider2->setControlName("AlchemyToneMapAMDContrast", nullptr); + + text3->setVisible(TRUE); + text3->setText(std::string("Shoulder")); + spinner3->setVisible(TRUE); + spinner3->setMinValue(0.5); + spinner3->setMaxValue(4.0); + spinner3->setIncrement(0.01); + spinner3->setControlName("AlchemyToneMapAMDShoulder"); + slider3->setVisible(TRUE); + slider3->setMinValue(0.5); + slider3->setMaxValue(4.0); + slider3->setIncrement(0.01); + slider3->setControlName("AlchemyToneMapAMDShoulder", nullptr); + + text4->setVisible(FALSE); + spinner4->setVisible(FALSE); + slider4->setVisible(FALSE); + + text5->setVisible(FALSE); + spinner5->setVisible(FALSE); + slider5->setVisible(FALSE); + + text6->setVisible(FALSE); + spinner6->setVisible(FALSE); + slider6->setVisible(FALSE); + + text7->setVisible(FALSE); + spinner7->setVisible(FALSE); + slider7->setVisible(FALSE); + break; + } + case ALRenderUtil::TONEMAP_UNCHARTED: + { + text1->setVisible(TRUE); + text1->setText(std::string("Toe Strength")); + spinner1->setVisible(TRUE); + spinner1->setMinValue(0.0); + spinner1->setMaxValue(1.0); + spinner1->setIncrement(0.01); + spinner1->setControlName("AlchemyToneMapFilmicToeStr"); + slider1->setVisible(TRUE); + slider1->setMinValue(0.0); + slider1->setMaxValue(1.0); + slider1->setIncrement(0.01); + slider1->setControlName("AlchemyToneMapFilmicToeStr", nullptr); + + text2->setVisible(TRUE); + text2->setText(std::string("Toe Length")); + spinner2->setVisible(TRUE); + spinner2->setMinValue(0.01); + spinner2->setMaxValue(1.0); + spinner2->setIncrement(0.01); + spinner2->setControlName("AlchemyToneMapFilmicToeLen"); + slider2->setVisible(TRUE); + slider2->setMinValue(0.01); + slider2->setMaxValue(1.0); + slider2->setIncrement(0.01); + slider2->setControlName("AlchemyToneMapFilmicToeLen", nullptr); + + text3->setVisible(TRUE); + text3->setText(std::string("Shoulder Strength")); + spinner3->setVisible(TRUE); + spinner3->setMinValue(0.0); + spinner3->setMaxValue(1.0); + spinner3->setIncrement(0.01); + spinner3->setControlName("AlchemyToneMapFilmicShoulderStr"); + slider3->setVisible(TRUE); + slider3->setMinValue(0.0); + slider3->setMaxValue(1.0); + slider3->setIncrement(0.01); + slider3->setControlName("AlchemyToneMapFilmicShoulderStr", nullptr); + + text4->setVisible(TRUE); + text4->setText(std::string("Shoulder Length")); + spinner4->setVisible(TRUE); + spinner4->setMinValue(0.01); + spinner4->setMaxValue(8.0); + spinner4->setIncrement(0.01); + spinner4->setControlName("AlchemyToneMapFilmicShoulderLen"); + slider4->setVisible(TRUE); + slider4->setMinValue(0.01); + slider4->setMaxValue(8.0); + slider4->setIncrement(0.01); + slider4->setControlName("AlchemyToneMapFilmicShoulderLen", nullptr); + + text5->setVisible(TRUE); + text5->setText(std::string("Shoulder Angle")); + spinner5->setVisible(TRUE); + spinner5->setMinValue(0.0); + spinner5->setMaxValue(1.0); + spinner5->setIncrement(0.01); + spinner5->setControlName("AlchemyToneMapFilmicShoulderAngle"); + slider5->setVisible(TRUE); + slider5->setMinValue(0.0); + slider5->setMaxValue(1.0); + slider5->setIncrement(0.01); + slider5->setControlName("AlchemyToneMapFilmicShoulderAngle", nullptr); + + text6->setVisible(TRUE); + text6->setText(std::string("Gamma")); + spinner6->setVisible(TRUE); + spinner6->setMinValue(0.01); + spinner6->setMaxValue(5.0); + spinner6->setIncrement(0.01); + spinner6->setControlName("AlchemyToneMapFilmicGamma"); + slider6->setVisible(TRUE); + slider6->setMinValue(0.01); + slider6->setMaxValue(5.0); + slider6->setIncrement(0.01); + slider6->setControlName("AlchemyToneMapFilmicGamma", nullptr); + + text7->setVisible(TRUE); + text7->setText(std::string("White Point")); + spinner7->setVisible(TRUE); + spinner7->setMinValue(1.0); + spinner7->setMaxValue(16.0); + spinner7->setIncrement(0.1); + spinner7->setControlName("AlchemyToneMapFilmicWhitePoint"); + slider7->setVisible(TRUE); + slider7->setMinValue(1.0); + slider7->setMaxValue(16.0); + slider7->setIncrement(0.1); + slider7->setControlName("AlchemyToneMapFilmicWhitePoint", nullptr); + break; + } + } } void ALFloaterLightBox::updateSSAO() diff --git a/indra/newview/alfloaterlightbox.h b/indra/newview/alfloaterlightbox.h index 1f0da0065da97a730230001093ba30528608661c..a86877b0755bb4d0c096289a5eff40366c98aff8 100644 --- a/indra/newview/alfloaterlightbox.h +++ b/indra/newview/alfloaterlightbox.h @@ -41,6 +41,7 @@ class ALFloaterLightBox final : public LLFloater { public: ALFloaterLightBox(const LLSD& key); + ~ALFloaterLightBox() override; BOOL postBuild() override; virtual void draw() override; @@ -53,6 +54,8 @@ class ALFloaterLightBox final : public LLFloater void commitTonemapper(const LLSD& userdata); void commitCAS(const LLSD& userdata); void commitSSAO(const LLSD& userdata); + + boost::signals2::scoped_connection mTonemapConnection; }; diff --git a/indra/newview/alrenderutils.cpp b/indra/newview/alrenderutils.cpp index 50d7d7affc21ed8df8dc72492a831a0bb994cae1..b6fbb0cc110f985db1d3a96526f329d9f09b66a2 100644 --- a/indra/newview/alrenderutils.cpp +++ b/indra/newview/alrenderutils.cpp @@ -46,8 +46,7 @@ const U32 ALRENDER_BUFFER_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MA static LLStaticHashedString al_exposure("exposure"); static LLStaticHashedString tone_uchimura_a("tone_uchimura_a"); static LLStaticHashedString tone_uchimura_b("tone_uchimura_b"); -static LLStaticHashedString tone_lottes_a("tone_lottes_a"); -static LLStaticHashedString tone_lottes_b("tone_lottes_b"); +static LLStaticHashedString tonemap_amd_params("tonemap_amd"); static LLStaticHashedString tone_uncharted_a("tone_uncharted_a"); static LLStaticHashedString tone_uncharted_b("tone_uncharted_b"); static LLStaticHashedString tone_uncharted_c("tone_uncharted_c"); @@ -248,13 +247,21 @@ ALRenderUtil::ALRenderUtil() gSavedSettings.getControl("RenderColorGradeLUT")->getSignal()->connect(boost::bind(&ALRenderUtil::setupColorGrade, this)); gSavedSettings.getControl("RenderToneMapType")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); gSavedSettings.getControl("RenderExposure")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); - gSavedSettings.getControl("RenderToneMapLottesA")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); - gSavedSettings.getControl("RenderToneMapLottesB")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); - gSavedSettings.getControl("RenderToneMapUchimuraA")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); - gSavedSettings.getControl("RenderToneMapUchimuraB")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); - gSavedSettings.getControl("RenderToneMapUnchartedA")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); - gSavedSettings.getControl("RenderToneMapUnchartedB")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); - gSavedSettings.getControl("RenderToneMapUnchartedC")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapAMDHDRMax")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapAMDContrast")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapAMDShoulder")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapUchimuraMaxBrightness")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapUchimuraContrast")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapUchimuraLinearStart")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapUchimuraLinearLength")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapUchimuraBlackLevel")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapFilmicToeStr")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapFilmicToeLen")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapFilmicShoulderStr")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapFilmicShoulderLen")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapFilmicShoulderAngle")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapFilmicGamma")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); + gSavedSettings.getControl("AlchemyToneMapFilmicWhitePoint")->getSignal()->connect(boost::bind(&ALRenderUtil::setupTonemap, this)); gSavedSettings.getControl("RenderSharpenMethod")->getSignal()->connect(boost::bind(&ALRenderUtil::setupSharpen, this)); gSavedSettings.getControl("RenderSharpenCASParams")->getSignal()->connect(boost::bind(&ALRenderUtil::setupSharpen, this)); gSavedSettings.getControl("RenderSharpenDLSParams")->getSignal()->connect(boost::bind(&ALRenderUtil::setupSharpen, this)); @@ -312,13 +319,12 @@ bool ALRenderUtil::setupTonemap() mTonemapExposure = llclamp(gSavedSettings.getF32("RenderExposure"), 0.5f, 4.f); - mToneLottesParamA = gSavedSettings.getVector3("RenderToneMapLottesA"); - mToneLottesParamB = gSavedSettings.getVector3("RenderToneMapLottesB"); - mToneUchimuraParamA = gSavedSettings.getVector3("RenderToneMapUchimuraA"); - mToneUchimuraParamB = gSavedSettings.getVector3("RenderToneMapUchimuraB"); - mToneUnchartedParamA = gSavedSettings.getVector3("RenderToneMapUnchartedA"); - mToneUnchartedParamB = gSavedSettings.getVector3("RenderToneMapUnchartedB"); - mToneUnchartedParamC = gSavedSettings.getVector3("RenderToneMapUnchartedC"); + mToneAMDParams = LLVector3(gSavedSettings.getF32("AlchemyToneMapAMDHDRMax"), gSavedSettings.getF32("AlchemyToneMapAMDContrast"), gSavedSettings.getF32("AlchemyToneMapAMDShoulder")); + mToneUchimuraParamA = LLVector3(gSavedSettings.getF32("AlchemyToneMapUchimuraMaxBrightness"), gSavedSettings.getF32("AlchemyToneMapUchimuraContrast"), gSavedSettings.getF32("AlchemyToneMapUchimuraLinearStart")); + mToneUchimuraParamB = LLVector3(gSavedSettings.getF32("AlchemyToneMapUchimuraLinearLength"), gSavedSettings.getF32("AlchemyToneMapUchimuraBlackLevel"), 0.0); + mToneUnchartedParamA = LLVector3(gSavedSettings.getF32("AlchemyToneMapFilmicToeStr"), gSavedSettings.getF32("AlchemyToneMapFilmicToeLen"), gSavedSettings.getF32("AlchemyToneMapFilmicShoulderStr")); + mToneUnchartedParamB = LLVector3(gSavedSettings.getF32("AlchemyToneMapFilmicShoulderLen"), gSavedSettings.getF32("AlchemyToneMapFilmicShoulderAngle"), gSavedSettings.getF32("AlchemyToneMapFilmicGamma")); + mToneUnchartedParamC = LLVector3(gSavedSettings.getF32("AlchemyToneMapFilmicWhitePoint"), 2.0, 0.0); } else { @@ -539,8 +545,7 @@ void ALRenderUtil::renderTonemap(LLRenderTarget* src, LLRenderTarget* exposure, } case ALTonemap::TONEMAP_AMD: { - tone_shader->uniform3fv(tone_lottes_a, 1, mToneLottesParamA.mV); - tone_shader->uniform3fv(tone_lottes_b, 1, mToneLottesParamB.mV); + tone_shader->uniform3fv(tonemap_amd_params, 1, mToneAMDParams.mV); break; } case ALTonemap::TONEMAP_UNCHARTED: diff --git a/indra/newview/alrenderutils.h b/indra/newview/alrenderutils.h index 1363c9bc99f21841744911af0c92980b4c007e8d..7a95eb3b8f9935d9629a332261d87dc0d729360a 100644 --- a/indra/newview/alrenderutils.h +++ b/indra/newview/alrenderutils.h @@ -48,16 +48,10 @@ class ALRenderUtil enum ALTonemap : uint32_t { TONEMAP_NONE = 0, - TONEMAP_LINEAR, - TONEMAP_REINHARD, - TONEMAP_REINHARD2, - TONEMAP_FILMIC, - TONEMAP_UNREAL, - TONEMAP_ACES_NARCOWICZ, + TONEMAP_ACES_HILL, TONEMAP_UCHIMURA, TONEMAP_AMD, TONEMAP_UNCHARTED, - TONEMAP_ACES_HILL, TONEMAP_COUNT }; bool setupTonemap(); @@ -84,8 +78,7 @@ class ALRenderUtil // State U32 mTonemapType = ALTonemap::TONEMAP_NONE; - LLVector3 mToneLottesParamA; - LLVector3 mToneLottesParamB; + LLVector3 mToneAMDParams; LLVector3 mToneUchimuraParamA; LLVector3 mToneUchimuraParamB; LLVector3 mToneUnchartedParamA; diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml index 8de25bbb042c07345bb633a19f03266b91bea634..82ecebc6875946eea763f5dbe793324c0ad5cfb3 100644 --- a/indra/newview/app_settings/settings_alchemy.xml +++ b/indra/newview/app_settings/settings_alchemy.xml @@ -420,50 +420,6 @@ <key>Value</key> <real>1.0</real> </map> - <key>AlchemyLookAtShow</key> - <map> - <key>Comment</key> - <string>[OBSOLETE]</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>AlchemyLookAtLines</key> - <map> - <key>Comment</key> - <string>[OBSOLETE]</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>AlchemyLookAtNames</key> - <map> - <key>Comment</key> - <string>[OBSOLETE]</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>U32</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>AlchemyLookAtHideSelf</key> - <map> - <key>Comment</key> - <string>[OBSOLETE]</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>AlchemyLookAtPrivate</key> <map> <key>Comment</key> @@ -1176,10 +1132,43 @@ <real>0.0</real> </array> </map> - <key>RenderToneMapExposure</key> + <key>RenderToneMapType</key> <map> <key>Comment</key> - <string>[OBSOLETE]</string> + <string>Tonemapping type 0 - HDR Debug, 1 - ACES, 2 - Uchimura, 3 - AMD, 4 - Uncharted</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>AlchemyToneMapAMDHDRMax</key> + <map> + <key>Comment</key> + <string>How much HDR range before clipping. HDR modes likely need this pushed up to say 25.0.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>16.0</real> + </map> + <key>AlchemyToneMapAMDContrast</key> + <map> + <key>Comment</key> + <string>Use as a baseline to tune the amount of contrast the tonemapper has.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>1.4</real> + </map> + <key>AlchemyToneMapAMDShoulder</key> + <map> + <key>Comment</key> + <string>Tonemap shoulder adjustment</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -1187,121 +1176,137 @@ <key>Value</key> <real>1.0</real> </map> - <key>RenderToneMapLottesA</key> + <key>AlchemyToneMapUchimuraMaxBrightness</key> <map> <key>Comment</key> - <string>x (a), y (d), z (hdrMax)</string> + <string>Maximum Possible Display Brightness</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Vector3</string> + <string>F32</string> <key>Value</key> - <array> - <real>1.4</real> - <real>1.0</real> - <real>16.0</real> - </array> + <real>1.0</real> </map> - <key>RenderToneMapLottesB</key> + <key>AlchemyToneMapUchimuraContrast</key> <map> <key>Comment</key> - <string>[OBSOLETE]</string> + <string>Contrast Adjustment</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Vector3</string> + <string>F32</string> <key>Value</key> - <array> - <real>0.18</real> - <real>0.18</real> - <real>0.0</real> - </array> + <real>1.0</real> </map> - <key>RenderToneMapType</key> + <key>AlchemyToneMapUchimuraLinearStart</key> <map> <key>Comment</key> - <string>Tonemapping type 0 - HDR Debug, 1 - Linear, 2 - Reinhard, 3 - Reinhard2, 4 - Filmic, 5 - Unreal, 6 - ACES Narkowicz, 7 - Uchimura, 8 - AMD, 9 - Uncharted, 10 - Aces Hill</string> + <string>Curve Linear Section Start</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>U32</string> + <string>F32</string> <key>Value</key> - <integer>10</integer> + <real>0.22</real> </map> - <key>RenderToneMapUchimuraA</key> + <key>AlchemyToneMapUchimuraLinearLength</key> <map> <key>Comment</key> - <string>x (max display brightness), y (contrast), z (linear section start)</string> + <string>Length of linear section in tonemapping curve</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Vector3</string> + <string>F32</string> <key>Value</key> - <array> - <real>1.0</real> - <real>1.0</real> - <real>0.22</real> - </array> + <real>0.44</real> </map> - <key>RenderToneMapUchimuraB</key> + <key>AlchemyToneMapUchimuraBlackLevel</key> <map> <key>Comment</key> - <string>x (linear section length), y (black), z (pedestal)</string> + <string>Adjust black range of curve</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Vector3</string> + <string>F32</string> <key>Value</key> - <array> - <real>0.4</real> - <real>1.13</real> - <real>0.0</real> - </array> + <real>1.33</real> </map> - <key>RenderToneMapUnchartedA</key> + <key>AlchemyToneMapFilmicToeStr</key> <map> <key>Comment</key> - <string>A, B, C</string> + <string>Toe Strength</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Vector3</string> + <string>F32</string> <key>Value</key> - <array> - <real>0.15</real> - <real>0.50</real> - <real>0.10</real> - </array> + <real>0.22</real> </map> - <key>RenderToneMapUnchartedB</key> + <key>AlchemyToneMapFilmicToeLen</key> <map> <key>Comment</key> - <string>D, E, F</string> + <string>Toe Length</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Vector3</string> + <string>F32</string> <key>Value</key> - <array> - <real>0.20</real> - <real>0.02</real> - <real>0.20</real> - </array> + <real>0.30</real> </map> - <key>RenderToneMapUnchartedC</key> + <key>AlchemyToneMapFilmicShoulderStr</key> <map> <key>Comment</key> - <string>W, ExposureBias, UNUSED</string> + <string>Shoulder Strength</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Vector3</string> + <string>F32</string> <key>Value</key> - <array> - <real>11.2</real> - <real>2.0</real> - <real>0.0</real> - </array> + <real>0.22</real> + </map> + <key>AlchemyToneMapFilmicShoulderLen</key> + <map> + <key>Comment</key> + <string>Shoulder Length</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.20</real> + </map> + <key>AlchemyToneMapFilmicShoulderAngle</key> + <map> + <key>Comment</key> + <string>Shoulder Angle</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.01</real> + </map> + <key>AlchemyToneMapFilmicGamma</key> + <map> + <key>Comment</key> + <string>Curve Gamma</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.3</real> + </map> + <key>AlchemyToneMapFilmicWhitePoint</key> + <map> + <key>Comment</key> + <string>Curve White Point</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>8.0</real> </map> <key>ResetUserColorsOnLogout</key> <map> @@ -1391,5 +1396,165 @@ <key>Value</key> <integer>1023</integer> </map> + <key>AlchemyLookAtShow</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>AlchemyLookAtLines</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>AlchemyLookAtNames</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>AlchemyLookAtHideSelf</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>RenderToneMapExposure</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>1.0</real> + </map> + <key>RenderToneMapLottesA</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>1.4</real> + <real>1.0</real> + <real>16.0</real> + </array> + </map> + <key>RenderToneMapLottesB</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.18</real> + <real>0.18</real> + <real>0.0</real> + </array> + </map> + <key>RenderToneMapUchimuraA</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>1.0</real> + <real>1.0</real> + <real>0.22</real> + </array> + </map> + <key>RenderToneMapUchimuraB</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.4</real> + <real>1.13</real> + <real>0.0</real> + </array> + </map> + <key>RenderToneMapUnchartedA</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.22</real> + <real>0.30</real> + <real>0.10</real> + </array> + </map> + <key>RenderToneMapUnchartedB</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.20</real> + <real>0.01</real> + <real>0.30</real> + </array> + </map> + <key>RenderToneMapUnchartedC</key> + <map> + <key>Comment</key> + <string>[OBSOLETE]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>6.5</real> + <real>2.0</real> + <real>0.0</real> + </array> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl b/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl index 3b3368ded65bac646f38ccc7ab5996145b6e6dc0..4a17af977310e16b2b6aaaec67565a1bec17c443 100644 --- a/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl +++ b/indra/newview/app_settings/shaders/class1/alchemy/toneMapF.glsl @@ -47,45 +47,8 @@ uniform sampler3D colorgrade_lut; uniform vec4 colorgrade_lut_size; #endif -vec3 reinhard(vec3 x) -{ - return x/(1+x); -} - -vec3 reinhard2(vec3 x) { - const float L_white = 4.0; - return (x * (1.0 + x / (L_white * L_white))) / (1.0 + x); -} - -vec3 filmic(vec3 color) -{ - color = max(vec3(0.), color - vec3(0.004)); - color = (color * (6.2 * color + .5)) / (color * (6.2 * color + 1.7) + 0.06); - return color; -} - -vec3 unreal(vec3 x) -{ - // Unreal 3, Documentation: "Color Grading" - // Adapted to be close to Tonemap_ACES, with similar range - // Gamma 2.2 correction is baked in, don't use with sRGB conversion! - return x / (x + 0.155) * 1.019; -} - -vec3 ACES_Narkowicz(vec3 x) -{ - // Narkowicz 2015, "ACES Filmic Tone Mapping Curve" - const float a = 2.51; - const float b = 0.03; - const float c = 2.43; - const float d = 0.59; - const float e = 0.14; - return (x * (a * x + b)) / (x * (c * x + d) + e); -} - // ACES filmic tone map approximation // see https://github.com/TheRealMJP/BakingLab/blob/master/BakingLab/ACES.hlsl - // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT const mat3 ACESInputMat = mat3 ( @@ -152,7 +115,7 @@ vec3 uchimura(vec3 x) float m = tone_uchimura_a.z; // linear section start float l = tone_uchimura_b.x; // linear section length float c = tone_uchimura_b.y; // black - float b = tone_uchimura_b.z; // pedestal + float b = 0.0; // pedestal return uchimura(x, P, a, m, l, c, b); } @@ -184,12 +147,12 @@ float ColTone(float x, vec4 p) return z / (pow(z, p.g)*p.b + p.a); } -uniform vec3 tone_lottes_a = vec3(1.4, 1.0, 16.0); +uniform vec3 tonemap_amd = vec3(16.0, 1.4, 1.0); vec3 AMDTonemapper(vec3 color) { - float hdrMax = tone_lottes_a.z; // How much HDR range before clipping. HDR modes likely need this pushed up to say 25.0. - float contrast = tone_lottes_a.x; // Use as a baseline to tune the amount of contrast the tonemapper has. - float shoulder = tone_lottes_a.y; // Likely don’t need to mess with this factor, unless matching existing tonemapper is not working well.. + float hdrMax = tonemap_amd.x; // How much HDR range before clipping. HDR modes likely need this pushed up to say 25.0. + float contrast = tonemap_amd.y; // Use as a baseline to tune the amount of contrast the tonemapper has. + float shoulder = tonemap_amd.z; // Likely don’t need to mess with this factor, unless matching existing tonemapper is not working well.. const float midIn = 0.18; // most games will have a {0.0 to 1.0} range for LDR so midIn should be 0.18. const float midOut = 0.18; // Use for LDR. For HDR10 10:10:10:2 use maybe 0.18/25.0 to start. For scRGB, I forget what a good starting point is, need to re-calculate. @@ -224,13 +187,14 @@ vec3 AMDTonemapper(vec3 color) //-------------------------------------------------------------------------------------- // Hable, http://filmicworlds.com/blog/filmic-tonemapping-operators/ -uniform vec3 tone_uncharted_a = vec3(0.15, 0.50, 0.10); // A, B, C -uniform vec3 tone_uncharted_b = vec3(0.20, 0.02, 0.30); // D, E, F -uniform vec3 tone_uncharted_c = vec3(11.2, 2.0, 0.0); // W, ExposureBias, Unused +uniform vec3 tone_uncharted_a = vec3(0.22, 0.30, 0.10); // A, B, C +uniform vec3 tone_uncharted_b = vec3(0.20, 0.01, 0.30); // D, E, F +uniform vec3 tone_uncharted_c = vec3(8.0, 2.0, 0.0); // W, ExposureBias, Unused vec3 Uncharted2Tonemap(vec3 x) { - float A = tone_uncharted_a.x; - float B = tone_uncharted_a.y; + float ExposureBias = tone_uncharted_c.y; + float A = tone_uncharted_a.x * ExposureBias * ExposureBias; + float B = tone_uncharted_a.y * ExposureBias; float C = tone_uncharted_a.z; float D = tone_uncharted_b.x; float E = tone_uncharted_b.y; @@ -241,8 +205,7 @@ vec3 Uncharted2Tonemap(vec3 x) vec3 uncharted2(vec3 col) { - float ExposureBias = tone_uncharted_c.y; - return Uncharted2Tonemap(ExposureBias*col)/Uncharted2Tonemap(vec3(tone_uncharted_c.x));; + return Uncharted2Tonemap(col)/Uncharted2Tonemap(vec3(tone_uncharted_c.x)); } //================================= @@ -301,6 +264,8 @@ float legacyGammaApprox() return gc/c * gamma; } +vec3 legacy_adjust_post(vec3 c); + void main() { vec4 diff = texture(diffuseRect, vary_fragcoord); @@ -308,51 +273,23 @@ void main() float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r; diff.rgb *= exposure * exp_scale * legacyGammaApprox(); - #if TONEMAP_METHOD == 0 // None, Gamma Correct Only - #define NEEDS_GAMMA_CORRECT 1 - #elif TONEMAP_METHOD == 1 // Linear - #define NEEDS_GAMMA_CORRECT 1 - diff.rgb = clamp(diff.rgb, 0, 1); - #elif TONEMAP_METHOD == 2 // Reinhard method - #define NEEDS_GAMMA_CORRECT 1 - diff.rgb = reinhard(diff.rgb); - #elif TONEMAP_METHOD == 3 // Reinhard2 method - #define NEEDS_GAMMA_CORRECT 1 - diff.rgb = reinhard2(diff.rgb); - #elif TONEMAP_METHOD == 4 // Filmic method - #define NEEDS_GAMMA_CORRECT 0 - diff.rgb = filmic(diff.rgb); - #elif TONEMAP_METHOD == 5 // Unreal method - #define NEEDS_GAMMA_CORRECT 0 - diff.rgb = unreal(diff.rgb); - #elif TONEMAP_METHOD == 6 // Aces Narkowicz method - #define NEEDS_GAMMA_CORRECT 1 - diff.rgb = ACES_Narkowicz(diff.rgb); - #elif TONEMAP_METHOD == 10 // Aces Hill method - #define NEEDS_GAMMA_CORRECT 1 +#if TONEMAP_METHOD == 1 // Aces Hill method diff.rgb *= 1.0/0.6; diff.rgb = ACES_Hill(diff.rgb); - #elif TONEMAP_METHOD == 7 // Uchimura's Gran Turismo method - #define NEEDS_GAMMA_CORRECT 1 +#elif TONEMAP_METHOD == 2 // Uchimura's Gran Turismo method diff.rgb = uchimura(diff.rgb); - #elif TONEMAP_METHOD == 8 // AMD Tonemapper - #define NEEDS_GAMMA_CORRECT 1 +#elif TONEMAP_METHOD == 3 // AMD Tonemapper diff.rgb = AMDTonemapper(diff.rgb); - #elif TONEMAP_METHOD == 9 // Uncharted - #define NEEDS_GAMMA_CORRECT 1 +#elif TONEMAP_METHOD == 4 // Uncharted diff.rgb = uncharted2(diff.rgb); - #else - #define NEEDS_GAMMA_CORRECT 1 - #endif +#endif // We should always be 0-1 past here. diff.rgb = clamp(diff.rgb, 0, 1); - - #if NEEDS_GAMMA_CORRECT != 0 diff.rgb = linear_to_srgb(diff.rgb); - #endif - - #if COLOR_GRADE_LUT != 0 + diff.rgb = legacy_adjust_post(diff.rgb); + +#if COLOR_GRADE_LUT != 0 // Invert coord for compat with DX-style LUT diff.g = colorgrade_lut_size.y > 0.5 ? 1.0 - diff.g : diff.g; @@ -363,7 +300,7 @@ void main() vec3 scale = (vec3(colorgrade_lut_size.x) - 1.0) / vec3(colorgrade_lut_size.x); vec3 offset = 1.0 / (2.0 * vec3(colorgrade_lut_size.x)); diff = vec4(textureLod(colorgrade_lut, scale * diff.rgb + offset, 0).rgb, diff.a); - #endif +#endif vec2 tc = vary_fragcoord.xy*screen_res*4.0; vec3 seed = (diff.rgb+vec3(1.0))*vec3(tc.xy, tc.x+tc.y); diff --git a/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml b/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml index 52b506056ab26382e98047afe57d2546a6677bfa..1a566180660836059cf99261a4e4e4861ccba079 100644 --- a/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_lightbox_settings.xml @@ -311,47 +311,21 @@ top_pad="-16" width="80"> <combo_box.item - label="Linear" - name="toneLinear" + label="ACES" + name="toneACES" 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="toneACESNark" - value="6" /> - <combo_box.item - label="ACES Hill" - name="toneACESHill" - value="10" /> <combo_box.item label="Uchimura" name="toneUchimura" - value="7" /> + value="2" /> <combo_box.item label="AMD Tonemapper" name="toneAMD" - value="8" /> + value="3" /> <combo_box.item label="Uncharted" name="toneUncharted" - value="9" /> - <combo_box.commit_callback - function="LightBox.TonemapperSelect" /> + value="4" /> </combo_box> <button name="exposure_default_btn" @@ -429,32 +403,21 @@ left_delta="100" right="-55" show_text="false" - name="tonemapper_dynamic_slider1" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> + name="tonemapper_dynamic_slider1" /> <spinner visible="false" top_pad="-20" height="15" label_width="0" right="-1" - decimal_digits="1" + decimal_digits="2" follows="top|right" layout="topleft" max_val="1.0" min_val="0.0" width="55" increment=".1" - name="tonemapper_dynamic_spinner1" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> - + name="tonemapper_dynamic_spinner1" /> <text visible="false" name="tonemapper_dynamic_text2" @@ -477,31 +440,21 @@ left_delta="100" right="-55" show_text="false" - name="tonemapper_dynamic_slider2" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> + name="tonemapper_dynamic_slider2" /> <spinner visible="false" top_pad="-20" height="15" label_width="0" right="-1" - decimal_digits="1" + decimal_digits="2" follows="top|right" layout="topleft" max_val="1.0" min_val="0.0" width="55" increment=".1" - name="tonemapper_dynamic_spinner2" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> + name="tonemapper_dynamic_spinner2" /> <text visible="false" name="tonemapper_dynamic_text3" @@ -524,31 +477,21 @@ left_delta="100" right="-55" show_text="false" - name="tonemapper_dynamic_slider3" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> + name="tonemapper_dynamic_slider3" /> <spinner visible="false" top_pad="-20" height="15" label_width="0" right="-1" - decimal_digits="1" + decimal_digits="2" follows="top|right" layout="topleft" max_val="1.0" min_val="0.0" width="55" increment=".1" - name="tonemapper_dynamic_spinner3" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> + name="tonemapper_dynamic_spinner3" /> <text visible="false" name="tonemapper_dynamic_text4" @@ -571,31 +514,21 @@ left_delta="100" right="-55" show_text="false" - name="tonemapper_dynamic_slider4" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> + name="tonemapper_dynamic_slider4" /> <spinner visible="false" top_pad="-20" height="15" label_width="0" right="-1" - decimal_digits="1" + decimal_digits="2" follows="top|right" layout="topleft" max_val="1.0" min_val="0.0" width="55" increment=".1" - name="tonemapper_dynamic_spinner4" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> + name="tonemapper_dynamic_spinner4" /> <text visible="false" name="tonemapper_dynamic_text5" @@ -618,31 +551,21 @@ left_delta="100" right="-55" show_text="false" - name="tonemapper_dynamic_slider5" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> + name="tonemapper_dynamic_slider5" /> <spinner visible="false" top_pad="-20" height="15" label_width="0" right="-1" - decimal_digits="1" + decimal_digits="2" follows="top|right" layout="topleft" max_val="1.0" min_val="0.0" width="55" increment=".1" - name="tonemapper_dynamic_spinner5" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> + name="tonemapper_dynamic_spinner5" /> <text visible="false" name="tonemapper_dynamic_text6" @@ -665,31 +588,21 @@ left_delta="100" right="-55" show_text="false" - name="tonemapper_dynamic_slider6" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> + name="tonemapper_dynamic_slider6" /> <spinner visible="false" top_pad="-20" height="15" label_width="0" right="-1" - decimal_digits="1" + decimal_digits="2" follows="top|right" layout="topleft" max_val="1.0" min_val="0.0" width="55" increment=".1" - name="tonemapper_dynamic_spinner6" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> + name="tonemapper_dynamic_spinner6" /> <text visible="false" name="tonemapper_dynamic_text7" @@ -712,79 +625,21 @@ left_delta="100" right="-55" show_text="false" - name="tonemapper_dynamic_slider7" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> - <spinner - visible="false" - top_pad="-20" - height="15" - label_width="0" - right="-1" - decimal_digits="1" - follows="top|right" - layout="topleft" - max_val="1.0" - min_val="0.0" - width="55" - increment=".1" - name="tonemapper_dynamic_spinner7" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> - <text - visible="false" - name="tonemapper_dynamic_text8" - follows="left|top" - height="15" - left="30" - top_pad="10" - width="100" - layout="topleft" - value="TonemapD8:" /> - <slider - visible="false" - top_pad="-18" - height="20" - increment=".1" - follows="left|top|right" - layout="topleft" - max_val="1.0" - min_val="0.0" - left_delta="100" - right="-55" - show_text="false" - name="tonemapper_dynamic_slider8" - control_name=""> - <slider.commit_callback - function="LightBox.TonemapperCommit" - parameter="slider" /> - </slider> + name="tonemapper_dynamic_slider7" /> <spinner visible="false" top_pad="-20" height="15" label_width="0" right="-1" - decimal_digits="1" + decimal_digits="2" follows="top|right" layout="topleft" max_val="1.0" min_val="0.0" width="55" increment=".1" - name="tonemapper_dynamic_spinner8" - control_name=""> - <spinner.commit_callback - function="LightBox.TonemapperCommit" - parameter="spinner" /> - </spinner> - + name="tonemapper_dynamic_spinner7" /> </panel> <!--Rendering Panel--> <panel