diff options
| author | Graham Linden <graham@lindenlab.com> | 2018-10-09 18:44:43 +0100 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2018-10-09 18:44:43 +0100 | 
| commit | f8aac192378462b5824d28808ed84833e2cbfe0f (patch) | |
| tree | 8b2cfff19afd6fce5e514471e59d3c1496653191 /indra/newview | |
| parent | 8c4258009b09f16751437d0549067ab2950e725a (diff) | |
SL-1289
add cloud_variance control for randomized perturbance of clouds to break up tiling monotony
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl | 13 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl | 31 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl | 37 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolwlsky.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llpaneleditsky.cpp | 12 | ||||
| -rw-r--r-- | indra/newview/llpaneleditsky.h | 1 | ||||
| -rw-r--r-- | indra/newview/llsettingsvo.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml | 25 | 
8 files changed, 93 insertions, 36 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl index c1a9a6f454..caedd25221 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl @@ -44,6 +44,8 @@ uniform float blend_factor;  uniform vec4 cloud_pos_density1;  uniform vec4 cloud_pos_density2;  uniform vec4 gamma; +uniform float cloud_scale; +uniform float cloud_variance;  VARYING vec2 vary_texcoord0;  VARYING vec2 vary_texcoord1; @@ -73,16 +75,19 @@ void main()  	vec2 uv3 = vary_texcoord2.xy;  	vec2 uv4 = vary_texcoord3.xy; +    vec2 disturbance = vec2(cloudNoise(uv1 / 16.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); +  	// Offset texture coords -	uv1 += cloud_pos_density1.xy;	//large texture, visible density +	uv1 += cloud_pos_density1.xy + disturbance;	//large texture, visible density  	uv2 += cloud_pos_density1.xy;	//large texture, self shadow -	uv3 += cloud_pos_density2.xy;	//small texture, visible density +	uv3 += cloud_pos_density2.xy + disturbance;	//small texture, visible density  	uv4 += cloud_pos_density2.xy;	//small texture, self shadow  	// Compute alpha1, the main cloud opacity +  	float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; -	alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.); +	alpha1 = min(max(alpha1 + cloudDensity, 0.) * (10. + disturbance.y) * cloud_pos_density1.z, 1.);  	// And smooth  	alpha1 = 1. - alpha1 * alpha1; @@ -96,7 +101,7 @@ void main()  	// Compute alpha2, for self shadowing effect  	// (1 - alpha2) will later be used as percentage of incoming sunlight  	float alpha2 = (cloudNoise(uv2).x - 0.5); -	alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); +	alpha2 = min(max(alpha2 + cloudDensity, 0.) * (2.5 + disturbance.x) * cloud_pos_density1.z, 1.);  	// And smooth  	alpha2 = 1. - alpha2; diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl index 24fdb45749..cdd84faba9 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl @@ -36,10 +36,6 @@ out vec4 frag_color;  VARYING vec4 vary_CloudColorSun;  VARYING vec4 vary_CloudColorAmbient;  VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3;  uniform sampler2D cloud_noise_texture;  uniform sampler2D cloud_noise_texture_next; @@ -47,16 +43,23 @@ uniform float blend_factor;  uniform vec4 cloud_pos_density1;  uniform vec4 cloud_pos_density2;  uniform vec4 gamma; +uniform float cloud_scale; +uniform float cloud_variance; + +VARYING vec2 vary_texcoord0; +VARYING vec2 vary_texcoord1; +VARYING vec2 vary_texcoord2; +VARYING vec2 vary_texcoord3;  /// Soft clips the light with a gamma correction  vec3 scaleSoftClip(vec3 light);  vec4 cloudNoise(vec2 uv)  { -    vec4 a = texture2D(cloud_noise_texture, uv); -    vec4 b = texture2D(cloud_noise_texture_next, uv); -    vec4 samp = mix(a, b, blend_factor); -	return samp; +   vec4 a = texture2D(cloud_noise_texture, uv); +   vec4 b = texture2D(cloud_noise_texture_next, uv); +   vec4 cloud_noise_sample = mix(a, b, blend_factor); +   return cloud_noise_sample;  }  void main() @@ -71,26 +74,28 @@ void main()  	vec2 uv3 = vary_texcoord2.xy;  	vec2 uv4 = vary_texcoord3.xy; +    vec2 disturbance = vec2(cloudNoise(uv1 / 16.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); +  	// Offset texture coords -	uv1 += cloud_pos_density1.xy;	//large texture, visible density +	uv1 += cloud_pos_density1.xy + disturbance;	//large texture, visible density  	uv2 += cloud_pos_density1.xy;	//large texture, self shadow -	uv3 += cloud_pos_density2.xy;	//small texture, visible density +	uv3 += cloud_pos_density2.xy + disturbance;	//small texture, visible density  	uv4 += cloud_pos_density2.xy;	//small texture, self shadow  	// Compute alpha1, the main cloud opacity +  	float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; -	alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.); +	alpha1 = min(max(alpha1 + cloudDensity, 0.) * (10. + disturbance.y) * cloud_pos_density1.z, 1.);  	// And smooth  	alpha1 = 1. - alpha1 * alpha1;  	alpha1 = 1. - alpha1 * alpha1;	 -  	// Compute alpha2, for self shadowing effect  	// (1 - alpha2) will later be used as percentage of incoming sunlight  	float alpha2 = (cloudNoise(uv2).x - 0.5); -	alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); +	alpha2 = min(max(alpha2 + cloudDensity, 0.) * (2.5 + disturbance.x) * cloud_pos_density1.z, 1.);  	// And smooth  	alpha2 = 1. - alpha2; diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl index d9fcc0a9ea..9f06319da3 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl @@ -36,10 +36,6 @@ out vec4 frag_color;  VARYING vec4 vary_CloudColorSun;  VARYING vec4 vary_CloudColorAmbient;  VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3;  uniform sampler2D cloud_noise_texture;  uniform sampler2D cloud_noise_texture_next; @@ -47,19 +43,25 @@ uniform float blend_factor;  uniform vec4 cloud_pos_density1;  uniform vec4 cloud_pos_density2;  uniform vec4 gamma; +uniform float cloud_scale; +uniform float cloud_variance; -vec4 cloudNoise(vec2 uv) -{ -	vec4 a = texture2D(cloud_noise_texture, uv); -	vec4 b = texture2D(cloud_noise_texture_next, uv); -    vec4 samp = mix(a, b, blend_factor); -	return samp; -} - +VARYING vec2 vary_texcoord0; +VARYING vec2 vary_texcoord1; +VARYING vec2 vary_texcoord2; +VARYING vec2 vary_texcoord3;  /// Soft clips the light with a gamma correction  vec3 scaleSoftClip(vec3 light); +vec4 cloudNoise(vec2 uv) +{ +   vec4 a = texture2D(cloud_noise_texture, uv); +   vec4 b = texture2D(cloud_noise_texture_next, uv); +   vec4 cloud_noise_sample = mix(a, b, blend_factor); +   return cloud_noise_sample; +} +  void main()  {  	// Set variables @@ -72,16 +74,19 @@ void main()  	vec2 uv3 = vary_texcoord2.xy;  	vec2 uv4 = vary_texcoord3.xy; +    vec2 disturbance = vec2(cloudNoise(uv1 / 16.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); +  	// Offset texture coords -	uv1 += cloud_pos_density1.xy;	//large texture, visible density +	uv1 += cloud_pos_density1.xy + disturbance;	//large texture, visible density  	uv2 += cloud_pos_density1.xy;	//large texture, self shadow -	uv3 += cloud_pos_density2.xy;	//small texture, visible density +	uv3 += cloud_pos_density2.xy + disturbance;	//small texture, visible density  	uv4 += cloud_pos_density2.xy;	//small texture, self shadow  	// Compute alpha1, the main cloud opacity +  	float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; -	alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10. * cloud_pos_density1.z, 1.); +	alpha1 = min(max(alpha1 + cloudDensity, 0.) * (10. + disturbance.y) * cloud_pos_density1.z, 1.);  	// And smooth  	alpha1 = 1. - alpha1 * alpha1; @@ -91,7 +96,7 @@ void main()  	// Compute alpha2, for self shadowing effect  	// (1 - alpha2) will later be used as percentage of incoming sunlight  	float alpha2 = (cloudNoise(uv2).x - 0.5); -	alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); +	alpha2 = min(max(alpha2 + cloudDensity, 0.) * (2.5 + disturbance.x) * cloud_pos_density1.z, 1.);  	// And smooth  	alpha2 = 1. - alpha2; diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index b89588a463..b9e041a3d5 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -394,8 +394,13 @@ void LLDrawPoolWLSky::renderSkyClouds(const LLVector3& camPosLocal, F32 camHeigh          cloud_shader->bindTexture(LLShaderMgr::CLOUD_NOISE_MAP, gSky.mVOSkyp->getCloudNoiseTex());          cloud_shader->bindTexture(LLShaderMgr::CLOUD_NOISE_MAP_NEXT, gSky.mVOSkyp->getCloudNoiseTexNext()); -        F32 blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor(); +        LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); + +        F32 blend_factor   = psky ? psky->getBlendFactor()   : 0.0f; +        F32 cloud_variance = psky ? psky->getCloudVariance() : 0.0f; +          cloud_shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor); +        cloud_shader->uniform1f(LLShaderMgr::CLOUD_VARIANCE, cloud_variance);  		/// Render the skydome          renderDome(camPosLocal, camHeightLocal, cloud_shader); diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp index 0d8c9a988a..d0e916363d 100644 --- a/indra/newview/llpaneleditsky.cpp +++ b/indra/newview/llpaneleditsky.cpp @@ -53,6 +53,8 @@ namespace      const std::string   FIELD_SKY_CLOUD_COLOR("cloud_color");      const std::string   FIELD_SKY_CLOUD_COVERAGE("cloud_coverage");      const std::string   FIELD_SKY_CLOUD_SCALE("cloud_scale"); +    const std::string   FIELD_SKY_CLOUD_VARIANCE("cloud_variance"); +      const std::string   FIELD_SKY_CLOUD_SCROLL_XY("cloud_scroll_xy");      const std::string   FIELD_SKY_CLOUD_MAP("cloud_map");      const std::string   FIELD_SKY_CLOUD_DENSITY_X("cloud_density_x"); @@ -254,6 +256,8 @@ BOOL LLPanelSettingsSkyCloudTab::postBuild()      getChild<LLUICtrl>(FIELD_SKY_CLOUD_COLOR)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudColorChanged(); });      getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudCoverageChanged(); });      getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudScaleChanged(); }); +    getChild<LLUICtrl>(FIELD_SKY_CLOUD_VARIANCE)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudVarianceChanged(); }); +      getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCROLL_XY)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudScrollChanged(); });      getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setCommitCallback([this](LLUICtrl *, const LLSD &) { onCloudMapChanged(); });      getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setDefaultImageAssetID(LLSettingsSky::GetDefaultCloudNoiseTextureId()); @@ -278,6 +282,7 @@ void LLPanelSettingsSkyCloudTab::setEnabled(BOOL enabled)      LLPanelSettingsSky::setEnabled(enabled);      getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->setEnabled(enabled);      getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->setEnabled(enabled); +    getChild<LLUICtrl>(FIELD_SKY_CLOUD_VARIANCE)->setEnabled(enabled);      getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_X)->setEnabled(enabled);      getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_Y)->setEnabled(enabled);      getChild<LLUICtrl>(FIELD_SKY_CLOUD_DENSITY_D)->setEnabled(enabled); @@ -301,6 +306,7 @@ void LLPanelSettingsSkyCloudTab::refresh()      getChild<LLColorSwatchCtrl>(FIELD_SKY_CLOUD_COLOR)->set(mSkySettings->getCloudColor());      getChild<LLUICtrl>(FIELD_SKY_CLOUD_COVERAGE)->setValue(mSkySettings->getCloudShadow());      getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCALE)->setValue(mSkySettings->getCloudScale()); +    getChild<LLUICtrl>(FIELD_SKY_CLOUD_VARIANCE)->setValue(mSkySettings->getCloudVariance());      LLVector2 cloudScroll(mSkySettings->getCloudScrollRate());      getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCROLL_XY)->setValue(cloudScroll.getValue()); @@ -339,6 +345,12 @@ void LLPanelSettingsSkyCloudTab::onCloudScaleChanged()      setIsDirty();  } +void LLPanelSettingsSkyCloudTab::onCloudVarianceChanged() +{ +    mSkySettings->setCloudVariance(getChild<LLUICtrl>(FIELD_SKY_CLOUD_VARIANCE)->getValue().asReal()); +    setIsDirty(); +} +  void LLPanelSettingsSkyCloudTab::onCloudScrollChanged()  {      LLVector2 scroll(getChild<LLUICtrl>(FIELD_SKY_CLOUD_SCROLL_XY)->getValue()); diff --git a/indra/newview/llpaneleditsky.h b/indra/newview/llpaneleditsky.h index 829a65dae5..002586b550 100644 --- a/indra/newview/llpaneleditsky.h +++ b/indra/newview/llpaneleditsky.h @@ -95,6 +95,7 @@ private:      void                    onCloudColorChanged();      void                    onCloudCoverageChanged();      void                    onCloudScaleChanged(); +    void                    onCloudVarianceChanged();      void                    onCloudScrollChanged();      void                    onCloudMapChanged();      void                    onCloudDensityChanged(); diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 386a5deec6..17384a3a6b 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -657,10 +657,11 @@ LLSettingsSky::parammapping_t LLSettingsVOSky::getParameterMap() const          param_map[SETTING_CLOUD_POS_DENSITY2] = LLShaderMgr::CLOUD_POS_DENSITY2;          param_map[SETTING_CLOUD_SCALE] = LLShaderMgr::CLOUD_SCALE;          param_map[SETTING_CLOUD_SHADOW] = LLShaderMgr::CLOUD_SHADOW;        +        param_map[SETTING_CLOUD_VARIANCE] = LLShaderMgr::CLOUD_VARIANCE;          param_map[SETTING_GLOW] = LLShaderMgr::GLOW;                  param_map[SETTING_MAX_Y] = LLShaderMgr::MAX_Y;          param_map[SETTING_SUNLIGHT_COLOR] = LLShaderMgr::SUNLIGHT_COLOR; - +        param_map[SETTING_MOON_BRIGHTNESS] = LLShaderMgr::MOON_BRIGHTNESS;          param_map[SETTING_SKY_MOISTURE_LEVEL] = LLShaderMgr::MOISTURE_LEVEL;          param_map[SETTING_SKY_DROPLET_RADIUS] = LLShaderMgr::DROPLET_RADIUS;          param_map[SETTING_SKY_ICE_LEVEL] = LLShaderMgr::ICE_LEVEL; diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml index 886e3c1e04..325df39f87 100644 --- a/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml +++ b/indra/newview/skins/default/xui/en/panel_settings_sky_clouds.xml @@ -95,6 +95,29 @@                      left_delta="-5"                      top_delta="25"                      width="200"> +                Cloud Variance: +            </text> +            <slider +                    decimal_digits="2" +                    follows="left|top" +                    height="16" +                    increment="0.01" +                    initial_value="0" +                    layout="topleft" +                    left_delta="5" +                    min_val="0" +                    max_val="1.0" +                    name="cloud_variance" +                    top_delta="20" +                    width="214" +                    can_edit_text="true"/> +            <text +                    follows="left|top" +                    height="10" +                    layout="topleft" +                    left_delta="-5" +                    top_delta="25" +                    width="200">                  Cloud Scroll:              </text>              <xy_vector @@ -244,4 +267,4 @@                      can_edit_text="true"/>          </layout_panel>      </layout_stack> -</panel>                
\ No newline at end of file +</panel>                 | 
