# Conflicts:
#	indra/newview/pipeline.cpp
#	indra/newview/skins/default/xui/de/notifications.xml
#	indra/newview/skins/default/xui/es/notifications.xml
#	indra/newview/skins/default/xui/fr/notifications.xml
#	indra/newview/skins/default/xui/it/notifications.xml
#	indra/newview/skins/default/xui/ja/notifications.xml
#	indra/newview/skins/default/xui/pt/notifications.xml
#	indra/newview/skins/default/xui/ru/notifications.xml
master
Ansariel 2024-08-27 19:39:23 +02:00
commit 9573cc8e00
34 changed files with 2846 additions and 171 deletions

View File

@ -276,16 +276,20 @@ S32 LLImageJ2C::calcDataSizeJ2C(S32 w, S32 h, S32 comp, S32 discard_level, F32 r
// Estimate the number of layers. This is consistent with what's done for j2c encoding in LLImageJ2CKDU::encodeImpl().
constexpr S32 precision = 8; // assumed bitrate per component channel, might change in future for HDR support
constexpr S32 max_components = 4; // assumed the file has four components; three color and alpha
S32 nb_layers = 1;
const S32 surface = w*h;
S32 s = 64*64;
S32 totalbytes = (S32)(s * max_components * precision * rate); // first level computed before loop
while (surface > s)
// Use MAX_IMAGE_SIZE_DEFAULT (currently 2048) if either dimension is unknown (zero)
S32 width = (w > 0) ? w : 2048;
S32 height = (h > 0) ? h : 2048;
S32 max_dimension = llmax(width, height); // Find largest dimension
S32 block_area = MAX_BLOCK_SIZE * MAX_BLOCK_SIZE; // Calculated initial block area from established max block size (currently 64)
block_area *= (max_dimension / MAX_BLOCK_SIZE / max_components); // Adjust initial block area by ratio of largest dimension to block size per component
S32 totalbytes = (S32) (block_area * max_components * precision); // First block layer computed before loop without compression rate
S32 block_layers = 1; // Start at layer 1 since first block layer is computed outside loop
while (block_layers < 6) // Walk five layers for the five discards in JPEG2000
{
if (nb_layers <= (5 - discard_level))
totalbytes += (S32)(s * max_components * precision * rate);
nb_layers++;
s *= 4;
if (block_layers <= (5 - discard_level)) // Walk backwards from discard 5 to required discard layer.
totalbytes += (S32) (block_area * max_components * precision * rate); // Add each block layer reduced by assumed compression rate
block_layers++; // Move to next layer
block_area *= 4; // Increase block area by power of four
}
totalbytes /= 8; // to bytes

View File

@ -1552,6 +1552,34 @@ void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v)
}
}
void LLGLSLShader::uniform4uiv(U32 index, U32 count, const GLuint* v)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
llassert(sCurBoundShaderPtr == this);
if (mProgramObject)
{
if (mUniform.size() <= index)
{
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
llassert(false);
return;
}
if (mUniform[index] >= 0)
{
const auto& iter = mValue.find(mUniform[index]);
LLVector4 vec((F32)v[0], (F32)v[1], (F32)v[2], (F32)v[3]);
if (iter == mValue.end() || shouldChange(iter->second, vec) || count != 1)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
glUniform4uiv(mUniform[index], count, v);
mValue[mUniform[index]] = vec;
}
}
}
}
void LLGLSLShader::uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat* v)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
@ -1886,6 +1914,24 @@ void LLGLSLShader::uniform4fv(const LLStaticHashedString& uniform, U32 count, co
}
}
void LLGLSLShader::uniform4uiv(const LLStaticHashedString& uniform, U32 count, const GLuint* v)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
GLint location = getUniformLocation(uniform);
if (location >= 0)
{
LLVector4 vec((F32)v[0], (F32)v[1], (F32)v[2], (F32)v[3]);
const auto& iter = mValue.find(location);
if (iter == mValue.end() || shouldChange(iter->second, vec) || count != 1)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
glUniform4uiv(location, count, v);
mValue[location] = vec;
}
}
}
void LLGLSLShader::uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat* v)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;

View File

@ -208,6 +208,7 @@ public:
void uniform2fv(U32 index, U32 count, const GLfloat* v);
void uniform3fv(U32 index, U32 count, const GLfloat* v);
void uniform4fv(U32 index, U32 count, const GLfloat* v);
void uniform4uiv(U32 index, U32 count, const GLuint* v);
void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j);
void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat* v);
void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat* v);
@ -223,6 +224,7 @@ public:
void uniform2fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
void uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
void uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
void uniform4uiv(const LLStaticHashedString& uniform, U32 count, const GLuint* v);
void uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat* v);
void setMinimumAlpha(F32 minimum);

View File

