summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llinventory/llsettingssky.cpp15
-rw-r--r--indra/llinventory/llsettingssky.h2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/starsF.glsl6
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp47
-rw-r--r--indra/newview/llsettingsvo.cpp1
-rw-r--r--indra/newview/llsky.cpp7
-rw-r--r--indra/newview/llsky.h1
-rw-r--r--indra/newview/llvosky.cpp38
-rw-r--r--indra/newview/llvosky.h15
9 files changed, 109 insertions, 23 deletions
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index d73ae5721a..2f5216eba9 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -382,7 +382,8 @@ LLSettingsSky::LLSettingsSky(const LLSD &data) :
LLSettingsBase(data),
mNextSunTextureId(),
mNextMoonTextureId(),
- mNextCloudTextureId()
+ mNextCloudTextureId(),
+ mNextBloomTextureId()
{
}
@@ -390,7 +391,8 @@ LLSettingsSky::LLSettingsSky():
LLSettingsBase(),
mNextSunTextureId(),
mNextMoonTextureId(),
- mNextCloudTextureId()
+ mNextCloudTextureId(),
+ mNextBloomTextureId()
{
}
@@ -412,6 +414,7 @@ void LLSettingsSky::blend(const LLSettingsBase::ptr_t &end, F64 blendf)
mNextSunTextureId = other->getSunTextureId();
mNextMoonTextureId = other->getMoonTextureId();
mNextCloudTextureId = other->getCloudNoiseTextureId();
+ mNextBloomTextureId = other->getBloomTextureId();
}
else
{
@@ -637,7 +640,7 @@ LLSD LLSettingsSky::defaults(const LLSettingsBase::TrackPosition& position)
dfltsetting[SETTING_SUNLIGHT_COLOR] = LLColor4(0.7342, 0.7815, 0.8999, 0.0).getValue();
dfltsetting[SETTING_SUN_ROTATION] = sunquat.getValue();
- dfltsetting[SETTING_BLOOM_TEXTUREID] = IMG_BLOOM1;
+ dfltsetting[SETTING_BLOOM_TEXTUREID] = GetDefaultBloomTextureId();
dfltsetting[SETTING_CLOUD_TEXTUREID] = GetDefaultCloudNoiseTextureId();
dfltsetting[SETTING_MOON_TEXTUREID] = GetDefaultMoonTextureId();
dfltsetting[SETTING_SUN_TEXTUREID] = GetDefaultSunTextureId();
@@ -1366,3 +1369,9 @@ LLUUID LLSettingsSky::getNextCloudNoiseTextureId() const
{
return mNextCloudTextureId;
}
+
+LLUUID LLSettingsSky::getNextBloomTextureId() const
+{
+ return mNextBloomTextureId;
+}
+
diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h
index e7b4678f7f..00b7c5b37b 100644
--- a/indra/llinventory/llsettingssky.h
+++ b/indra/llinventory/llsettingssky.h
@@ -183,6 +183,7 @@ public:
LLUUID getNextSunTextureId() const;
LLUUID getNextMoonTextureId() const;
LLUUID getNextCloudNoiseTextureId() const;
+ LLUUID getNextBloomTextureId() const;
//=====================================================================
virtual void loadTextures() { };
@@ -272,6 +273,7 @@ private:
LLUUID mNextSunTextureId;
LLUUID mNextMoonTextureId;
LLUUID mNextCloudTextureId;
+ LLUUID mNextBloomTextureId;
typedef std::map<std::string, S32> mapNameToUniformId_t;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
index 7f55d020d4..d6a1edbf42 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl
@@ -35,12 +35,16 @@ VARYING vec4 vertex_color;
VARYING vec2 vary_texcoord0;
uniform sampler2D diffuseMap;
+uniform sampler2D altDiffuseMap;
+uniform float blend_factor;
uniform float custom_alpha;
uniform vec4 sunlight_color;
void main()
{
- vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
+ vec4 col_a = texture2D(diffuseMap, vary_texcoord0.xy);
+ vec4 col_b = texture2D(diffuseMap, vary_texcoord0.xy);
+ vec4 col = mix(col_a, col_b, blend_factor);
col.rgb *= vertex_color.rgb;
col.a *= custom_alpha;
frag_color = col;
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index 8c9207a6de..3557f5a1ce 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -238,7 +238,22 @@ void LLDrawPoolWLSky::renderStars(void) const
return;
}
- gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
+ LLViewerTexture* tex_a = gSky.mVOSkyp->getBloomTex();
+ LLViewerTexture* tex_b = gSky.mVOSkyp->getBloomTexNext();
+
+ if (tex_a && (!tex_b || (tex_a == tex_b)))
+ {
+ // Bind current and next sun textures
+ gGL.getTexUnit(0)->bind(tex_a);
+ }
+ else if (tex_b && !tex_a)
+ {
+ gGL.getTexUnit(0)->bind(tex_b);
+ }
+ else if (tex_b != tex_a)
+ {
+ gGL.getTexUnit(0)->bind(tex_a);
+ }
gGL.pushMatrix();
gGL.rotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
@@ -256,6 +271,8 @@ void LLDrawPoolWLSky::renderStars(void) const
gSky.mVOWLSkyp->drawStars();
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
gGL.popMatrix();
if (LLGLSLShader::sNoFixedFunction)
@@ -287,11 +304,37 @@ void LLDrawPoolWLSky::renderStarsDeferred(void) const
gDeferredStarProgram.bind();
- gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
+ LLViewerTexture* tex_a = gSky.mVOSkyp->getBloomTex();
+ LLViewerTexture* tex_b = gSky.mVOSkyp->getBloomTexNext();
+
+ F32 blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
+
+ if (tex_a && (!tex_b || (tex_a == tex_b)))
+ {
+ // Bind current and next sun textures
+ gGL.getTexUnit(0)->bind(tex_a);
+ gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
+ blend_factor = 0;
+ }
+ else if (tex_b && !tex_a)
+ {
+ gGL.getTexUnit(0)->bind(tex_b);
+ gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
+ blend_factor = 0;
+ }
+ else if (tex_b != tex_a)
+ {
+ gGL.getTexUnit(0)->bind(tex_a);
+ gGL.getTexUnit(1)->bind(tex_b);
+ }
+ gDeferredStarProgram.uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
gDeferredStarProgram.uniform1f(sCustomAlpha, star_alpha);
gSky.mVOWLSkyp->drawStars();
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
+
gDeferredStarProgram.unbind();
}
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index dba7e00b93..a5187b7363 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -538,6 +538,7 @@ void LLSettingsVOSky::updateSettings()
gSky.setSunTextures(getSunTextureId(), getNextSunTextureId());
gSky.setMoonTextures(getMoonTextureId(), getNextMoonTextureId());
gSky.setCloudNoiseTextures(getCloudNoiseTextureId(), getNextCloudNoiseTextureId());
+ gSky.setBloomTextures(getBloomTextureId(), getNextBloomTextureId());
}
void LLSettingsVOSky::applySpecial(void *ptarget)
diff --git a/indra/newview/llsky.cpp b/indra/newview/llsky.cpp
index 5d85778da5..9c7fc225a0 100644
--- a/indra/newview/llsky.cpp
+++ b/indra/newview/llsky.cpp
@@ -150,6 +150,13 @@ void LLSky::setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLUUI
}
}
+void LLSky::setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next)
+{
+ if(mVOSkyp.notNull()) {
+ mVOSkyp->setBloomTextures(bloom_texture, bloom_texture_next);
+ }
+}
+
void LLSky::setSunAndMoonDirectionsCFR(const LLVector3 &sun_direction, const LLVector3 &moon_direction)
{
if(mVOSkyp.notNull()) {
diff --git a/indra/newview/llsky.h b/indra/newview/llsky.h
index cc5db2c7ec..d2067a58bb 100644
--- a/indra/newview/llsky.h
+++ b/indra/newview/llsky.h
@@ -59,6 +59,7 @@ public:
void setSunTextures(const LLUUID& sun_texture, const LLUUID& sun_texture_next);
void setMoonTextures(const LLUUID& moon_texture, const LLUUID& moon_texture_next);
void setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLUUID& cloud_noise_texture_next);
+ void setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next);
LLColor4 getSkyFogColor() const;
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index b57652e3f5..e099b410bf 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -393,10 +393,6 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
mSun.setIntensity(SUN_INTENSITY);
mMoon.setIntensity(0.1f * SUN_INTENSITY);
- mBloomTexturep = LLViewerTextureManager::getFetchedTexture(LLSettingsSky::GetDefaultBloomTextureId());
- mBloomTexturep->setNoDelete() ;
- mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
-
mHeavenlyBodyUpdated = FALSE ;
mDrawRefl = 0;
@@ -492,10 +488,6 @@ void LLVOSky::restoreGL()
setMoonTextures(psky->getMoonTextureId(), psky->getNextMoonTextureId());
}
- mBloomTexturep = LLViewerTextureManager::getFetchedTexture(LLSettingsSky::GetDefaultBloomTextureId());
- mBloomTexturep->setNoDelete() ;
- mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
-
updateDirections();
if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap
@@ -762,9 +754,14 @@ void LLVOSky::updateTextures()
mMoonTexturep[1]->addTextureStats( (F32)MAX_IMAGE_AREA );
}
- if (mBloomTexturep)
+ if (mBloomTexturep[0])
+ {
+ mBloomTexturep[0]->addTextureStats( (F32)MAX_IMAGE_AREA );
+ }
+
+ if (mBloomTexturep[1])
{
- mBloomTexturep->addTextureStats( (F32)MAX_IMAGE_AREA );
+ mBloomTexturep[1]->addTextureStats( (F32)MAX_IMAGE_AREA );
}
}
@@ -858,6 +855,27 @@ void LLVOSky::setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLU
}
}
+void LLVOSky::setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next)
+{
+ LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+
+ LLUUID bloom_tex = bloom_texture.isNull() ? psky->GetDefaultBloomTextureId() : bloom_texture;
+ LLUUID bloom_tex_next = bloom_texture_next.isNull() ? (bloom_texture.isNull() ? psky->GetDefaultBloomTextureId() : bloom_texture) : bloom_texture_next;
+
+ mBloomTexturep[0] = LLViewerTextureManager::getFetchedTexture(bloom_tex, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
+ mBloomTexturep[1] = LLViewerTextureManager::getFetchedTexture(bloom_tex_next, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
+
+ if (mBloomTexturep[0])
+ {
+ mBloomTexturep[0]->setAddressMode(LLTexUnit::TAM_CLAMP);
+ }
+
+ if (mBloomTexturep[1])
+ {
+ mBloomTexturep[1]->setAddressMode(LLTexUnit::TAM_CLAMP);
+ }
+}
+
static LLTrace::BlockTimerStatHandle FTM_GEO_SKY("Sky Geometry");
BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index a9a59681ff..758a4a8c94 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -263,19 +263,20 @@ public:
bool isReflFace(const LLFace* face) const { return face == mFace[FACE_REFLECTION]; }
LLFace* getReflFace() const { return mFace[FACE_REFLECTION]; }
- LLViewerTexture* getSunTex() const { return mSunTexturep[0]; }
- LLViewerTexture* getMoonTex() const { return mMoonTexturep[0]; }
- LLViewerTexture* getBloomTex() const { return mBloomTexturep; }
+ LLViewerTexture* getSunTex() const { return mSunTexturep[0]; }
+ LLViewerTexture* getMoonTex() const { return mMoonTexturep[0]; }
+ LLViewerTexture* getBloomTex() const { return mBloomTexturep[0]; }
LLViewerTexture* getCloudNoiseTex() const { return mCloudNoiseTexturep[0]; }
- LLViewerTexture* getSunTexNext() const { return mSunTexturep[1]; }
- LLViewerTexture* getMoonTexNext() const { return mMoonTexturep[1]; }
- LLViewerTexture* getBloomTexNext() const { return mBloomTexturep; }
+ LLViewerTexture* getSunTexNext() const { return mSunTexturep[1]; }
+ LLViewerTexture* getMoonTexNext() const { return mMoonTexturep[1]; }
+ LLViewerTexture* getBloomTexNext() const { return mBloomTexturep[1]; }
LLViewerTexture* getCloudNoiseTexNext() const { return mCloudNoiseTexturep[1]; }
void setSunTextures(const LLUUID& sun_texture, const LLUUID& sun_texture_next);
void setMoonTextures(const LLUUID& moon_texture, const LLUUID& moon_texture_next);
void setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLUUID& cloud_noise_texture_next);
+ void setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next);
void forceSkyUpdate(void) { mForceUpdate = TRUE; }
@@ -294,7 +295,7 @@ protected:
LLPointer<LLViewerFetchedTexture> mSunTexturep[2];
LLPointer<LLViewerFetchedTexture> mMoonTexturep[2];
LLPointer<LLViewerFetchedTexture> mCloudNoiseTexturep[2];
- LLPointer<LLViewerFetchedTexture> mBloomTexturep;
+ LLPointer<LLViewerFetchedTexture> mBloomTexturep[2];
static S32 sResolution;
static S32 sTileResX;