226 lines
7.7 KiB
C++
226 lines
7.7 KiB
C++
/**
|
|
* @file lldensityctrl.cpp
|
|
* @brief Control for specifying density over a height range for sky settings.
|
|
*
|
|
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
|
* Second Life Viewer Source Code
|
|
* Copyright (C) 2011, Linden Research, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation;
|
|
* version 2.1 of the License only.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
|
|
#include "lldensityctrl.h"
|
|
|
|
#include "llslider.h"
|
|
#include "llsliderctrl.h"
|
|
#include "llsettingssky.h"
|
|
|
|
static LLDefaultChildRegistry::Register<LLDensityCtrl> register_density_control("densityctrl");
|
|
|
|
const std::string LLDensityCtrl::DENSITY_RAYLEIGH("density_rayleigh");
|
|
const std::string LLDensityCtrl::DENSITY_MIE("density_mie");
|
|
const std::string LLDensityCtrl::DENSITY_ABSORPTION("density_absorption");
|
|
|
|
namespace
|
|
{
|
|
const std::string FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL("level_exponential");
|
|
const std::string FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL_SCALE("exponential_scale");
|
|
const std::string FIELD_SKY_DENSITY_PROFILE_LINEAR("level_linear");
|
|
const std::string FIELD_SKY_DENSITY_PROFILE_CONSTANT("level_constant");
|
|
const std::string FIELD_SKY_DENSITY_MAX_ALTITUDE("max_altitude");
|
|
const std::string FIELD_SKY_DENSITY_ANISO_FACTOR("aniso_factor");
|
|
const std::string FIELD_SKY_DENSITY_ANISO_FACTOR_LABEL("aniso_factor_label");
|
|
}
|
|
|
|
const std::string& LLDensityCtrl::NameForDensityProfileType(DensityProfileType t)
|
|
{
|
|
switch (t)
|
|
{
|
|
case Rayleigh: return DENSITY_RAYLEIGH;
|
|
case Mie: return DENSITY_MIE;
|
|
case Absorption: return DENSITY_ABSORPTION;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
llassert(false);
|
|
return DENSITY_RAYLEIGH;
|
|
}
|
|
|
|
LLDensityCtrl::Params::Params()
|
|
: image_density_feedback("image_density_feedback")
|
|
, lbl_exponential("label_exponential")
|
|
, lbl_exponential_scale("label_exponential_scale")
|
|
, lbl_linear("label_linear")
|
|
, lbl_constant("label_constant")
|
|
, lbl_max_altitude("label_max_altitude")
|
|
, lbl_aniso_factor("label_aniso_factor")
|
|
, profile_type(LLDensityCtrl::Rayleigh)
|
|
{
|
|
}
|
|
|
|
LLDensityCtrl::LLDensityCtrl(const Params& params)
|
|
: mProfileType(params.profile_type)
|
|
, mImgDensityFeedback(params.image_density_feedback)
|
|
{
|
|
|
|
}
|
|
|
|
LLSD LLDensityCtrl::getProfileConfig()
|
|
{
|
|
LLSD config;
|
|
switch (mProfileType)
|
|
{
|
|
case Rayleigh: return mSkySettings->getRayleighConfigs();
|
|
case Mie: return mSkySettings->getMieConfigs();
|
|
case Absorption: return mSkySettings->getAbsorptionConfigs();
|
|
default:
|
|
break;
|
|
}
|
|
llassert(false);
|
|
return config;
|
|
}
|
|
|
|
BOOL LLDensityCtrl::postBuild()
|
|
{
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onExponentialChanged(); });
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL_SCALE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onExponentialScaleFactorChanged(); });
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_LINEAR)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onLinearChanged(); });
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_CONSTANT)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onConstantChanged(); });
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_MAX_ALTITUDE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onMaxAltitudeChanged(); });
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_ANISO_FACTOR)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onAnisoFactorChanged(); });
|
|
|
|
if (mProfileType != Mie)
|
|
{
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_ANISO_FACTOR_LABEL)->setValue(false);
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_ANISO_FACTOR)->setVisible(false);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void LLDensityCtrl::setEnabled(BOOL enabled)
|
|
{
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL)->setEnabled(enabled);
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL_SCALE)->setEnabled(enabled);
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_LINEAR)->setEnabled(enabled);
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_PROFILE_CONSTANT)->setEnabled(enabled);
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_MAX_ALTITUDE)->setEnabled(enabled);
|
|
|
|
if (mProfileType == Mie)
|
|
{
|
|
getChild<LLUICtrl>(FIELD_SKY_DENSITY_ANISO_FACTOR)->setEnabled(enabled);
|
|
}
|
|
}
|
|
|
|
void LLDensityCtrl::refresh()
|
|
{
|
|
if (!mSkySettings)
|
|
{
|
|
setAllChildrenEnabled(FALSE);
|
|
setEnabled(FALSE);
|
|
return;
|
|
}
|
|
|
|
setEnabled(TRUE);
|
|
setAllChildrenEnabled(TRUE);
|
|
|
|
LLSD config = getProfileConfig();
|
|
|
|
getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL)->setValue(config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_TERM]);
|
|
getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL_SCALE)->setValue(config[LLSettingsSky::SETTING_DENSITY_PROFILE_EXP_SCALE_FACTOR]);
|
|
getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_LINEAR)->setValue(config[LLSettingsSky::SETTING_DENSITY_PROFILE_LINEAR_TERM]);
|
|
getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_CONSTANT)->setValue(config[LLSettingsSky::SETTING_DENSITY_PROFILE_CONSTANT_TERM]);
|
|
getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_MAX_ALTITUDE)->setValue(config[LLSettingsSky::SETTING_DENSITY_PROFILE_WIDTH]);
|
|
|
|
if (mProfileType == Mie)
|
|
{
|
|
getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_ANISO_FACTOR)->setValue(config[LLSettingsSky::SETTING_MIE_ANISOTROPY_FACTOR]);
|
|
}
|
|
}
|
|
|
|
void LLDensityCtrl::updateProfile()
|
|
{
|
|
F32 exponential_term = getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL)->getValueF32();
|
|
F32 exponential_scale = getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_EXPONENTIAL_SCALE)->getValueF32();
|
|
F32 linear_term = getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_LINEAR)->getValueF32();
|
|
F32 constant_term = getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_PROFILE_CONSTANT)->getValueF32();
|
|
F32 max_alt = getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_MAX_ALTITUDE)->getValueF32();
|
|
F32 aniso_factor = 0.0f;
|
|
|
|
if (mProfileType == Mie)
|
|
{
|
|
aniso_factor = getChild<LLSliderCtrl>(FIELD_SKY_DENSITY_ANISO_FACTOR)->getValueF32();
|
|
}
|
|
|
|
LLSD profile = LLSettingsSky::createSingleLayerDensityProfile(max_alt, exponential_term, exponential_scale, linear_term, constant_term, aniso_factor);
|
|
|
|
switch (mProfileType)
|
|
{
|
|
case Rayleigh: mSkySettings->setRayleighConfigs(profile); break;
|
|
case Mie: mSkySettings->setMieConfigs(profile); break;
|
|
case Absorption: mSkySettings->setAbsorptionConfigs(profile); break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void LLDensityCtrl::onExponentialChanged()
|
|
{
|
|
updateProfile();
|
|
updatePreview();
|
|
}
|
|
|
|
void LLDensityCtrl::onExponentialScaleFactorChanged()
|
|
{
|
|
updateProfile();
|
|
updatePreview();
|
|
}
|
|
|
|
void LLDensityCtrl::onLinearChanged()
|
|
{
|
|
updateProfile();
|
|
updatePreview();
|
|
}
|
|
|
|
void LLDensityCtrl::onConstantChanged()
|
|
{
|
|
updateProfile();
|
|
updatePreview();
|
|
}
|
|
|
|
void LLDensityCtrl::onMaxAltitudeChanged()
|
|
{
|
|
updateProfile();
|
|
updatePreview();
|
|
}
|
|
|
|
void LLDensityCtrl::onAnisoFactorChanged()
|
|
{
|
|
updateProfile();
|
|
}
|
|
|
|
void LLDensityCtrl::updatePreview()
|
|
{
|
|
// AdvancedAtmospherics TODO
|
|
// Generate image according to current density profile
|
|
}
|
|
|