@ -316,8 +316,12 @@ S32 LLImageGL::dataFormatBits(S32 dataformat)
case GL_RG16F: return 32;
case GL_RGB16F: return 48;
case GL_RGBA16F: return 64;
case GL_R32F: return 32;
case GL_RG32F: return 64;
case GL_RGB32F: return 96;
case GL_RGBA32F: return 128;
default:
LL_ERRS() << "LLImageGL::Unknown format: " << dataformat << LL_ENDL;
LL_ERRS() << "LLImageGL::Unknown format: " << std::hex << dataformat << std::dec << LL_ENDL;
return 0;
}
}
@ -367,7 +371,7 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)
case GL_SRGB_ALPHA: return 4;
case GL_BGRA: return 4; // Used for QuickTime media textures on the Mac
default:
LL_ERRS() << "LLImageGL::Unknown format: " << dataformat << LL_ENDL;
LL_ERRS() << "LLImageGL::Unknown format: " << std::hex << dataformat << std::dec << LL_ENDL;
return 0;
}
}

View File

@ -601,8 +601,6 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev
extra_code_text[extra_code_count++] = strdup("precision highp float;\n");
}
}
extra_code_text[extra_code_count++] = strdup("#define FXAA_GLSL_130 1\n");
}
// Use alpha float to store bit flags

View File

@ -13350,6 +13350,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<string>00000000-0000-0000-0000-000000000000</string>
</map>
<key>RenderCASSharpness</key>
<map>
<key>Comment</key>
<string>Level of sharpening to apply via Contrast Adaptive Sharpening (0.0(off) - 1.0)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>0.4</real>
</map>
<key>ReplaySession</key>
<map>
<key>Comment</key>
@ -17404,17 +17415,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>0</integer>
</map>
<key>VoiceEffectExpiryWarningTime</key>
<map>
<key>Comment</key>
<string>How much notice to give of Voice Morph subscriptions expiry, in seconds.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>259200</integer>
</map>
<key>VoiceMorphingEnabled</key>
<map>
<key>Comment</key>

File diff suppressed because it is too large Load Diff

View File

@ -256,6 +256,10 @@ A. Or use FXAA_GREEN_AS_LUMA.
#define FXAA_GLSL_130 0
#endif
/*--------------------------------------------------------------------------*/
#ifndef FXAA_GLSL_400
#define FXAA_GLSL_400 0
#endif
/*--------------------------------------------------------------------------*/
#ifndef FXAA_HLSL_3
#define FXAA_HLSL_3 0
#endif
@ -342,8 +346,8 @@ A. Or use FXAA_GREEN_AS_LUMA.
// 1 = API supports gather4 on alpha channel.
// 0 = API does not support gather4 on alpha channel.
//
#if (FXAA_GLSL_130 == 0)
#define FXAA_GATHER4_ALPHA 0
#if (FXAA_GLSL_400 == 1)
#define FXAA_GATHER4_ALPHA 1
#endif
#if (FXAA_HLSL_5 == 1)
#define FXAA_GATHER4_ALPHA 1
@ -652,7 +656,7 @@ NOTE the other tuning knobs are now in the shader function inputs!
API PORTING
============================================================================*/
#if (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1)
#if (FXAA_GLSL_120 == 1) || (FXAA_GLSL_130 == 1) || (FXAA_GLSL_400 == 1)
#define FxaaBool bool
#define FxaaDiscard discard
#define FxaaFloat float
@ -714,6 +718,16 @@ NOTE the other tuning knobs are now in the shader function inputs!
#endif
#endif
/*--------------------------------------------------------------------------*/
#if (FXAA_GLSL_400 == 1)
// Requires "#version 400" or better
#define FxaaTexTop(t, p) textureLod(t, p, 0.0)
#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
#define FxaaTexAlpha4(t, p) textureGather(t, p, 3)
#define FxaaTexOffAlpha4(t, p, o) textureGatherOffset(t, p, o, 3)
#define FxaaTexGreen4(t, p) textureGather(t, p, 1)
#define FxaaTexOffGreen4(t, p, o) textureGatherOffset(t, p, o, 1)
#endif
/*--------------------------------------------------------------------------*/
#if (FXAA_HLSL_3 == 1) || (FXAA_360 == 1) || (FXAA_PS3 == 1)
#define FxaaInt2 float2
#define FxaaTex sampler2D

View File

@ -79,6 +79,7 @@ RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 4
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderDownScaleMethod 1 1
RenderCASSharpness 1 1
//
@ -115,6 +116,7 @@ RenderHeroProbeResolution 1 256
RenderHeroProbeDistance 1 4
RenderHeroProbeUpdateRate 1 6
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium Low Graphics Settings
@ -150,6 +152,7 @@ RenderHeroProbeResolution 1 256
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 3
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium Graphics Settings (standard)
@ -185,6 +188,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 3
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium High Graphics Settings
@ -220,6 +224,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 2
RenderHeroProbeConservativeUpdateMultiplier 1 8
RenderCASSharpness 1 0
//
// High Graphics Settings (SSAO + sun shadows)
@ -255,6 +260,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 8
RenderHeroProbeUpdateRate 1 2
RenderHeroProbeConservativeUpdateMultiplier 1 8
RenderCASSharpness 1 0.4
//
// High Ultra Graphics Settings (deferred + SSAO + all shadows)
@ -290,6 +296,7 @@ RenderHeroProbeResolution 1 1024
RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 1
RenderHeroProbeConservativeUpdateMultiplier 1 4
RenderCASSharpness 1 0.4
//
// Ultra graphics (REALLY PURTY!)
@ -325,6 +332,7 @@ RenderHeroProbeResolution 1 2048
RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 1
RenderHeroProbeConservativeUpdateMultiplier 1 4
RenderCASSharpness 1 0.4
//
// Class Unknown Hardware (unknown)

View File

@ -68,7 +68,6 @@ RenderShadowDetail 1 2
RenderUseStreamVBO 1 1
RenderFSAASamples 1 16
RenderMaxTextureIndex 1 16
RenderMirrors 1 1
RenderGLContextCoreProfile 1 1
RenderGLMultiThreadedTextures 1 0
RenderGLMultiThreadedMedia 1 1
@ -80,6 +79,7 @@ RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 4
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderDownScaleMethod 1 1
RenderCASSharpness 1 1
//
@ -116,6 +116,7 @@ RenderHeroProbeResolution 1 256
RenderHeroProbeDistance 1 4
RenderHeroProbeUpdateRate 1 6
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium Low Graphics Settings
@ -151,6 +152,7 @@ RenderHeroProbeResolution 1 256
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 3
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium Graphics Settings (standard)
@ -186,6 +188,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 3
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium High Graphics Settings
@ -221,6 +224,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 2
RenderHeroProbeConservativeUpdateMultiplier 1 8
RenderCASSharpness 1 0
//
// High Graphics Settings (SSAO + sun shadows)
@ -256,6 +260,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 8
RenderHeroProbeUpdateRate 1 2
RenderHeroProbeConservativeUpdateMultiplier 1 8
RenderCASSharpness 1 0.4
//
// High Ultra Graphics Settings (deferred + SSAO + all shadows)
@ -291,6 +296,7 @@ RenderHeroProbeResolution 1 1024
RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 1
RenderHeroProbeConservativeUpdateMultiplier 1 4
RenderCASSharpness 1 0.4
//
// Ultra graphics (REALLY PURTY!)
@ -326,6 +332,7 @@ RenderHeroProbeResolution 1 2048
RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 1
RenderHeroProbeConservativeUpdateMultiplier 1 4
RenderCASSharpness 1 0.4
//
// Class Unknown Hardware (unknown)

View File

@ -77,6 +77,7 @@ RenderHeroProbeResolution 1 2048
RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 4
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 1
//
// Low Graphics Settings
@ -112,6 +113,7 @@ RenderHeroProbeResolution 1 256
RenderHeroProbeDistance 1 4
RenderHeroProbeUpdateRate 1 6
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium Low Graphics Settings
@ -147,6 +149,7 @@ RenderHeroProbeResolution 1 256
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 3
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium Graphics Settings (standard)
@ -182,6 +185,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 3
RenderHeroProbeConservativeUpdateMultiplier 1 16
RenderCASSharpness 1 0
//
// Medium High Graphics Settings
@ -217,6 +221,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 6
RenderHeroProbeUpdateRate 1 2
RenderHeroProbeConservativeUpdateMultiplier 1 8
RenderCASSharpness 1 0
//
// High Graphics Settings (SSAO + sun shadows)
@ -252,6 +257,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 8
RenderHeroProbeUpdateRate 1 2
RenderHeroProbeConservativeUpdateMultiplier 1 8
RenderCASSharpness 1 0
//
// High Ultra Graphics Settings (SSAO + all shadows)
@ -287,6 +293,7 @@ RenderHeroProbeResolution 1 512
RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 1
RenderHeroProbeConservativeUpdateMultiplier 1 4
RenderCASSharpness 1 0.4
//
// Ultra graphics (REALLY PURTY!)
@ -322,6 +329,7 @@ RenderHeroProbeResolution 1 1024
RenderHeroProbeDistance 1 16
RenderHeroProbeUpdateRate 1 1
RenderHeroProbeConservativeUpdateMultiplier 1 4
RenderCASSharpness 1 0.4
//
// Class Unknown Hardware (unknown)

View File

@ -296,7 +296,7 @@ void LLPanelEnvironmentInfo::refresh()
F32Hours dayoffset(mCurrentEnvironment->mDayOffset);
if (dayoffset.value() > 12.0f)
dayoffset -= F32Hours(24.0);
dayoffset -= daylength;
mSliderDayLength->setValue(daylength.value());
mSliderDayOffset->setValue(dayoffset.value());
@ -723,6 +723,11 @@ void LLPanelEnvironmentInfo::onSldDayLengthChanged(F32 value)
F32Hours daylength(value);
mCurrentEnvironment->mDayLength = daylength;
F32 offset = (F32)mSliderDayOffset->getValue().asReal();
if (offset <= 0.0f)
{
onSldDayOffsetChanged(offset);
}
setDirtyFlag(DIRTY_FLAG_DAYLENGTH);
udpateApparentTimeOfDay();
@ -736,7 +741,8 @@ void LLPanelEnvironmentInfo::onSldDayOffsetChanged(F32 value)
F32Hours dayoffset(value);
if (dayoffset.value() <= 0.0f)
dayoffset += F32Hours(24.0);
// if day cycle is 5 hours long, we want -1h offset to result in 4h
dayoffset += mCurrentEnvironment->mDayLength;
mCurrentEnvironment->mDayOffset = dayoffset;
setDirtyFlag(DIRTY_FLAG_DAYOFFSET);
@ -929,7 +935,7 @@ void LLPanelEnvironmentInfo::udpateApparentTimeOfDay()
{
static const F32 SECONDSINDAY(24.0 * 60.0 * 60.0);
if ((!mCurrentEnvironment) || (mCurrentEnvironment->mDayLength.value() < 1.0) || (mCurrentEnvironment->mDayOffset.value() < 1.0))
if ((!mCurrentEnvironment) || (mCurrentEnvironment->mDayLength.value() < 1.0))
{
mLabelApparentTime->setVisible(false);
return;

View File

@ -159,6 +159,7 @@ LLGLSLShader gDeferredMultiLightProgram[16];
LLGLSLShader gDeferredSpotLightProgram;
LLGLSLShader gDeferredMultiSpotLightProgram;
LLGLSLShader gDeferredSunProgram;
LLGLSLShader gDeferredSunProbeProgram;
LLGLSLShader gHazeProgram;
LLGLSLShader gHazeWaterProgram;
LLGLSLShader gDeferredBlurLightProgram;
@ -201,6 +202,7 @@ LLGLSLShader gExposureProgram;
LLGLSLShader gExposureProgramNoFade;
LLGLSLShader gLuminanceProgram;
LLGLSLShader gFXAAProgram;
LLGLSLShader gCASProgram;
LLGLSLShader gDeferredPostNoDoFProgram;
LLGLSLShader gDeferredWLSkyProgram;
LLGLSLShader gEnvironmentMapProgram;
@ -404,6 +406,7 @@ void LLViewerShaderMgr::finalizeShaderList()
mShaderList.push_back(&gObjectAlphaMaskNoColorProgram);
mShaderList.push_back(&gUnderWaterProgram);
mShaderList.push_back(&gDeferredSunProgram);
mShaderList.push_back(&gDeferredSunProbeProgram);
mShaderList.push_back(&gHazeProgram);
mShaderList.push_back(&gHazeWaterProgram);
mShaderList.push_back(&gDeferredSoftenProgram);
@ -1620,10 +1623,7 @@ bool LLViewerShaderMgr::loadShadersDeferred()
if (success)
{
std::string fragment;
std::string vertex = "deferred/sunLightV.glsl";
bool use_ao = gSavedSettings.getBOOL("RenderDeferredSSAO");
if (use_ao)
{
fragment = "deferred/sunLightSSAOF.glsl";
@ -1631,10 +1631,6 @@ bool LLViewerShaderMgr::loadShadersDeferred()
else
{
fragment = "deferred/sunLightF.glsl";
if (mShaderLevel[SHADER_DEFERRED] == 1)
{ //no shadows, no SSAO, no frag coord
vertex = "deferred/sunLightNoFragCoordV.glsl";
}
}
gDeferredSunProgram.mName = "Deferred Sun Shader";
@ -1643,7 +1639,7 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gDeferredSunProgram.mFeatures.hasAmbientOcclusion = use_ao;
gDeferredSunProgram.mShaderFiles.clear();
gDeferredSunProgram.mShaderFiles.push_back(make_pair(vertex, GL_VERTEX_SHADER));
gDeferredSunProgram.mShaderFiles.push_back(make_pair("deferred/sunLightV.glsl", GL_VERTEX_SHADER));
gDeferredSunProgram.mShaderFiles.push_back(make_pair(fragment, GL_FRAGMENT_SHADER));
gDeferredSunProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
@ -1651,6 +1647,21 @@ bool LLViewerShaderMgr::loadShadersDeferred()
llassert(success);
}
if (success)
{
gDeferredSunProbeProgram.mName = "Deferred Sun Probe Shader";
gDeferredSunProbeProgram.mFeatures.isDeferred = true;
gDeferredSunProbeProgram.mFeatures.hasShadows = true;
gDeferredSunProbeProgram.mShaderFiles.clear();
gDeferredSunProbeProgram.mShaderFiles.push_back(make_pair("deferred/sunLightV.glsl", GL_VERTEX_SHADER));
gDeferredSunProbeProgram.mShaderFiles.push_back(make_pair("deferred/sunLightF.glsl", GL_FRAGMENT_SHADER));
gDeferredSunProbeProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
success = gDeferredSunProbeProgram.createShader();
llassert(success);
}
if (success)
{
gDeferredBlurLightProgram.mName = "Deferred Blur Light Shader";
@ -2354,11 +2365,32 @@ bool LLViewerShaderMgr::loadShadersDeferred()
gFXAAProgram.mShaderFiles.clear();
gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredV.glsl", GL_VERTEX_SHADER));
gFXAAProgram.mShaderFiles.push_back(make_pair("deferred/fxaaF.glsl", GL_FRAGMENT_SHADER));
if (gGLManager.mGLVersion > 3.9)
{
gFXAAProgram.addPermutation("FXAA_GLSL_400", "1");
}
else
{
gFXAAProgram.addPermutation("FXAA_GLSL_130", "1");
}
gFXAAProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
success = gFXAAProgram.createShader();
llassert(success);
}
if (success)
{
gCASProgram.mName = "Contrast Adaptive Sharpening Shader";
gCASProgram.mFeatures.hasSrgb = true;
gCASProgram.mShaderFiles.clear();
gCASProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
gCASProgram.mShaderFiles.push_back(make_pair("deferred/CASF.glsl", GL_FRAGMENT_SHADER));
gCASProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
gCASProgram.createShader();
}
if (success)
{
gDeferredPostProgram.mName = "Deferred Post Shader";

View File

@ -231,6 +231,7 @@ extern LLGLSLShader gDeferredMultiLightProgram[LL_DEFERRED_MULTI_LIGHT_C
extern LLGLSLShader gDeferredSpotLightProgram;
extern LLGLSLShader gDeferredMultiSpotLightProgram;
extern LLGLSLShader gDeferredSunProgram;
extern LLGLSLShader gDeferredSunProbeProgram;
extern LLGLSLShader gHazeProgram;
extern LLGLSLShader gHazeWaterProgram;
extern LLGLSLShader gDeferredBlurLightProgram;
@ -246,6 +247,7 @@ extern LLGLSLShader gDeferredPostProgram;
extern LLGLSLShader gDeferredCoFProgram;
extern LLGLSLShader gDeferredDoFCombineProgram;
extern LLGLSLShader gFXAAProgram;
extern LLGLSLShader gCASProgram;
extern LLGLSLShader gDeferredPostNoDoFProgram;
extern LLGLSLShader gDeferredPostGammaCorrectProgram;
extern LLGLSLShader gNoPostGammaCorrectProgram;

View File

@ -6603,7 +6603,6 @@ LLVivoxVoiceClient::voiceFontEntry::voiceFontEntry(LLUUID& id) :
mIsNew(false)
{
mExpiryTimer.stop();
mExpiryWarningTimer.stop();
}
LLVivoxVoiceClient::voiceFontEntry::~voiceFontEntry()
@ -6714,20 +6713,6 @@ void LLVivoxVoiceClient::addVoiceFont(const S32 font_index,
font->mExpiryTimer.start();
font->mExpiryTimer.setExpiryAt(expiration_date.secondsSinceEpoch() - VOICE_FONT_EXPIRY_INTERVAL);
// Set the warning timer to some interval before actual expiry.
S32 warning_time = gSavedSettings.getS32("VoiceEffectExpiryWarningTime");
if (warning_time != 0)
{
font->mExpiryWarningTimer.start();
F64 expiry_time = (expiration_date.secondsSinceEpoch() - (F64)warning_time);
font->mExpiryWarningTimer.setExpiryAt(expiry_time - VOICE_FONT_EXPIRY_INTERVAL);
}
else
{
// Disable the warning timer.
font->mExpiryWarningTimer.stop();
}
// Only flag new session fonts after the first time we have fetched the list.
if (mVoiceFontsReceived)
{
@ -6769,7 +6754,6 @@ void LLVivoxVoiceClient::expireVoiceFonts()
// than checking each font individually.
bool have_expired = false;
bool will_expire = false;
bool expired_in_use = false;
LLUUID current_effect = LLVoiceClient::instance().getVoiceEffectDefault();
@ -6779,7 +6763,6 @@ void LLVivoxVoiceClient::expireVoiceFonts()
{
voiceFontEntry* voice_font = iter->second;
LLFrameTimer& expiry_timer = voice_font->mExpiryTimer;
LLFrameTimer& warning_timer = voice_font->mExpiryWarningTimer;
// Check for expired voice fonts
if (expiry_timer.getStarted() && expiry_timer.hasExpired())
@ -6796,14 +6779,6 @@ void LLVivoxVoiceClient::expireVoiceFonts()
deleteVoiceFont(voice_font->mID);
have_expired = true;
}
// Check for voice fonts that will expire in less that the warning time
if (warning_timer.getStarted() && warning_timer.hasExpired())
{
LL_DEBUGS("VoiceFont") << "Voice Font " << voice_font->mName << " will expire soon." << LL_ENDL;
will_expire = true;
warning_timer.stop();
}
}
LLSD args;
@ -6825,15 +6800,6 @@ void LLVivoxVoiceClient::expireVoiceFonts()
// Refresh voice font lists in the UI.
notifyVoiceFontObservers();
}
// Give a warning notification if any voice fonts are due to expire.
if (will_expire)
{
S32Seconds seconds(gSavedSettings.getS32("VoiceEffectExpiryWarningTime"));
args["INTERVAL"] = llformat("%d", LLUnit<S32, LLUnits::Days>(seconds).value());
LLNotificationsUtil::add("VoiceEffectsWillExpire", args);
}
}
void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id)

View File

@ -881,7 +881,6 @@ private:
bool mIsNew;
LLFrameTimer mExpiryTimer;
LLFrameTimer mExpiryWarningTimer;
};
bool mVoiceFontsReceived;

View File

@ -124,6 +124,17 @@
#include "llenvironment.h"
#include "llsettingsvo.h"
#ifndef LL_WINDOWS
#define A_GCC 1
#pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable"
#if LL_LINUX
#pragma GCC diagnostic ignored "-Wrestrict"
#endif
#endif
#define A_CPU 1
#include "app_settings/shaders/class1/deferred/CASF.glsl" // This is also C++
extern bool gSnapshot;
bool gShiftFrame = false;
@ -7289,6 +7300,51 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
}
}
void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
{
static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);
if (cas_sharpness == 0.0f)
{
gPipeline.copyRenderTarget(src, dst);
return;
}
LLGLSLShader* sharpen_shader = &gCASProgram;
// Bind setup:
dst->bindTarget();
sharpen_shader->bind();
{
static LLStaticHashedString cas_param_0("cas_param_0");
static LLStaticHashedString cas_param_1("cas_param_1");
static LLStaticHashedString out_screen_res("out_screen_res");
varAU4(const0);
varAU4(const1);
CasSetup(const0, const1,
cas_sharpness(), // Sharpness tuning knob (0.0 to 1.0).
(AF1)src->getWidth(), (AF1)src->getHeight(), // Input size.
(AF1)dst->getWidth(), (AF1)dst->getHeight()); // Output size.
sharpen_shader->uniform4uiv(cas_param_0, 1, const0);
sharpen_shader->uniform4uiv(cas_param_1, 1, const1);
sharpen_shader->uniform2f(out_screen_res, (AF1)dst->getWidth(), (AF1)dst->getHeight());
}
sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
// Draw
gPipeline.mScreenTriangleVB->setBuffer();
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
sharpen_shader->unbind();
dst->flush();
}
void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
{
{
@ -7456,6 +7512,7 @@ void LLPipeline::renderVignette(LLRenderTarget* src, LLRenderTarget* dst)
}
}
// </FS:Beq>
void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
{
{
@ -7716,12 +7773,15 @@ void LLPipeline::renderFinalize()
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
renderDoF(&mRT->screen, &mPostMap);
applyFXAA(&mPostMap, &mRT->screen);
applyCAS(&mRT->screen, &mPostMap);
renderDoF(&mPostMap, &mRT->screen);
applyFXAA(&mRT->screen, &mPostMap);
// <FS:Beq> Restore shader post proc for Vignette
// LLRenderTarget* finalBuffer = &mRT->screen;
LLRenderTarget* activeBuffer = &mRT->screen;
LLRenderTarget* targetBuffer = &mPostMap;
// LLRenderTarget* finalBuffer = &mPostMap;
LLRenderTarget* activeBuffer = &mPostMap;
LLRenderTarget* targetBuffer = &mRT->screen;
// [RLVa:KB] - @setsphere
if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE))
{
@ -7737,7 +7797,9 @@ void LLPipeline::renderFinalize()
// </FS:Beq>
if (RenderBufferVisualization > -1)
{
finalBuffer = &mPostMap;
// <FS:Ansariel> Vignette / Vision sphere: Need to write to the previous source buffer again
//finalBuffer = &mRT->screen;
finalBuffer = activeBuffer;
switch (RenderBufferVisualization)
{
case 0:
@ -8159,13 +8221,15 @@ void LLPipeline::renderDeferredLighting()
mat.mult_matrix_vec(tc_moon);
mTransformedMoonDir.set(tc_moon.v);
if (RenderDeferredSSAO || RenderShadowDetail > 0)
if ((RenderDeferredSSAO && !gCubeSnapshot) || RenderShadowDetail > 0)
{
LL_PROFILE_GPU_ZONE("sun program");
deferred_light_target->bindTarget();
{ // paint shadow/SSAO light map (direct lighting lightmap)
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - sun shadow");
bindDeferredShader(gDeferredSunProgram, deferred_light_target);
LLGLSLShader& sun_shader = gCubeSnapshot ? gDeferredSunProbeProgram : gDeferredSunProgram;
bindDeferredShader(sun_shader, deferred_light_target);
mScreenTriangleVB->setBuffer();
glClearColor(1, 1, 1, 1);
deferred_light_target->clear(GL_COLOR_BUFFER_BIT);
@ -8190,8 +8254,8 @@ void LLPipeline::renderDeferredLighting()
}
}
gDeferredSunProgram.uniform3fv(sOffset, slice, offset);
gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
sun_shader.uniform3fv(sOffset, slice, offset);
sun_shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
(GLfloat)deferred_light_target->getWidth(),
(GLfloat)deferred_light_target->getHeight());
@ -8201,12 +8265,12 @@ void LLPipeline::renderDeferredLighting()
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
}
unbindDeferredShader(gDeferredSunProgram);
unbindDeferredShader(sun_shader);
}
deferred_light_target->flush();
}
if (RenderDeferredSSAO)
if (RenderDeferredSSAO && !gCubeSnapshot)
{
// soften direct lighting lightmap
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - soften shadow");

View File

@ -157,6 +157,7 @@ public:
void generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history = true);
void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);
void generateGlow(LLRenderTarget* src);
void applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
void applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);
void renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst);

View File

@ -3485,12 +3485,6 @@ Abunəliyi yeniləmək üçün [[URL] buraya basın].
Animasiyalı səs dəyişdiricisinin müddəti bitdi, normal səs seçimləriniz qüvvədədir.
Abunəliyi yeniləmək üçün [[URL] buraya basın].
Əgər siz premium hesab sahibisinizsə, zəhmət olmasa animasiyalı səs dəyişikliyinin hüququnu almaq üçün [[PREMIUM_URL] bura basın].
</notification>
<notification name="VoiceEffectsWillExpire">
Animasiyalı səs dəyişdiricisinin bir və ya daha çox növlərinin müddəti [INTERVAL] gün və ya daha az müddətdə başa çatacaq.
Abunəliyi yeniləmək üçün [[URL] buraya basın].
Əgər siz premium hesab sahibisinizsə, zəhmət olmasa animasiyalı səs dəyişikliyinin hüququnu almaq üçün [[PREMIUM_URL] bura basın].
</notification>
<notification name="VoiceEffectsNew">

View File

@ -1595,10 +1595,6 @@ Klik på Acceptér for at deltage eller Afvis for at afvise invitationen. Klik p
</notification>
<notification name="VoiceEffectsExpiredInUse">
Den aktive stemme &quot;morph&quot; er udløbet og din normale stemme opsætning er genaktiveret.
[[URL] Click here] for at forny dit abbonnement.
</notification>
<notification name="VoiceEffectsWillExpire">
En eller flere af dine stemme &quot;morphs&quot; vil udløbe om mindre end [INTERVAL] dage.
[[URL] Click here] for at forny dit abbonnement.
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3630,12 +3630,6 @@ Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice
Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet.
[[URL] Klicken Sie hier], um Ihr Abo zu erneuern.
Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen.
</notification>
<notification name="VoiceEffectsWillExpire">
Ein oder mehrere Ihrer Voice-Morph-Abos laufen in weniger als [INTERVAL] Tagen ab.
[[URL] Klicken Sie hier], um Ihr Abo zu erneuern.
Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen.
</notification>
<notification name="VoiceEffectsNew">

View File

@ -211,6 +211,7 @@
</text>
<slider label="Schattenqualität" tool_tip="Qualität der Schattendarstellung (Standard: 1)" name="ShadowResolution"/>
<slider label="Skalierung der Bodentexturen (Erfordert Neustart)" name="RenderTerrainScale" tool_tip="Setzt die Skalierung der Bodentexturen - niedriger bedeutet höhere Kompression"/>
<slider label="Schärfung" name="RenderSharpness"/>
</panel>
<panel label="Schärfentiefe" name="DOF panel">

View File

@ -881,7 +881,26 @@
value="1"/>
</combo_box>
<!-- End of mirror settings -->
<!-- Sharpening Settings -->
<slider
control_name="RenderCASSharpness"
decimal_digits="1"
follows="left|top"
height="16"
increment="0.1"
initial_value="160"
label="Sharpening:"
label_width="145"
layout="topleft"
left="420"
min_val="0.0"
max_val="1.0"
name="RenderSharpness"
show_text="true"
top_delta="24"
width="260">
</slider>
<!-- End of Sharpening Settings-->
<!-- End of Advanced Settings block -->
<view_border
bevel_style="in"

View File

@ -9515,21 +9515,6 @@ If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice mo
<tag>voice</tag>
</notification>
<notification
icon="notify.tga"
name="VoiceEffectsWillExpire"
sound="UISndAlert"
persist="true"
type="notify">
<unique/>
One or more of your Voice Morphs will expire in less than [INTERVAL] days.
[[URL] Click here] to renew your subscription.
If you are a Premium Member, [[PREMIUM_URL] click here] to receive your voice morphing perk.
<tag>fail</tag>
<tag>voice</tag>
</notification>
<notification
icon="notify.tga"
name="VoiceEffectsNew"

View File

@ -1425,6 +1425,26 @@ If you do not understand the distinction then leave this control alone."
tool_tip="Determines scale of terrain textures - lower is more compressed (requires viewer restart)"
top_pad="3"
width="405" />
<!-- Sharpening Settings -->
<slider
control_name="RenderCASSharpness"
decimal_digits="1"
follows="left|top"
height="16"
increment="0.1"
label="Sharpening:"
label_width="300"
layout="topleft"
left="10"
min_val="0.0"
max_val="1.0"
name="RenderSharpness"
show_text="true"
top_pad="3"
width="405">
</slider>
<!-- End of Sharpening Settings-->
</panel>
<!--Depth of Field-->

View File

@ -3387,12 +3387,6 @@ Si eres un miembro Premium [[PREMIUM_URL] pulsa aquí] para recibir tu beneficio
La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal.
[[URL] Pulsa aquí] para renovar la suscripción.
Si eres un miembro Premium [[PREMIUM_URL] pulsa aquí] para recibir tu beneficio de transformación de voz.
</notification>
<notification name="VoiceEffectsWillExpire">
Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] días.
[[URL] Pulsa aquí] para renovar la suscripción
Si eres un miembro Premium [[PREMIUM_URL] pulsa aquí] para recibir tu beneficio de transformación de voz.
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3645,12 +3645,6 @@ Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votr
[[URL] Cliquez ici] pour renouveler votre abonnement.
Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix.
</notification>
<notification name="VoiceEffectsWillExpire">
Au moins l&apos;un de vos effets de voix expirera dans moins de [INTERVAL] jours.
[[URL] Cliquez ici] pour renouveler votre abonnement.
Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix.
</notification>
<notification name="VoiceEffectsNew">
De nouveaux effets de voix sont disponibles !

View File

@ -3420,12 +3420,6 @@ Se sei un utente Premium, [[PREMIUM_URL] clic qui] per ricevere la tua offerta d
Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali.
[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
Se sei un utente Premium, [[PREMIUM_URL] clic qui] per ricevere la tua offerta di manipolazioni vocali.
</notification>
<notification name="VoiceEffectsWillExpire">
Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni.
[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
Se sei un utente Premium, [[PREMIUM_URL] clic qui] per ricevere la tua offerta di manipolazioni vocali.
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3657,12 +3657,6 @@ M キーを押して変更します。
ボイスモーフィング効果の有効期限が終了したため、あなたの通常のボイス設定が適用されました。
期限を延長・更新するには [[URL] Click here] をクリックしてください。
プレミアム会員の方は、 [[PREMIUM_URL] click here] をクリックしてボイスモーフィング特典をお受け取りください。
</notification>
<notification name="VoiceEffectsWillExpire">
ボイスモーフィング効果の1つまたは複数の有効期限が [INTERVAL] 日以内に終了します。
期限を延長・更新するには [[URL] Click here] をクリックしてください。
プレミアム会員の方は、 [[PREMIUM_URL] click here] をクリックしてボイスモーフィング特典をお受け取りください。
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3507,11 +3507,6 @@ Jeśli jesteś użytkownikiem premium, to [[PREMIUM_URL] kliknij tutaj] aby otrz
<notification name="VoiceEffectsExpiredInUse">
Czas aktywności Przekształcenia Głosu wygasł, normalne ustawienia Twojego głosu zostały zastosowane.
[[URL] Kliknij tutaj] aby odnowić subskrypcję.
Jeśli jesteś użytkownikiem premium, to [[PREMIUM_URL] kliknij tutaj] aby otrzymać swój perk Przekształceń Głosu.
</notification>
<notification name="VoiceEffectsWillExpire">
Jedno lub więcej z Twoich Przekształceń Głosu wygaśnie za mniej niż [INTERVAL] dni.
[[URL] Kliknij tutaj] aby odnowić subskrypcję.
Jeśli jesteś użytkownikiem premium, to [[PREMIUM_URL] kliknij tutaj] aby otrzymać swój perk Przekształceń Głosu.
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3178,12 +3178,6 @@ Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu ap
A Distorção de voz ativa expirou. Suas configurações de voz padrão foram ativadas.
[[URL] Clique aqui] para renovar o serviço.
Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz.
</notification>
<notification name="VoiceEffectsWillExpire">
Uma ou mais das suas distorções de voz tem vencimento em menos de [INTERVAL] dias.
[[URL] Clique aqui] para renovar o serviço.
Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz.
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3629,12 +3629,6 @@ URL: [AUDIOURL]
Истек срок действия анимационного изменения голоса, действуют настройки вашего обычного голоса.
[[URL] Щелкните здесь], чтобы обновить подписку.
Если вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здесь], чтобы получить право на анимационное изменение голоса.
</notification>
<notification name="VoiceEffectsWillExpire">
Срок действия одного или нескольких ваших типов анимационного изменения голоса истекает через [INTERVAL] дней или раньше.
[[URL] Щелкните здесь], чтобы обновить подписку.
Если вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здесь], чтобы получить право на анимационное изменение голоса.
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3275,12 +3275,6 @@ Aboneliğinizi yenilemek için [[URL] buraya tıklayın].
Etkin Ses Dönüşümünün süresi dolmuş, normal ses ayarlarınız uygulandı.
Aboneliğinizi yenilemek için [[URL] buraya tıklayın].
Özel Üye iseniz, ses dönüştürme özelliğini almak için [[PREMIUM_URL] buraya tıklayın].
</notification>
<notification name="VoiceEffectsWillExpire">
Ses Dönüşümlerinizden birinin ya da daha fazlasının süresi [INTERVAL] günden daha az bir zamanda dolacak.
Aboneliğinizi yenilemek için [[URL] buraya tıklayın].
Özel Üye iseniz, ses dönüştürme özelliğini almak için [[PREMIUM_URL] buraya tıklayın].
</notification>
<notification name="VoiceEffectsNew">

View File

@ -3164,12 +3164,6 @@ SHA1 指紋:[MD5_DIGEST]
使用中的變聲效果已經過期,已用你平時的聲音設定取代。
[[URL] 點按這裡]繼續訂用。
付費用戶請[[PREMIUM_URL] 點按這裡]領取免費變聲工具。
</notification>
<notification name="VoiceEffectsWillExpire">
至少一個你訂用的變聲效果將在 [INTERVAL] 天後到期。
[[URL] 點按這裡]繼續訂用。
付費用戶請[[PREMIUM_URL] 點按這裡]領取免費變聲工具。
</notification>
<notification name="VoiceEffectsNew">