From fd38970f23331e3768410e4bb6b0447d5d866aea Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 7 Apr 2018 16:19:11 +0200 Subject: [PATCH 001/106] Added vision spheres using a post-processing shader (PoC) --HG-- branch : RLVa --- indra/llrender/llshadermgr.cpp | 3 + indra/llrender/llshadermgr.h | 3 + indra/newview/llviewershadermgr.cpp | 21 +++++++ indra/newview/llviewershadermgr.h | 3 + indra/newview/pipeline.cpp | 86 +++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index e721ad93fa..0df7400ffd 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1254,6 +1254,9 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("sunAngle2"); mReservedUniforms.push_back("camPosLocal"); +// [RLVa:KB] - @setsphere + mReservedUniforms.push_back("avPosLocal"); +// [/RLV:KB] mReservedUniforms.push_back("gWindDir"); mReservedUniforms.push_back("gSinWaveParams"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 394b38f832..ec45ab44cd 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -203,6 +203,9 @@ public: WATER_SUN_ANGLE2, WL_CAMPOSLOCAL, +// [RLVa:KB] - @setsphere + RLV_AVPOSLOCAL, +// [/RLVa:KB] AVATAR_WIND, AVATAR_SINWAVE, diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 3e0cec0f09..12119b214b 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -235,6 +235,9 @@ LLGLSLShader gDeferredFullbrightShinyProgram; LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; LLGLSLShader gDeferredSkinnedFullbrightProgram; LLGLSLShader gNormalMapGenProgram; +// [RLVa:KB] - @setsphere +LLGLSLShader gDeferredRlvProgram; +// [/RLVa:KB] // Deferred materials shaders LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; @@ -340,6 +343,9 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredAvatarAlphaProgram); mShaderList.push_back(&gDeferredWLSkyProgram); mShaderList.push_back(&gDeferredWLCloudProgram); +// [RLVa:KB] - @setsphere + mShaderList.push_back(&gDeferredRlvProgram); +// [/RLVa:KB] } LLViewerShaderMgr::~LLViewerShaderMgr() @@ -1166,6 +1172,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightProgram.unload(); +// [RLVa:KB] - @setsphere + gDeferredRlvProgram.unload(); +// [/RLVa:KB] gNormalMapGenProgram.unload(); for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i) @@ -1996,6 +2005,18 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gNormalMapGenProgram.createShader(NULL, NULL); } +// [RLVa:KB] - @setsphere + if (success) + { + gDeferredRlvProgram.mName = "Deferred (RLVa) Post Processing Shader"; + gDeferredRlvProgram.mShaderFiles.clear(); + gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredRlvProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + success = gDeferredRlvProgram.createShader(NULL, NULL); + } +// [/RLV:KB] + return success; } diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 923aa522ad..102bceb263 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -336,6 +336,9 @@ extern LLGLSLShader gDeferredFullbrightShinyProgram; extern LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; extern LLGLSLShader gDeferredSkinnedFullbrightProgram; extern LLGLSLShader gNormalMapGenProgram; +// [RLVa:KB] - @setsphere +extern LLGLSLShader gDeferredRlvProgram; +// [/RLVa:KB] // Deferred materials shaders extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4db9bde572..4ee5dc5caf 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -259,6 +259,9 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State"); LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline"); LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy"); LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading"); +// [RLVa:KB] - @setsphere +LLTrace::BlockTimerStatHandle FTM_POST_DEFERRED_RLV("Post-process (Deferred RLVa)"); +// [/RLVa:KB] static LLTrace::BlockTimerStatHandle FTM_STATESORT_DRAWABLE("Sort Drawables"); @@ -9045,6 +9048,89 @@ void LLPipeline::renderDeferredLighting() mScreen.flush(); +// [RLVa:KB] - @setsphere + { + LL_RECORD_BLOCK_TIME(FTM_POST_DEFERRED_RLV); + + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + + mScreen.bindTarget(); + gDeferredRlvProgram.bind(); + + S32 nDiffuseChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); + if (nDiffuseChannel > -1) + { + mScreen.bindTexture(0, nDiffuseChannel); + gGL.getTexUnit(nDiffuseChannel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + } + + S32 nDepthChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage()); + if (nDepthChannel > -1) + { + gGL.getTexUnit(nDepthChannel)->bind(&mDeferredDepth, TRUE); + } + + if (isAgentAvatarValid()) + { + LLVector4 avPos(gAgentAvatarp->getRenderPosition(), 1.0f); + glh::vec4f avPosGl(avPos.mV); + + const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); + mvMatrix.mult_matrix_vec(avPosGl); + + gDeferredRlvProgram.uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, avPosGl.v); + } + gDeferredRlvProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); + gDeferredRlvProgram.uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); + + gGL.matrixMode(LLRender::MM_PROJECTION); + gGL.pushMatrix(); + gGL.loadIdentity(); + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.pushMatrix(); + gGL.loadMatrix(gGLModelView); + + int nRenderMethod = 0; + switch (nRenderMethod) + { + case 0: + { + LLVector2 tc1(0, 0); + LLVector2 tc2((F32)mScreen.getWidth() * 2, (F32)mScreen.getHeight() * 2); + + gGL.begin(LLRender::TRIANGLE_STRIP); + gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); + gGL.vertex2f(-1, -1); + + gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); + gGL.vertex2f(-1, 3); + + gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); + gGL.vertex2f(3, -1); + + gGL.end(); + } + break; + case 1: + mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); + break; + } + + gGL.matrixMode(LLRender::MM_PROJECTION); + gGL.popMatrix(); + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.popMatrix(); + + gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); + gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DEPTH, mScreen.getUsage()); + gDeferredRlvProgram.unbind(); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.getTexUnit(0)->activate(); + + mScreen.flush(); + } +// [/RLVa:KB] } void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) From d7c4257aa03fed00bef3441cca92b1264243fcb0 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 7 Apr 2018 16:31:24 +0200 Subject: [PATCH 002/106] Added vision spheres using a post-processing shader (WIP) --HG-- branch : RLVa --- .../shaders/class2/deferred/rlvF.glsl | 73 +++++++++++++++++++ .../shaders/class2/deferred/rlvV.glsl | 33 +++++++++ 2 files changed, 106 insertions(+) create mode 100644 indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl create mode 100644 indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl diff --git a/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl new file mode 100644 index 0000000000..42694a9de2 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl @@ -0,0 +1,73 @@ +/** + * + * Copyright (c) 2018, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the + * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt + * + * By copying, modifying or distributing this software, you acknowledge that + * you have read and understood your obligations described above, and agree to + * abide by those obligations. + * + */ + +#extension GL_ARB_texture_rectangle : enable + +#ifdef DEFINE_GL_FRAGCOLOR + out vec4 frag_color; +#else + #define frag_color gl_FragColor +#endif + +VARYING vec2 vary_fragcoord; + +uniform sampler2DRect diffuseRect; +uniform sampler2DRect depthMap; +uniform mat4 inv_proj; +uniform vec2 screen_res; +uniform vec4 avPosLocal; + +vec4 getPosition_d(vec2 pos_screen, float depth) +{ + vec2 sc = pos_screen.xy*2.0; + sc /= screen_res; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +void main() +{ + vec2 tc = vary_fragcoord.xy; + + vec4 diffuse = texture2DRect(diffuseRect, tc); + vec3 col = diffuse.rgb; + + float depth = texture2DRect(depthMap, tc.xy).r; + vec3 pos = getPosition_d(tc, depth).xyz; + + { + float cutoff = 20; + float cutoff2 = 45; + float minAlpha = 0.0f; + float maxAlpha = 0.95f; + vec3 fogColor = vec3(0., 0., 0.); + + float distance = length(pos.xyz - avPosLocal.xyz) ; + + float density = 1; + float fracDistance = (distance - cutoff) / (cutoff2 - cutoff); + float visionFactor = clamp((1 - maxAlpha) + (exp(-density * fracDistance) * (maxAlpha - minAlpha)), 0.0, 1.0); + col = mix(fogColor, col, visionFactor); + col *= 1 - ((distance - cutoff) / (cutoff2 - cutoff)); + } + + frag_color.rgb = col; + frag_color.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl b/indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl new file mode 100644 index 0000000000..19124b6101 --- /dev/null +++ b/indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl @@ -0,0 +1,33 @@ +/** + * + * Copyright (c) 2018, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the + * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt + * + * By copying, modifying or distributing this software, you acknowledge that + * you have read and understood your obligations described above, and agree to + * abide by those obligations. + * + */ + +ATTRIBUTE vec3 position; + +uniform vec2 screen_res; + +VARYING vec2 vary_fragcoord; +VARYING vec3 vary_position; + +void main() +{ + //transform vertex + vec4 pos = vec4(position.xyz, 1.0); + gl_Position = pos; + + + vary_fragcoord = (pos.xy*0.5+0.5)*screen_res; + vary_position = (vec4(1, 0, 0, 1.0)).xyz; +} From 565d5f76111a3e31ae72bdcd3366906a880ca168 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 30 Jun 2018 15:15:29 +0200 Subject: [PATCH 003/106] Added @setsphere modifiers and exposed them as shader uniforms --HG-- branch : RLVa --- indra/llrender/llshadermgr.cpp | 3 ++ indra/llrender/llshadermgr.h | 3 ++ .../shaders/class2/deferred/rlvF.glsl | 54 +++++++++++-------- indra/newview/pipeline.cpp | 14 +---- indra/newview/rlvactions.cpp | 33 ++++++++++++ indra/newview/rlvactions.h | 11 ++++ indra/newview/rlvdefines.h | 21 ++++++++ indra/newview/rlvhelper.cpp | 13 +++++ 8 files changed, 118 insertions(+), 34 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 0df7400ffd..d808761f3b 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1256,6 +1256,9 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("camPosLocal"); // [RLVa:KB] - @setsphere mReservedUniforms.push_back("avPosLocal"); + mReservedUniforms.push_back("rlvEffectParam1"); + mReservedUniforms.push_back("rlvEffectParam2"); + mReservedUniforms.push_back("rlvEffectParam3"); // [/RLV:KB] mReservedUniforms.push_back("gWindDir"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index ec45ab44cd..02fbd8e4d1 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -205,6 +205,9 @@ public: WL_CAMPOSLOCAL, // [RLVa:KB] - @setsphere RLV_AVPOSLOCAL, + RLV_EFFECT_PARAM1, + RLV_EFFECT_PARAM2, + RLV_EFFECT_PARAM3, // [/RLVa:KB] AVATAR_WIND, diff --git a/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl index 42694a9de2..9edcf16f2b 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl @@ -28,14 +28,18 @@ uniform sampler2DRect diffuseRect; uniform sampler2DRect depthMap; uniform mat4 inv_proj; uniform vec2 screen_res; + uniform vec4 avPosLocal; +uniform vec4 rlvEffectParam1; +uniform vec4 rlvEffectParam2; +uniform vec4 rlvEffectParam3; vec4 getPosition_d(vec2 pos_screen, float depth) { - vec2 sc = pos_screen.xy*2.0; + vec2 sc = pos_screen.xy * 2.0; sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + sc -= vec2(1.0, 1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0 * depth - 1.0, 1.0); vec4 pos = inv_proj * ndc; pos /= pos.w; pos.w = 1.0; @@ -44,30 +48,36 @@ vec4 getPosition_d(vec2 pos_screen, float depth) void main() { - vec2 tc = vary_fragcoord.xy; - - vec4 diffuse = texture2DRect(diffuseRect, tc); - vec3 col = diffuse.rgb; - - float depth = texture2DRect(depthMap, tc.xy).r; - vec3 pos = getPosition_d(tc, depth).xyz; + vec2 fragTC = vary_fragcoord.xy; + float fragDepth = texture2DRect(depthMap, fragTC.xy).r; + vec3 fragPosLocal = getPosition_d(fragTC, fragDepth).xyz; + vec3 fragColor = texture2DRect(diffuseRect, fragTC).rgb; { - float cutoff = 20; - float cutoff2 = 45; - float minAlpha = 0.0f; - float maxAlpha = 0.95f; - vec3 fogColor = vec3(0., 0., 0.); + vec2 blendStart = rlvEffectParam1.xy; + vec2 blendEnd = rlvEffectParam1.zw; + vec3 blendColor = rlvEffectParam2.rgb; - float distance = length(pos.xyz - avPosLocal.xyz) ; + float cutoff = blendStart.y; + float cutoff2 = blendEnd.y; + float minAlpha = blendStart.x; + float maxAlpha = blendEnd.x; - float density = 1; - float fracDistance = (distance - cutoff) / (cutoff2 - cutoff); - float visionFactor = clamp((1 - maxAlpha) + (exp(-density * fracDistance) * (maxAlpha - minAlpha)), 0.0, 1.0); - col = mix(fogColor, col, visionFactor); - col *= 1 - ((distance - cutoff) / (cutoff2 - cutoff)); + float distance = length(fragPosLocal.xyz - avPosLocal.xyz); + if (distance < cutoff) + { + discard; + } + else if (distance < cutoff2) + { + fragColor = mix(fragColor, blendColor, minAlpha + (distance - cutoff) * (maxAlpha - minAlpha) / (cutoff2 - cutoff)); + } + else + { + fragColor = mix(fragColor, blendColor, maxAlpha); + } } - frag_color.rgb = col; + frag_color.rgb = fragColor; frag_color.a = 0.0; } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4ee5dc5caf..a583a50ad8 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -9049,6 +9049,7 @@ void LLPipeline::renderDeferredLighting() mScreen.flush(); // [RLVa:KB] - @setsphere + if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) { LL_RECORD_BLOCK_TIME(FTM_POST_DEFERRED_RLV); @@ -9070,18 +9071,7 @@ void LLPipeline::renderDeferredLighting() gGL.getTexUnit(nDepthChannel)->bind(&mDeferredDepth, TRUE); } - if (isAgentAvatarValid()) - { - LLVector4 avPos(gAgentAvatarp->getRenderPosition(), 1.0f); - glh::vec4f avPosGl(avPos.mV); - - const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); - mvMatrix.mult_matrix_vec(avPosGl); - - gDeferredRlvProgram.uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, avPosGl.v); - } - gDeferredRlvProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); - gDeferredRlvProgram.uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); + RlvActions::setEffectSphereShaderUniforms(&gDeferredRlvProgram, &mScreen); gGL.matrixMode(LLRender::MM_PROJECTION); gGL.pushMatrix(); diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp index 83c44583d8..add7e74056 100644 --- a/indra/newview/rlvactions.cpp +++ b/indra/newview/rlvactions.cpp @@ -17,6 +17,7 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llimview.h" +#include "llshadermgr.h" #include "llviewercamera.h" #include "llvoavatarself.h" #include "llworld.h" @@ -246,6 +247,38 @@ EChatType RlvActions::checkChatVolume(EChatType chatType) return chatType; } +// ============================================================================ +// Effects +// + +// static +void RlvActions::setEffectSphereShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget) +{ + if (!pShader || !pRenderTarget) + return; + + pShader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); + pShader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, pRenderTarget->getWidth(), pRenderTarget->getHeight()); + + // Pass the center of the sphere to the shader + const LLVector4 posSphereOrigin(isAgentAvatarValid() ? gAgentAvatarp->getRenderPosition() : gAgent.getPositionAgent() , 1.0f); + glh::vec4f posSphereOriginGl(posSphereOrigin.mV); + const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); + mvMatrix.mult_matrix_vec(posSphereOriginGl); + pShader->uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, posSphereOriginGl.v); + + const RlvBehaviourDictionary& rlvBhvrDict = RlvBehaviourDictionary::instance(); + + // Pack min/max distance and alpha together + pShader->uniform4f(LLShaderMgr::RLV_EFFECT_PARAM1, + rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MINALPHA)->getValue(), rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MINDIST)->getValue(), + rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MAXALPHA)->getValue(), rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MAXDIST)->getValue()); + + // Pass color + const glh::vec4f sphereColor(rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_COLOR)->getValue().mV, 1.0); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereColor.v); +} + // ============================================================================ // Inventory // diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h index 90b1069f6b..87d8a44290 100644 --- a/indra/newview/rlvactions.h +++ b/indra/newview/rlvactions.h @@ -24,8 +24,10 @@ // Forward declarations // +class LLGLSLShader; class LLInventoryCategory; class LLInventoryItem; +class LLRenderTarget; // ============================================================================ // RlvActions class declaration - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible @@ -135,6 +137,15 @@ protected: // Backwards logic so that we can initialize to 0 and it won't block when we forget to/don't check if RLVa is disabled static bool s_BlockNamesContexts[SNC_COUNT]; + // ======= + // Effects + // ======= +public: + /* + * Sets the uniform values needed by the 'vision spheres' effect + */ + static void setEffectSphereShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* renderTarget); + // ========= // Inventory // ========= diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index f8cb3f3295..ccdbb8778e 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -234,6 +234,15 @@ enum ERlvBehaviour { // Camera (force) RLV_BHVR_SETCAM_MODE, // Switch the user's camera into the specified mode (e.g. mouselook or thirdview) + // Effect: "vision spheres" + RLV_BHVR_SETSPHERE, // Gives an object exclusive control of the 'vision spheres' effect + RLV_BHVR_SETSPHERE_COLOR, + RLV_BHVR_SETSPHERE_DENSITY, + RLV_BHVR_SETSPHERE_MAXALPHA, + RLV_BHVR_SETSPHERE_MAXDIST, + RLV_BHVR_SETSPHERE_MINALPHA, + RLV_BHVR_SETSPHERE_MINDIST, + // Overlay RLV_BHVR_SETOVERLAY, // Gives an object exclusive control of the overlay RLV_BHVR_SETOVERLAY_ALPHA, // Changes the overlay texture's transparency level @@ -248,17 +257,28 @@ enum ERlvBehaviour { enum ERlvBehaviourModifier { + // "Vision spheres" post processing effect + RLV_MODIFIER_EFFECT_SPHERE_COLOR, // Colour to mix with the actual pixel colour (alpha depends non-linerally ) + RLV_MODIFIER_EFFECT_SPHERE_DENSITY, // Not exposed at the moment + RLV_MODIFIER_EFFECT_SPHERE_MAXALPHA,// Alpha of the mix colour at maximum distance + RLV_MODIFIER_EFFECT_SPHERE_MAXDIST, // Distance at which the blending stops ; or colour = mix(colour, sphere_colour, max_alpha) + RLV_MODIFIER_EFFECT_SPHERE_MINALPHA,// Alpha of the mix colour at minimum distance + RLV_MODIFIER_EFFECT_SPHERE_MINDIST, // Distance at which the gradual blending starts; or colour = mix(colour, sphere_colour, min_alpha) + RLV_MODIFIER_FARTOUCHDIST, // Radius of a sphere around the user in which they can interact with the world + RLV_MODIFIER_OVERLAY_ALPHA, // Transparency level of the overlay texture (in addition to the texture's own alpha channel) RLV_MODIFIER_OVERLAY_TEXTURE, // Specifies the UUID of the overlay texture RLV_MODIFIER_OVERLAY_TINT, // The tint that's applied to the overlay texture RLV_MODIFIER_OVERLAY_TOUCH, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction + RLV_MODIFIER_RECVIMDISTMIN, // Minimum distance to receive an IM from an otherwise restricted sender (squared value) RLV_MODIFIER_RECVIMDISTMAX, // Maximum distance to receive an IM from an otherwise restricted sender (squared value) RLV_MODIFIER_SENDIMDISTMIN, // Minimum distance to send an IM to an otherwise restricted recipient (squared value) RLV_MODIFIER_SENDIMDISTMAX, // Maximum distance to send an IM to an otherwise restricted recipient (squared value) RLV_MODIFIER_STARTIMDISTMIN, // Minimum distance to start an IM to an otherwise restricted recipient (squared value) RLV_MODIFIER_STARTIMDISTMAX, // Maximum distance to start an IM to an otherwise restricted recipient (squared value) + RLV_MODIFIER_SETCAM_AVDIST, // Distance at which nearby avatars turn into a silhouette (normal value) RLV_MODIFIER_SETCAM_AVDISTMIN, // Minimum distance between the camera position and the user's avatar (normal value) RLV_MODIFIER_SETCAM_AVDISTMAX, // Maximum distance between the camera position and the user's avatar (normal value) @@ -269,6 +289,7 @@ enum ERlvBehaviourModifier RLV_MODIFIER_SETCAM_FOVMIN, // Minimum value for the camera's field of view (angle in radians) RLV_MODIFIER_SETCAM_FOVMAX, // Maximum value for the camera's field of view (angle in radians) RLV_MODIFIER_SETCAM_TEXTURE, // Specifies the UUID of the texture used to texture the world view + RLV_MODIFIER_SITTPDIST, RLV_MODIFIER_TPLOCALDIST, diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index b159634c7c..03ad05108d 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -210,6 +210,19 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() addEntry(new RlvBehaviourProcessor("camzoommax", RlvBehaviourInfo::BHVR_DEPRECATED)); addEntry(new RlvBehaviourGenericToggleProcessor("camunlock", RlvBehaviourInfo::BHVR_SYNONYM | RlvBehaviourInfo::BHVR_DEPRECATED)); + // Effect: "vision spheres" + addEntry(new RlvBehaviourGenericProcessor("setsphere", RLV_BHVR_SETSPHERE, RlvBehaviourInfo::BHVR_EXPERIMENTAL)); + addModifier(new RlvForceGenericProcessor("setsphere_color", RLV_BHVR_SETSPHERE_COLOR, RlvBehaviourInfo::BHVR_EXPERIMENTAL), + RLV_MODIFIER_EFFECT_SPHERE_COLOR, new RlvBehaviourModifier("Effect: Vision spheres - Color", LLVector3(.0f, .0f, .0f), true, new RlvBehaviourModifierComp())); + addModifier(new RlvForceGenericProcessor("setsphere_maxdist", RLV_BHVR_SETSPHERE_MAXDIST, RlvBehaviourInfo::BHVR_EXPERIMENTAL), + RLV_MODIFIER_EFFECT_SPHERE_MAXDIST, new RlvBehaviourModifier("Effect: Vision spheres - Max distance", 0.f, false, new RlvBehaviourModifierCompMin())); + addModifier(new RlvForceGenericProcessor("setsphere_maxalpha", RLV_BHVR_SETSPHERE_MAXALPHA, RlvBehaviourInfo::BHVR_EXPERIMENTAL), + RLV_MODIFIER_EFFECT_SPHERE_MAXALPHA, new RlvBehaviourModifier("Effect: Vision spheres - Max distance alpha", 1.0f, false, new RlvBehaviourModifierCompMax())); + addModifier(new RlvForceGenericProcessor("setsphere_mindist", RLV_BHVR_SETSPHERE_MINDIST, RlvBehaviourInfo::BHVR_EXPERIMENTAL), + RLV_MODIFIER_EFFECT_SPHERE_MINDIST, new RlvBehaviourModifier("Effect: Vision spheres - Min distance", 0.f, false, new RlvBehaviourModifierCompMin())); + addModifier(new RlvForceGenericProcessor("setsphere_minalpha", RLV_BHVR_SETSPHERE_MINALPHA, RlvBehaviourInfo::BHVR_EXPERIMENTAL), + RLV_MODIFIER_EFFECT_SPHERE_MINALPHA, new RlvBehaviourModifier("Effect: Vision spheres - Min distance alpha", 1.0f, false, new RlvBehaviourModifierCompMax())); + // Overlay addEntry(new RlvBehaviourGenericToggleProcessor("setoverlay", RlvBehaviourInfo::BHVR_EXPERIMENTAL)); addModifier(new RlvForceGenericProcessor("setoverlay_alpha", RLV_BHVR_SETOVERLAY_ALPHA, RlvBehaviourInfo::BHVR_EXPERIMENTAL), From 10a2311549a13df3a8a8c600c26f347872afc3d5 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 17 Sep 2020 22:15:03 +0200 Subject: [PATCH 004/106] [FIXED] CATZ-578: Worn items are moved into Lost-and-Found at log off for some users --- indra/newview/llinventorymodel.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index c49d61df31..b6e7c5d48e 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -898,7 +898,13 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask) LLUUID new_parent_id = item->getParentUUID(); bool update_parent_on_server = false; - if (new_parent_id.isNull()) +// if (new_parent_id.isNull()) +// [SL:KB] - Patch: Appearance-Misc | Checked: Catznip-6.4 + // The problem seems to be the 'LogoutReply' message so don't reparent anything to the LNF folder + // as soon as we've sent out the log out request (since the quitting state is only set >after< we + // start processing the logout response) + if ( (new_parent_id.isNull()) && (!LLAppViewer::instance()->logoutRequestSent()) && (!LLApp::isExiting()) ) +// [/SL:KB] { // item with null parent will end in random location and then in Lost&Found, // either move to default folder as if it is new item or don't move at all From 63af00c9a8c6aa79dc76e0601b3e8d61dba09f03 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Mon, 4 Jan 2021 16:58:40 +0100 Subject: [PATCH 005/106] Review of vision sphere code (shader optimization) --- .../{class2 => class1}/deferred/rlvF.glsl | 38 ++++++------------- .../{class2 => class1}/deferred/rlvV.glsl | 0 indra/newview/pipeline.cpp | 37 ++++-------------- 3 files changed, 19 insertions(+), 56 deletions(-) rename indra/newview/app_settings/shaders/{class2 => class1}/deferred/rlvF.glsl (64%) rename indra/newview/app_settings/shaders/{class2 => class1}/deferred/rlvV.glsl (100%) diff --git a/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl similarity index 64% rename from indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl rename to indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl index 9edcf16f2b..2f99e88936 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/rlvF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2018, Kitty Barnett + * Copyright (c) 2018-2020, Kitty Barnett * * The source code in this file is provided to you under the terms of the * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; @@ -48,35 +48,21 @@ vec4 getPosition_d(vec2 pos_screen, float depth) void main() { - vec2 fragTC = vary_fragcoord.xy; - float fragDepth = texture2DRect(depthMap, fragTC.xy).r; + vec2 fragTC = vary_fragcoord.st; + float fragDepth = texture2DRect(depthMap, fragTC).x; vec3 fragPosLocal = getPosition_d(fragTC, fragDepth).xyz; - vec3 fragColor = texture2DRect(diffuseRect, fragTC).rgb; - { - vec2 blendStart = rlvEffectParam1.xy; - vec2 blendEnd = rlvEffectParam1.zw; - vec3 blendColor = rlvEffectParam2.rgb; + float distance = length(fragPosLocal.xyz - avPosLocal.xyz); - float cutoff = blendStart.y; - float cutoff2 = blendEnd.y; - float minAlpha = blendStart.x; - float maxAlpha = blendEnd.x; + vec2 sphereMinMaxDist = rlvEffectParam1.yw; + vec2 sphereMinMaxValue = rlvEffectParam1.xz; + vec3 sphereColour = rlvEffectParam2.rgb; - float distance = length(fragPosLocal.xyz - avPosLocal.xyz); - if (distance < cutoff) - { - discard; - } - else if (distance < cutoff2) - { - fragColor = mix(fragColor, blendColor, minAlpha + (distance - cutoff) * (maxAlpha - minAlpha) / (cutoff2 - cutoff)); - } - else - { - fragColor = mix(fragColor, blendColor, maxAlpha); - } - } + // Linear non-branching interpolation of the strength of the sphere effect (replaces if/elseif/else for x < min, min <= x <= max and x > max) + float effectStrength = mix(sphereMinMaxValue.x, 0, distance < sphereMinMaxDist.x) + + mix(0, sphereMinMaxValue.y - sphereMinMaxValue.x, clamp((distance - sphereMinMaxDist.x) / (sphereMinMaxDist.y - sphereMinMaxDist.x), 0.0, 1.0)); + + fragColor = mix(fragColor, sphereColour, effectStrength); frag_color.rgb = fragColor; frag_color.a = 0.0; diff --git a/indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvV.glsl similarity index 100% rename from indra/newview/app_settings/shaders/class2/deferred/rlvV.glsl rename to indra/newview/app_settings/shaders/class1/deferred/rlvV.glsl diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index f493299cca..f039a9575e 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -9081,8 +9081,6 @@ void LLPipeline::renderDeferredLighting() } } - mScreen.flush(); - // [RLVa:KB] - @setsphere if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) { @@ -9090,7 +9088,7 @@ void LLPipeline::renderDeferredLighting() LLGLDepthTest depth(GL_FALSE, GL_FALSE); - mScreen.bindTarget(); + //mScreen.bindTarget(); gDeferredRlvProgram.bind(); S32 nDiffuseChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); @@ -9115,32 +9113,8 @@ void LLPipeline::renderDeferredLighting() gGL.pushMatrix(); gGL.loadMatrix(gGLModelView); - int nRenderMethod = 0; - switch (nRenderMethod) - { - case 0: - { - LLVector2 tc1(0, 0); - LLVector2 tc2((F32)mScreen.getWidth() * 2, (F32)mScreen.getHeight() * 2); - - gGL.begin(LLRender::TRIANGLE_STRIP); - gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); - gGL.vertex2f(-1, -1); - - gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); - gGL.vertex2f(-1, 3); - - gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); - gGL.vertex2f(3, -1); - - gGL.end(); - } - break; - case 1: - mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); - mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); - break; - } + mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); gGL.matrixMode(LLRender::MM_PROJECTION); gGL.popMatrix(); @@ -9153,9 +9127,12 @@ void LLPipeline::renderDeferredLighting() gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(0)->activate(); - mScreen.flush(); + //mScreen.flush(); } // [/RLVa:KB] + + mScreen.flush(); + } void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) From ab5f4be459a06f02c38a342da48c73ef38cf5869 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 5 Jan 2021 02:54:10 +0100 Subject: [PATCH 006/106] Split behaviour modifiers into global scope (impacts all of RLV or other objects) and local scope (modifies only the behaviour only on that particular object) --- indra/newview/rlvhandler.cpp | 19 +++++--- indra/newview/rlvhelper.cpp | 91 +++++++++++++++++++++++++++++++----- indra/newview/rlvhelper.h | 80 ++++++++++++++++++++++++------- 3 files changed, 155 insertions(+), 35 deletions(-) diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 72dd6e4c7d..fd51bfac44 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1782,7 +1782,7 @@ ERlvCmdRet RlvBehaviourGenericHandler::onCommand(const RlvC // There should be an option and it should specify a valid modifier (RlvBehaviourModifier performs the appropriate type checks) RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifierFromBehaviour(rlvCmd.getBehaviourType()); RlvBehaviourModifierValue modValue; - if ( (!rlvCmd.hasOption()) || (!pBhvrModifier) || (!pBhvrModifier->convertOptionValue(rlvCmd.getOption(), modValue)) ) + if ( (!rlvCmd.hasOption()) || (!pBhvrModifier) || (!pBhvrModifier->convertOptionValue(rlvCmd.getOption(), pBhvrModifier->getType(), modValue)) ) return RLV_RET_FAILED_OPTION; // HACK-RLVa: reference counting doesn't happen until control returns to our caller but the modifier callbacks will happen now so we need to adjust the reference counts here @@ -1803,15 +1803,22 @@ ERlvCmdRet RlvBehaviourGenericHandler::onCommand(const RlvC return RLV_RET_SUCCESS; } -// Handles: @bhvr[:]=n|y +// Handles: @bhvr=n, @bhvr:=n|y and @bhvr:=force template<> ERlvCmdRet RlvBehaviourGenericHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) { - // If there is an option then it should specify a valid modifier (and reference count) - if (rlvCmd.hasOption()) + if ( (rlvCmd.getParamType() & RLV_TYPE_ADDREM) && (rlvCmd.hasOption()) ) + { + // @bhvr:=n|y : if there is an option then it should specify a valid global modifier and if so we reference count return RlvBehaviourGenericHandler::onCommand(rlvCmd, fRefCount); + } + else if (rlvCmd.getParamType() == RLV_TYPE_FORCE) + { + // @bhvr:=force : local modifiers hide behind their primary behaviour which knows how to handle them + return rlvCmd.getBehaviourInfo()->processModifier(rlvCmd); + } - // Add the default option on an empty modifier if needed + // @bhvr=n : add the default option on an empty modifier if needed RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifierFromBehaviour(rlvCmd.getBehaviourType()); if ( (pBhvrModifier) && (pBhvrModifier->getAddDefault()) ) { @@ -2622,7 +2629,7 @@ ERlvCmdRet RlvForceGenericHandler::onCommand(const RlvComma // There should be an option and it should specify a valid modifier (RlvBehaviourModifier performs the appropriate type checks) RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifierFromBehaviour(rlvCmd.getBehaviourType()); RlvBehaviourModifierValue modValue; - if ( (!rlvCmd.hasOption()) || (!pBhvrModifier) || (!pBhvrModifier->convertOptionValue(rlvCmd.getOption(), modValue)) ) + if ( (!rlvCmd.hasOption()) || (!pBhvrModifier) || (!pBhvrModifier->convertOptionValue(rlvCmd.getOption(), pBhvrModifier->getType(), modValue)) ) return RLV_RET_FAILED_OPTION; pBhvrModifier->setValue(modValue, rlvCmd.getObjectID()); diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index b08875fca5..920bc31d22 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -394,20 +394,36 @@ void RlvBehaviourDictionary::clearModifiers(const LLUUID& idRlvObj) } } -const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict) const +const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict, ERlvBehaviourModifier* peBhvrModifier) const { - bool fStrict = boost::algorithm::ends_with(strBhvr, "_sec"); + size_t idxBhvrLastPart = strBhvr.find_last_of('_'); + std::string strBhvrLastPart((std::string::npos != idxBhvrLastPart) && (idxBhvrLastPart < strBhvr.size()) ? strBhvr.substr(idxBhvrLastPart + 1) : LLStringUtil::null); + + bool fStrict = (strBhvrLastPart.compare("sec") == 0); if (pfStrict) *pfStrict = fStrict; + ERlvBehaviourModifier eBhvrModifier = RLV_MODIFIER_UNKNOWN; rlv_string2info_map_t::const_iterator itBhvr = m_String2InfoMap.find(std::make_pair( (!fStrict) ? strBhvr : strBhvr.substr(0, strBhvr.size() - 4), (eParamType & RLV_TYPE_ADDREM) ? RLV_TYPE_ADDREM : eParamType)); - return ( (itBhvr != m_String2InfoMap.end()) && ((!fStrict) || (itBhvr->second->hasStrict())) ) ? itBhvr->second : NULL; + if ( (m_String2InfoMap.end() == itBhvr) && (!fStrict) && (!strBhvrLastPart.empty()) && (RLV_TYPE_FORCE == eParamType) ) + { + // No match found but it could still be a local scope modifier + auto itBhvrMod = m_String2InfoMap.find(std::make_pair(strBhvr.substr(0, idxBhvrLastPart), RLV_TYPE_ADDREM)); + if ( (m_String2InfoMap.end() != itBhvrMod) && (eBhvrModifier = itBhvrMod->second->lookupBehaviourModifier(strBhvrLastPart)) != RLV_MODIFIER_UNKNOWN) + itBhvr = itBhvrMod; + } + + if (peBhvrModifier) + *peBhvrModifier = eBhvrModifier; + return ( (itBhvr != m_String2InfoMap.end()) && ((!fStrict) || (itBhvr->second->hasStrict())) ) ? itBhvr->second : nullptr; } ERlvBehaviour RlvBehaviourDictionary::getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict) const { - const RlvBehaviourInfo* pBhvrInfo = getBehaviourInfo(strBhvr, eParamType, pfStrict); - return (pBhvrInfo) ? pBhvrInfo->getBehaviourType() : RLV_BHVR_UNKNOWN; + ERlvBehaviourModifier eBhvrModifier; + const RlvBehaviourInfo* pBhvrInfo = getBehaviourInfo(strBhvr, eParamType, pfStrict, &eBhvrModifier); + // Filter out locally scoped modifier commands since they don't actually have a unique behaviour value of their own + return (pBhvrInfo && RLV_MODIFIER_UNKNOWN != eBhvrModifier) ? pBhvrInfo->getBehaviourType() : RLV_BHVR_UNKNOWN; } bool RlvBehaviourDictionary::getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list& cmdList) const @@ -456,6 +472,42 @@ void RlvBehaviourDictionary::toggleBehaviourFlag(const std::string& strBhvr, ERl } } +// ============================================================================ +// RlvBehaviourInfo +// + +// virtual +ERlvCmdRet RlvBehaviourInfo::processModifier(const RlvCommand& rlvCmd) const +{ + // The object should be holding at least one active behaviour + if (!gRlvHandler.hasBehaviour(rlvCmd.getObjectID())) + return RLV_RET_FAILED_NOBEHAVIOUR; + + auto itBhvrModifier = std::find_if(m_BhvrModifiers.begin(), m_BhvrModifiers.end(), [&rlvCmd](const modifier_lookup_t::value_type& entry) { return std::get<0>(entry.second) == rlvCmd.getBehaviourModifier(); }); + if (m_BhvrModifiers.end() == itBhvrModifier) + return RLV_RET_FAILED_UNKNOWN; + + ERlvCmdRet eCmdRet; const modifier_handler_func_t& fnHandler = std::get<2>(itBhvrModifier->second); + if (rlvCmd.hasOption()) + { + // If there's an option parse it (and perform type checking) + RlvBehaviourModifierValue modValue; + if ( (rlvCmd.hasOption()) && (!RlvBehaviourModifier::convertOptionValue(rlvCmd.getOption(), std::get<1>(itBhvrModifier->second), modValue)) ) + return RLV_RET_FAILED_OPTION; + eCmdRet = (fnHandler) ? fnHandler(rlvCmd.getObjectID(), modValue) : RLV_RET_SUCCESS; + if (RLV_RET_SUCCESS == eCmdRet) + gRlvHandler.getObject(rlvCmd.getObjectID())->setModifierValue(rlvCmd.getBehaviourModifier(), modValue); + } + else + { + eCmdRet = (fnHandler) ? fnHandler(rlvCmd.getObjectID(), boost::none) : RLV_RET_SUCCESS; + if (RLV_RET_SUCCESS == eCmdRet) + gRlvHandler.getObject(rlvCmd.getObjectID())->clearModifierValue(rlvCmd.getBehaviourModifier()); + } + + return eCmdRet; +} + // ============================================================================ // RlvBehaviourModifier // @@ -570,21 +622,22 @@ void RlvBehaviourModifier::setValue(const RlvBehaviourModifierValue& modValue, c } } -bool RlvBehaviourModifier::convertOptionValue(const std::string& optionValue, RlvBehaviourModifierValue& modValue) const +// static +bool RlvBehaviourModifier::convertOptionValue(const std::string& optionValue, const std::type_index& modType, RlvBehaviourModifierValue& modValue) { try { - if (typeid(float) == m_DefaultValue.type()) + if (modType == typeid(float)) { modValue = std::stof(optionValue); return true; } - else if (typeid(int) == m_DefaultValue.type()) + else if (modType == typeid(int)) { modValue = std::stoi(optionValue); return true; } - else if (typeid(LLVector3) == m_DefaultValue.type()) + else if (modType == typeid(LLVector3)) { LLVector3 vecOption; if (3 == sscanf(optionValue.c_str(), "%f/%f/%f", vecOption.mV + 0, vecOption.mV + 1, vecOption.mV + 2)) @@ -593,7 +646,7 @@ bool RlvBehaviourModifier::convertOptionValue(const std::string& optionValue, Rl return true; } } - else if (typeid(LLUUID) == m_DefaultValue.type()) + else if (modType == typeid(LLUUID)) { LLUUID idOption; if (LLUUID::parseUUID(optionValue, &idOption)) @@ -615,7 +668,7 @@ bool RlvBehaviourModifier::convertOptionValue(const std::string& optionValue, Rl // RlvCommand::RlvCommand(const LLUUID& idObj, const std::string& strCommand) - : m_fValid(false), m_idObj(idObj), m_pBhvrInfo(NULL), m_eParamType(RLV_TYPE_UNKNOWN), m_fStrict(false), m_fRefCounted(false) + : m_idObj(idObj) { if (m_fValid = parseCommand(strCommand, m_strBehaviour, m_strOption, m_strParam)) { @@ -643,7 +696,7 @@ RlvCommand::RlvCommand(const LLUUID& idObj, const std::string& strCommand) return; } - m_pBhvrInfo = RlvBehaviourDictionary::instance().getBehaviourInfo(m_strBehaviour, m_eParamType, &m_fStrict); + m_pBhvrInfo = RlvBehaviourDictionary::instance().getBehaviourInfo(m_strBehaviour, m_eParamType, &m_fStrict, &m_eBhvrModifier); } RlvCommand::RlvCommand(const RlvCommand& rlvCmd, ERlvParamType eParamType) @@ -1074,6 +1127,20 @@ std::string RlvObject::getStatusString(const std::string& strFilter, const std:: return strStatus; } +void RlvObject::clearModifierValue(ERlvBehaviourModifier eBhvrModifier) +{ + m_Modifiers.erase(eBhvrModifier); +} + +void RlvObject::setModifierValue(ERlvBehaviourModifier eBhvrModifier, const RlvBehaviourModifierValue& newValue) +{ + auto itBhvrModifierValue = m_Modifiers.find(eBhvrModifier); + if (m_Modifiers.end() != itBhvrModifierValue) + itBhvrModifierValue->second = newValue; + else + m_Modifiers.insert(std::make_pair(eBhvrModifier, newValue)); +} + // ============================================================================ // RlvForceWear // diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index cbe79ec57a..322fd7dcda 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -38,6 +38,7 @@ struct RlvBehaviourModifierComp; class RlvBehaviourInfo { + typedef std::function)> modifier_handler_func_t; public: enum EBehaviourFlags { @@ -65,24 +66,29 @@ public: : m_strBhvr(strBhvr), m_eBhvr(eBhvr), m_maskParamType(maskParamType), m_nBhvrFlags(nBhvrFlags) {} virtual ~RlvBehaviourInfo() {} - const std::string& getBehaviour() const { return m_strBhvr; } - ERlvBehaviour getBehaviourType() const { return m_eBhvr; } - U32 getBehaviourFlags() const { return m_nBhvrFlags; } - U32 getParamTypeMask() const { return m_maskParamType; } - bool hasStrict() const { return m_nBhvrFlags & BHVR_STRICT; } - bool isBlocked() const { return m_nBhvrFlags & BHVR_BLOCKED; } - bool isExperimental() const { return m_nBhvrFlags & BHVR_EXPERIMENTAL; } - bool isExtended() const { return m_nBhvrFlags & BHVR_EXTENDED; } - bool isSynonym() const { return m_nBhvrFlags & BHVR_SYNONYM; } - void toggleBehaviourFlag(EBehaviourFlags eBhvrFlag, bool fEnable); + void addModifier(ERlvBehaviourModifier eBhvrMod, const std::type_info& valueType, const std::string& strBhvrMod, modifier_handler_func_t fnHandler = nullptr); + const std::string& getBehaviour() const { return m_strBhvr; } + ERlvBehaviour getBehaviourType() const { return m_eBhvr; } + U32 getBehaviourFlags() const { return m_nBhvrFlags; } + U32 getParamTypeMask() const { return m_maskParamType; } + bool hasStrict() const { return m_nBhvrFlags & BHVR_STRICT; } + bool isBlocked() const { return m_nBhvrFlags & BHVR_BLOCKED; } + bool isExperimental() const { return m_nBhvrFlags & BHVR_EXPERIMENTAL; } + bool isExtended() const { return m_nBhvrFlags & BHVR_EXTENDED; } + bool isSynonym() const { return m_nBhvrFlags & BHVR_SYNONYM; } + ERlvBehaviourModifier lookupBehaviourModifier(const std::string& strBhvrMod) const; + void toggleBehaviourFlag(EBehaviourFlags eBhvrFlag, bool fEnable); virtual ERlvCmdRet processCommand(const RlvCommand& rlvCmd) const { return RLV_RET_NO_PROCESSOR; } + virtual ERlvCmdRet processModifier(const RlvCommand& rlvCmd) const; protected: std::string m_strBhvr; ERlvBehaviour m_eBhvr; U32 m_nBhvrFlags; U32 m_maskParamType; + typedef std::map> modifier_lookup_t; + modifier_lookup_t m_BhvrModifiers; }; // ============================================================================ @@ -106,7 +112,7 @@ public: public: void clearModifiers(const LLUUID& idRlvObj); ERlvBehaviour getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const; - const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const; + const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = nullptr, ERlvBehaviourModifier* eBhvrModifier = nullptr) const; bool getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list& cmdList) const; bool getHasStrict(ERlvBehaviour eBhvr) const; RlvBehaviourModifier* getModifier(ERlvBehaviourModifier eBhvrMod) const { return (eBhvrMod < RLV_MODIFIER_COUNT) ? m_BehaviourModifiers[eBhvrMod] : nullptr; } @@ -244,12 +250,13 @@ protected: virtual void onValueChange() const {} public: bool addValue(const RlvBehaviourModifierValue& modValue, const LLUUID& idRlvObj, ERlvBehaviour eBhvr = RLV_BHVR_UNKNOWN); - bool convertOptionValue(const std::string& optionValue, RlvBehaviourModifierValue& modValue) const; + static bool convertOptionValue(const std::string& optionValue, const std::type_index& modType, RlvBehaviourModifierValue& modValue); void clearValues(const LLUUID& idRlvObj); bool getAddDefault() const { return m_fAddDefaultOnEmpty; } const RlvBehaviourModifierValue& getDefaultValue() const { return m_DefaultValue; } const LLUUID& getPrimaryObject() const; const std::string& getName() const { return m_strName; } + const std::type_info& getType() const { return m_DefaultValue.type(); } const RlvBehaviourModifierValue& getValue() const { return (hasValue()) ? std::get<0>(m_Values.front()) : m_DefaultValue; } template const T& getValue() const { return boost::get(getValue()); } bool hasValue() const; @@ -289,14 +296,17 @@ public: public: std::string asString() const; const std::string& getBehaviour() const { return m_strBehaviour; } + const RlvBehaviourInfo* getBehaviourInfo() const { return m_pBhvrInfo; } ERlvBehaviour getBehaviourType() const { return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviourType() : RLV_BHVR_UNKNOWN; } U32 getBehaviourFlags() const{ return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviourFlags() : 0; } + ERlvBehaviourModifier getBehaviourModifier() const { return m_eBhvrModifier; } const LLUUID& getObjectID() const { return m_idObj; } const std::string& getOption() const { return m_strOption; } const std::string& getParam() const { return m_strParam; } ERlvParamType getParamType() const { return m_eParamType; } bool hasOption() const { return !m_strOption.empty(); } bool isBlocked() const { return (m_pBhvrInfo) ? m_pBhvrInfo->isBlocked() : false; } + bool isModifier() const { return RLV_MODIFIER_UNKNOWN != m_eBhvrModifier; } bool isRefCounted() const { return m_fRefCounted; } bool isStrict() const { return m_fStrict; } bool isValid() const { return m_fValid; } @@ -316,15 +326,16 @@ public: * Member variables */ protected: - bool m_fValid; + bool m_fValid = false; LLUUID m_idObj; std::string m_strBehaviour; - const RlvBehaviourInfo* m_pBhvrInfo; - ERlvParamType m_eParamType; - bool m_fStrict; + const RlvBehaviourInfo* m_pBhvrInfo = nullptr; + ERlvParamType m_eParamType = RLV_TYPE_UNKNOWN; + ERlvBehaviourModifier m_eBhvrModifier = RLV_MODIFIER_UNKNOWN; + bool m_fStrict = false; std::string m_strOption; std::string m_strParam; - mutable bool m_fRefCounted; + mutable bool m_fRefCounted = false; friend class RlvHandler; friend class RlvObject; @@ -452,6 +463,14 @@ public: bool hasLookup() const { return m_fLookup; } const rlv_command_list_t& getCommandList() const { return m_Commands; } + /* + * Local-scope modifiers + */ +public: + void clearModifierValue(ERlvBehaviourModifier eBhvrMod); + template bool getModifierValue(ERlvBehaviourModifier eBhvrModifier, T& value) const; + void setModifierValue(ERlvBehaviourModifier eBhvrMod, const RlvBehaviourModifierValue& modValue); + /* * Member variables */ @@ -462,6 +481,8 @@ protected: bool m_fLookup; // TRUE if the object existed in gObjectList at one point in time S16 m_nLookupMisses; // Count of unsuccessful lookups in gObjectList by the GC rlv_command_list_t m_Commands; // List of behaviours held by this object (in the order they were received) + typedef std::map bhvr_modifier_map_t; + bhvr_modifier_map_t m_Modifiers; // List of (local scope) modifiers set on this object friend class RlvHandler; }; @@ -686,6 +707,19 @@ std::string rlvGetLastParenthesisedText(const std::string& strText, std::string: // Inlined class member functions // +inline void RlvBehaviourInfo::addModifier(ERlvBehaviourModifier eBhvrMod, const std::type_info& valueType, const std::string& strBhvrMod, modifier_handler_func_t fnHandler) +{ + RLV_ASSERT_DBG(m_BhvrModifiers.find(strBhvrMod) == m_BhvrModifiers.end()); + + m_BhvrModifiers.insert(std::make_pair(strBhvrMod, std::make_tuple(eBhvrMod, std::type_index(valueType), fnHandler))); +} + +inline ERlvBehaviourModifier RlvBehaviourInfo::lookupBehaviourModifier(const std::string& strBhvrMod) const +{ + auto itBhvrModifier = m_BhvrModifiers.find(strBhvrMod); + return (m_BhvrModifiers.end() != itBhvrModifier) ? std::get<0>(itBhvrModifier->second) : RLV_MODIFIER_UNKNOWN; +} + inline void RlvBehaviourInfo::toggleBehaviourFlag(EBehaviourFlags eBhvrFlag, bool fEnable) { if (fEnable) @@ -710,6 +744,18 @@ inline bool RlvCommand::operator ==(const RlvCommand& rhs) const ( (RLV_TYPE_UNKNOWN != m_eParamType) ? (m_eParamType == rhs.m_eParamType) : (m_strParam == rhs.m_strParam) ); } +template +inline bool RlvObject::getModifierValue(ERlvBehaviourModifier eBhvrModifier, T& value) const +{ + auto itBhvrModifierValue = m_Modifiers.find(eBhvrModifier); + if (m_Modifiers.end() != itBhvrModifierValue) + { + value = boost::get(itBhvrModifierValue->second); + return true; + } + return false; +} + // Checked: 2010-04-05 (RLVa-1.2.0d) | Modified: RLVa-1.2.0d inline bool RlvForceWear::isWearableItem(const LLInventoryItem* pItem) { From e8a0915b4d313ddcb2cf9a0b34fa55f695fe96af Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 5 Jan 2021 04:58:09 +0100 Subject: [PATCH 007/106] Rework @setoverlay into a visual effect and move all the code out of RlvHandler --- indra/newview/CMakeLists.txt | 21 ++-- indra/newview/llviewerdisplay.cpp | 7 +- indra/newview/llviewerwindow.cpp | 9 +- indra/newview/rlvdefines.h | 20 ++-- indra/newview/rlveffects.cpp | 175 ++++++++++++++++++++++++++++++ indra/newview/rlveffects.h | 64 +++++++++++ indra/newview/rlvhandler.cpp | 125 ++++----------------- indra/newview/rlvhandler.h | 22 ++-- indra/newview/rlvhelper.cpp | 31 +++--- indra/newview/rlvhelper.h | 30 ++--- indra/newview/rlvmodifiers.cpp | 115 -------------------- indra/newview/rlvmodifiers.h | 50 --------- 12 files changed, 330 insertions(+), 339 deletions(-) create mode 100644 indra/newview/rlveffects.cpp create mode 100644 indra/newview/rlveffects.h delete mode 100644 indra/newview/rlvmodifiers.cpp diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5803c59809..2a83c30224 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -731,14 +731,14 @@ set(viewer_SOURCE_FILES noise.cpp pipeline.cpp rlvactions.cpp - rlvhandler.cpp - rlvhelper.cpp rlvcommon.cpp - rlvlocks.cpp - rlvinventory.cpp + rlveffects.cpp rlvextensions.cpp rlvfloaters.cpp - rlvmodifiers.cpp + rlvhandler.cpp + rlvhelper.cpp + rlvinventory.cpp + rlvlocks.cpp rlvui.cpp ) @@ -1366,14 +1366,15 @@ set(viewer_HEADER_FILES noise.h pipeline.h rlvactions.h - rlvdefines.h - rlvhandler.h - rlvhelper.h rlvcommon.h - rlvlocks.h - rlvinventory.h + rlvdefines.h + rlveffects.h rlvextensions.h rlvfloaters.h + rlvhandler.h + rlvhelper.h + rlvinventory.h + rlvlocks.h rlvmodifiers.h rlvui.h roles_constants.h diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index be2fd55d7a..817ff4ee53 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -79,7 +79,8 @@ #include "llpostprocess.h" #include "llscenemonitor.h" // [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a) -#include "rlvhandler.h" +#include "llvisualeffect.h" +#include "rlvactions.h" #include "rlvlocks.h" // [/RLVa:KB] @@ -1310,9 +1311,9 @@ void render_ui(F32 zoom_factor, int subfield) LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD); render_hud_elements(); // [RLVa:KB] - Checked: RLVa-2.2 (@setoverlay) - if (gRlvHandler.isEnabled()) + if (RlvActions::hasBehaviour(RLV_BHVR_SETOVERLAY)) { - gRlvHandler.renderOverlay(); + LLVfxManager::instance().runEffect(EVisualEffect::RlvOverlay); } // [/RLVa:KB] render_hud_attachments(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index adc56a8622..6052d34f9a 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -214,6 +214,8 @@ #include "llcleanup.h" // [RLVa:KB] - Checked: 2010-03-31 (RLVa-1.2.0c) +#include "rlvactions.h" +#include "rlveffects.h" #include "rlvhandler.h" // [/RLVa:KB] @@ -5663,11 +5665,12 @@ void LLPickInfo::fetchResults() mPickPt = mMousePt; // [RLVa:KB] - Checked: RLVa-2.2 (@setoverlay) - if ( (gRlvHandler.isEnabled()) && (hit_object) && (!hit_object->isHUDAttachment()) ) + if ( (RlvActions::hasBehaviour(RLV_BHVR_SETOVERLAY)) && (hit_object) && (!hit_object->isHUDAttachment()) ) { - if (gRlvHandler.hitTestOverlay(mMousePt)) + if (auto* pOverlayEffect = LLVfxManager::instance().getEffect(EVisualEffect::RlvOverlay)) { - hit_object = nullptr; + if (pOverlayEffect->hitTest(mMousePt)) + hit_object = nullptr; } } // [/RLVa:KB] diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 827a2d74c7..ea7bdeb8f9 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -240,12 +240,8 @@ enum ERlvBehaviour { // Camera (force) RLV_BHVR_SETCAM_MODE, // Switch the user's camera into the specified mode (e.g. mouselook or thirdview) - // Overlay + // Effects RLV_BHVR_SETOVERLAY, // Gives an object exclusive control of the overlay - RLV_BHVR_SETOVERLAY_ALPHA, // Changes the overlay texture's transparency level - RLV_BHVR_SETOVERLAY_TEXTURE, // Changes the overlay texture - RLV_BHVR_SETOVERLAY_TINT, // Changes the tint that's applied to the overlay texture - RLV_BHVR_SETOVERLAY_TOUCH, // Block world interaction (=touching) based on the alpha channel of the overlay texture RLV_BHVR_SETOVERLAY_TWEEN, // Animate between the current overlay settings and the supplied values RLV_BHVR_COUNT, @@ -255,10 +251,6 @@ enum ERlvBehaviour { enum ERlvBehaviourModifier { RLV_MODIFIER_FARTOUCHDIST, // Radius of a sphere around the user in which they can interact with the world - RLV_MODIFIER_OVERLAY_ALPHA, // Transparency level of the overlay texture (in addition to the texture's own alpha channel) - RLV_MODIFIER_OVERLAY_TEXTURE, // Specifies the UUID of the overlay texture - RLV_MODIFIER_OVERLAY_TINT, // The tint that's applied to the overlay texture - RLV_MODIFIER_OVERLAY_TOUCH, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction RLV_MODIFIER_RECVIMDISTMIN, // Minimum distance to receive an IM from an otherwise restricted sender (squared value) RLV_MODIFIER_RECVIMDISTMAX, // Maximum distance to receive an IM from an otherwise restricted sender (squared value) RLV_MODIFIER_SENDIMDISTMIN, // Minimum distance to send an IM to an otherwise restricted recipient (squared value) @@ -283,6 +275,16 @@ enum ERlvBehaviourModifier RLV_MODIFIER_UNKNOWN }; +enum class ERlvLocalBhvrModifier +{ + OverlayAlpha, // Transparency level of the overlay texture (in addition to the texture's own alpha channel) + OverlayTexture, // Specifies the UUID of the overlay texture + OverlayTint, // The tint that's applied to the overlay texture + OverlayTouch, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction + + Unknown, +}; + enum ERlvBehaviourOptionType { RLV_OPTION_NONE, // Behaviour takes no parameters diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp new file mode 100644 index 0000000000..4750442089 --- /dev/null +++ b/indra/newview/rlveffects.cpp @@ -0,0 +1,175 @@ +/** + * + * Copyright (c) 2021, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the + * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt + * + * By copying, modifying or distributing this software, you acknowledge that + * you have read and understood your obligations described above, and agree to + * abide by those obligations. + * + */ + +#include "llviewerprecompiledheaders.h" + +#include "llglslshader.h" +#include "llrender2dutils.h" +#include "llviewertexturelist.h" +#include "llviewerwindow.h" + +#include "rlveffects.h" +#include "rlvhandler.h" + +// ==================================================================================== +// RlvOverlayEffect class +// + +const float c_DefaultAlpha = 1.0f; +const float c_DefaultColor[3] = { 1.0f, 1.0f, 1.0f }; + +RlvOverlayEffect::RlvOverlayEffect(const LLUUID& idRlvObj) + : LLVisualEffect(idRlvObj, EVisualEffect::RlvOverlay, EVisualEffectType::Custom) + , m_nAlpha(c_DefaultAlpha) + , m_fBlockTouch(false) + , m_Color(LLColor3(c_DefaultColor)) +{ + if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) + { + float nAlpha; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayAlpha, nAlpha)) + m_nAlpha = nAlpha; + + pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayTouch, m_fBlockTouch); + + LLVector3 vecColor; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayTint, vecColor)) + m_Color = LLColor3(vecColor.mV); + + LLUUID idTexture; + if ( (pRlvObj) && (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayTexture, idTexture)) ) + setImage(idTexture); + } +} + +RlvOverlayEffect::~RlvOverlayEffect() +{ + clearImage(); +} + +// static +ERlvCmdRet RlvOverlayEffect::onAlphaValueChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvOverlayEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nAlpha = (newValue) ? boost::get(newValue.value()) : c_DefaultAlpha; + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvOverlayEffect::onBlockTouchValueChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvOverlayEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_fBlockTouch = (newValue) ? boost::get(newValue.value()) : false; + } + return RLV_RET_SUCCESS; +} +// static +ERlvCmdRet RlvOverlayEffect::onColorValueChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvOverlayEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_Color = LLColor3( (newValue) ? boost::get(newValue.value()).mV : c_DefaultColor); + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvOverlayEffect::onTextureChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvOverlayEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + if (newValue) + pEffect->setImage(boost::get(newValue.value())); + else + pEffect->clearImage(); + } + return RLV_RET_SUCCESS; +} + +void RlvOverlayEffect::clearImage() +{ + if (m_pImage) + { + m_pImage->setBoostLevel(m_nImageOrigBoost); + m_pImage = nullptr; + } +} + +bool RlvOverlayEffect::hitTest(const LLCoordGL& ptMouse) const +{ + if (!m_pImage) + return false; + + return (m_fBlockTouch) && (m_pImage->getMask(LLVector2((float)ptMouse.mX / gViewerWindow->getWorldViewWidthScaled(), (float)ptMouse.mY / gViewerWindow->getWorldViewHeightScaled()))); +} + +void RlvOverlayEffect::setImage(const LLUUID& idTexture) +{ + if ( (m_pImage) && (m_pImage->getID() == idTexture) ) + return; + + clearImage(); + m_pImage = LLViewerTextureManager::getFetchedTexture(idTexture, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + m_nImageOrigBoost = m_pImage->getBoostLevel(); + m_pImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); + m_pImage->forceToSaveRawImage(0); +} + +void RlvOverlayEffect::run() +{ + if (m_pImage) + { + if (LLGLSLShader::sNoFixedFunction) + { + gUIProgram.bind(); + } + + int nWidth = gViewerWindow->getWorldViewWidthScaled(); + int nHeight = gViewerWindow->getWorldViewHeightScaled(); + + m_pImage->addTextureStats(nWidth * nHeight); + m_pImage->setKnownDrawSize(nWidth, nHeight); + + gGL.pushMatrix(); + LLGLSUIDefault glsUI; + gViewerWindow->setup2DRender(); + + const LLVector2& displayScale = gViewerWindow->getDisplayScale(); + gGL.scalef(displayScale.mV[VX], displayScale.mV[VY], 1.f); + + gGL.getTexUnit(0)->bind(m_pImage); + const LLColor3 col = m_Color.get(); + gGL.color4f(col.mV[0], col.mV[1], col.mV[2], llclamp(m_nAlpha.get(), 0.0f, 1.0f)); + + gl_rect_2d_simple_tex(nWidth, nHeight); + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + + gGL.popMatrix(); + gGL.flush(); + gViewerWindow->setup3DRender(); + + if (LLGLSLShader::sNoFixedFunction) + { + gUIProgram.unbind(); + } + } +} + +// ==================================================================================== diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h new file mode 100644 index 0000000000..181187fe9d --- /dev/null +++ b/indra/newview/rlveffects.h @@ -0,0 +1,64 @@ +/** + * + * Copyright (c) 2021, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the + * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt + * + * By copying, modifying or distributing this software, you acknowledge that + * you have read and understood your obligations described above, and agree to + * abide by those obligations. + * + */ + +#pragma once + +#include "llvisualeffect.h" +#include "rlvhelper.h" + +// ============================================================================ +// Forward declarations +// + +class LLViewerFetchedTexture; + +// ==================================================================================== +// RlvOverlayEffect class +// + +class RlvOverlayEffect : public LLVisualEffect +{ +public: + RlvOverlayEffect(const LLUUID& idRlvObj); + ~RlvOverlayEffect(); + +public: + void tweenAlpha(float endAlpha, double duration) { m_nAlpha.start(endAlpha, duration); } + void tweenColor(LLColor3 endColor, double duration) { m_Color.start(endColor, duration); } + bool hitTest(const LLCoordGL& ptMouse) const; + static ERlvCmdRet onAlphaValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onBlockTouchValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onColorValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onTextureChanged(const LLUUID& idRlvObj, const boost::optional newValue); +protected: + void clearImage(); + void setImage(const LLUUID& idTexture); + + void run() override; + + /* + * Member variables + */ +protected: + LLTweenableValueLerp m_nAlpha; + bool m_fBlockTouch; + LLTweenableValueLerp m_Color; + + LLPointer m_pImage = nullptr; + int m_nImageOrigBoost = 0; +}; + +// ==================================================================================== diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index fd51bfac44..a89338d5f9 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -53,12 +53,12 @@ #include "llviewercamera.h" // @setcam and related #include "llworldmapmessage.h" // @tpto #include "llviewertexturelist.h" // @setcam_texture -#include "llviewerwindow.h" // @setoverlay // RLVa includes #include "rlvactions.h" #include "rlvfloaters.h" #include "rlvactions.h" +#include "rlveffects.h" #include "rlvhandler.h" #include "rlvhelper.h" #include "rlvinventory.h" @@ -178,7 +178,6 @@ void RlvHandler::cleanup() RLV_ASSERT(std::all_of(m_Behaviours, m_Behaviours + RLV_BHVR_COUNT, [](S16 cnt) { return !cnt; })); RLV_ASSERT(m_CurCommandStack.empty()); RLV_ASSERT(m_CurObjectStack.empty()); - RLV_ASSERT(m_pOverlayImage.isNull()); // // Clean up what's left @@ -2054,36 +2053,10 @@ void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhv template<> template<> void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) { - // Once an object has exclusive control over the overlay only its behaviours should be active. This affects: - // - behaviour modifiers => handled for us once we set the primary object - - LLUUID idRlvObject; if (fHasBhvr) - { - // Get the UUID of the primary object (there should only be one) - std::list lObjects; - gRlvHandler.findBehaviour(RLV_BHVR_SETOVERLAY, lObjects); - RLV_ASSERT(lObjects.size() == 1); - idRlvObject = lObjects.front()->getObjectID(); - } - - RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_ALPHA)->setPrimaryObject(idRlvObject); - RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TINT)->setPrimaryObject(idRlvObject); - RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TEXTURE)->setPrimaryObject(idRlvObject); - RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TOUCH)->setPrimaryObject(idRlvObject); -} - -// Handles: @setoverlay_texture:=n|y changes -template<> -void RlvBehaviourModifierHandler::onValueChange() const -{ - if (RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TEXTURE)) - { - if (pBhvrModifier->hasValue()) - gRlvHandler.setOverlayImage(pBhvrModifier->getValue()); - else - gRlvHandler.clearOverlayImage(); - } + LLVfxManager::instance().addEffect(new RlvOverlayEffect(gRlvHandler.getCurrentObject())); + else + LLVfxManager::instance().removeEffect(gRlvHandler.getCurrentObject()); } // Handles: @sendchannel[:]=n|y and @sendchannel_except[:]=n|y @@ -2984,6 +2957,14 @@ ERlvCmdRet RlvForceHandler::onCommand(const RlvCommand& rl template<> template<> ERlvCmdRet RlvForceHandler::onCommand(const RlvCommand& rlvCmd) { + RlvObject* pRlvObj = gRlvHandler.getObject(rlvCmd.getObjectID()); + if (!pRlvObj) + return RLV_RET_FAILED_NOBEHAVIOUR; + + RlvOverlayEffect* pOverlayEffect = LLVfxManager::instance().getEffect(rlvCmd.getObjectID()); + if (!pOverlayEffect) + return RLV_RET_FAILED_LOCK; + std::vector optionList; if ( (!RlvCommandOptionHelper::parseStringList(rlvCmd.getOption(), optionList)) || (3 != optionList.size()) ) return RLV_RET_FAILED_OPTION; @@ -2996,12 +2977,18 @@ ERlvCmdRet RlvForceHandler::onCommand(const RlvComman // Process the overlay alpha tween (if there is one and it is a valid value) float overlayAlpha = .0f; if (RlvCommandOptionHelper::parseOption(optionList[0], overlayAlpha)) - RlvBehaviourModifierAnimator::instance().addTween(rlvCmd.getObjectID(), RLV_MODIFIER_OVERLAY_ALPHA, RlvBehaviourModifierAnimationType::Lerp, overlayAlpha, tweenDuration); + { + pOverlayEffect->tweenAlpha(overlayAlpha, tweenDuration); + pRlvObj->setModifierValue(ERlvLocalBhvrModifier::OverlayAlpha, overlayAlpha); + } // Process the overlay tint tween (if there is one and it is a valid value) LLVector3 overlayColor; if (RlvCommandOptionHelper::parseOption(optionList[1], overlayColor)) - RlvBehaviourModifierAnimator::instance().addTween(rlvCmd.getObjectID(), RLV_MODIFIER_OVERLAY_TINT, RlvBehaviourModifierAnimationType::Lerp, overlayColor, tweenDuration); + { + pOverlayEffect->tweenColor(LLColor3(overlayColor.mV), tweenDuration); + pRlvObj->setModifierValue(ERlvLocalBhvrModifier::OverlayTint, overlayColor); + } return RLV_RET_SUCCESS; } @@ -3783,76 +3770,4 @@ ERlvCmdRet RlvHandler::onGetPath(const RlvCommand& rlvCmd, std::string& strReply // Command specific helper functions - @setoverlay // -void RlvHandler::clearOverlayImage() -{ - if (m_pOverlayImage) - { - m_pOverlayImage->setBoostLevel(m_nOverlayOrigBoost); - m_pOverlayImage = nullptr; - } -} - -bool RlvHandler::hitTestOverlay(const LLCoordGL& ptMouse) const -{ - if (!m_pOverlayImage) - return false; - - RlvBehaviourModifier* pTouchModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TOUCH); - return (pTouchModifier) && (pTouchModifier->hasValue()) && (pTouchModifier->getValue()) && - (m_pOverlayImage->getMask(LLVector2((float)ptMouse.mX / gViewerWindow->getWorldViewWidthScaled(), (float)ptMouse.mY / gViewerWindow->getWorldViewHeightScaled()))); -} - -void RlvHandler::renderOverlay() -{ - if ( (hasBehaviour(RLV_BHVR_SETOVERLAY)) && (m_pOverlayImage) ) - { - if (LLGLSLShader::sNoFixedFunction) - { - gUIProgram.bind(); - } - - int nWidth = gViewerWindow->getWorldViewWidthScaled(); - int nHeight = gViewerWindow->getWorldViewHeightScaled(); - - m_pOverlayImage->addTextureStats(nWidth * nHeight); - m_pOverlayImage->setKnownDrawSize(nWidth, nHeight); - - gGL.pushMatrix(); - LLGLSUIDefault glsUI; - gViewerWindow->setup2DRender(); - - const LLVector2& displayScale = gViewerWindow->getDisplayScale(); - gGL.scalef(displayScale.mV[VX], displayScale.mV[VY], 1.f); - - gGL.getTexUnit(0)->bind(m_pOverlayImage); - const LLVector3 overlayTint = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_TINT)->getValue(); - gGL.color4f(overlayTint.mV[0], overlayTint.mV[1], overlayTint.mV[2], llclamp(RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_OVERLAY_ALPHA)->getValue(), 0.0f, 1.0f)); - - gl_rect_2d_simple_tex(nWidth, nHeight); - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - gGL.popMatrix(); - gGL.flush(); - gViewerWindow->setup3DRender(); - - if (LLGLSLShader::sNoFixedFunction) - { - gUIProgram.unbind(); - } - } -} - -void RlvHandler::setOverlayImage(const LLUUID& idTexture) -{ - if ( (m_pOverlayImage) && (m_pOverlayImage->getID() == idTexture) ) - return; - - clearOverlayImage(); - m_pOverlayImage = LLViewerTextureManager::getFetchedTexture(idTexture, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - m_nOverlayOrigBoost = m_pOverlayImage->getBoostLevel(); - m_pOverlayImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); - m_pOverlayImage->forceToSaveRawImage(0); -} - // ============================================================================ diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h index 32eda85137..2aaea60c19 100644 --- a/indra/newview/rlvhandler.h +++ b/indra/newview/rlvhandler.h @@ -23,13 +23,9 @@ #include "rlvcommon.h" #include "rlvhelper.h" - // ============================================================================ - // Forward declarations - // - -class LLViewerFetchedTexture; - // ============================================================================ +// RlvHandler class +// class RlvHandler : public LLOldEvents::LLSimpleListener, public LLParticularGroupObserver { @@ -56,6 +52,8 @@ public: public: // Returns a list of all objects containing the specified behaviour bool findBehaviour(ERlvBehaviour eBhvr, std::list& lObjects) const; + // Returns a pointer to an RLV object instance (DO NOT STORE THIS!) + RlvObject* getObject(const LLUUID& idRlvObj) const; // Returns TRUE is at least one object contains the specified behaviour (and optional option) bool hasBehaviour(ERlvBehaviour eBhvr) const { return (eBhvr < RLV_BHVR_COUNT) ? (0 != m_Behaviours[eBhvr]) : false; } bool hasBehaviour(ERlvBehaviour eBhvr, const std::string& strOption) const; @@ -123,9 +121,7 @@ public: // Command specific helper functions bool filterChat(std::string& strUTF8Text, bool fFilterEmote) const; // @sendchat, @recvchat and @redirchat - bool hitTestOverlay(const LLCoordGL& ptMouse) const; // @setoverlay bool redirectChatOrEmote(const std::string& strUTF8Test) const; // @redirchat and @rediremote - void renderOverlay(); // @setoverlay // Command processing helper functions ERlvCmdRet processCommand(const LLUUID& idObj, const std::string& strCommand, bool fFromObj); @@ -144,11 +140,9 @@ public: protected: // Command specific helper functions (NOTE: these generally do not perform safety checks) bool checkActiveGroupThrottle(const LLUUID& idRlvObj); // @setgroup=force - void clearOverlayImage(); // @setoverlay=n void setActiveGroup(const LLUUID& idGroup); // @setgroup=force void setActiveGroupRole(const LLUUID& idGroup, const std::string& strRole); // @setgroup=force void setCameraOverride(bool fOverride); // @setcam family - void setOverlayImage(const LLUUID& idTexture); // @setoverlay=n void onIMQueryListResponse(const LLSD& sdNotification, const LLSD sdResponse); @@ -263,8 +257,6 @@ protected: mutable LLUUID m_idAgentGroup; // @setgroup=n std::pair m_PendingGroupChange; // @setgroup=force std::pair m_GroupChangeExpiration; // @setgroup=force - LLPointer m_pOverlayImage = nullptr; // @setoverlay=n - int m_nOverlayOrigBoost = 0; // @setoverlay=n std::string m_strCameraPresetRestore; // @setcam_eyeoffset, @setcam_eyeoffsetscale and @setcam_focusoffset @@ -301,6 +293,12 @@ inline RlvHandler* RlvHandler::getInstance() return &gRlvHandler; } +inline RlvObject* RlvHandler::getObject(const LLUUID& idRlvObj) const +{ + auto itObj = m_Objects.find(idRlvObj); + return (m_Objects.end() != itObj) ? const_cast(&itObj->second) : nullptr; +} + inline bool RlvHandler::hasBehaviour(ERlvBehaviour eBhvr, const std::string& strOption) const { return hasBehaviourExcept(eBhvr, strOption, LLUUID::null); diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 920bc31d22..1d19d096c1 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -22,6 +22,7 @@ #include "llviewerobjectlist.h" #include "rlvcommon.h" +#include "rlveffects.h" #include "rlvhelper.h" #include "rlvhandler.h" #include "rlvinventory.h" @@ -215,15 +216,12 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() addEntry(new RlvBehaviourGenericToggleProcessor("camunlock", RlvBehaviourInfo::BHVR_SYNONYM | RlvBehaviourInfo::BHVR_DEPRECATED)); // Overlay - addEntry(new RlvBehaviourGenericToggleProcessor("setoverlay", RlvBehaviourInfo::BHVR_EXPERIMENTAL)); - addModifier(new RlvForceGenericProcessor("setoverlay_alpha", RLV_BHVR_SETOVERLAY_ALPHA, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_OVERLAY_ALPHA, new RlvBehaviourModifier("Overlay - Alpha", 1.0f, false, new RlvBehaviourModifierComp())); - addModifier(new RlvForceGenericProcessor("setoverlay_texture", RLV_BHVR_SETOVERLAY_TEXTURE, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_OVERLAY_TEXTURE, new RlvBehaviourModifierHandler("Overlay - Texture", LLUUID::null, false, new RlvBehaviourModifierComp())); - addModifier(new RlvForceGenericProcessor("setoverlay_tint", RLV_BHVR_SETOVERLAY_TINT, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_OVERLAY_TINT, new RlvBehaviourModifier("Overlay - Tint", LLVector3(1.0f, 1.0f, 1.0f), false, new RlvBehaviourModifierComp())); - addModifier(new RlvBehaviourGenericProcessor("setoverlay_touch", RLV_BHVR_SETOVERLAY_TOUCH, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_OVERLAY_TOUCH, new RlvBehaviourModifier("Overlay - Touch", true, true, new RlvBehaviourModifierComp())); + RlvBehaviourInfo* pSetOverlayBhvr = new RlvBehaviourGenericToggleProcessor("setoverlay"); + pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayAlpha, typeid(float), "alpha", &RlvOverlayEffect::onAlphaValueChanged); + pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayTexture, typeid(LLUUID), "texture", &RlvOverlayEffect::onTextureChanged); + pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayTint, typeid(LLVector3), "tint", &RlvOverlayEffect::onColorValueChanged); + pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayTouch, typeid(LLVector3), "touch", &RlvOverlayEffect::onBlockTouchValueChanged); + addEntry(pSetOverlayBhvr); addEntry(new RlvForceProcessor("setoverlay_tween", RlvBehaviourInfo::BHVR_EXPERIMENTAL)); // @@ -394,7 +392,7 @@ void RlvBehaviourDictionary::clearModifiers(const LLUUID& idRlvObj) } } -const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict, ERlvBehaviourModifier* peBhvrModifier) const +const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict, ERlvLocalBhvrModifier* peBhvrModifier) const { size_t idxBhvrLastPart = strBhvr.find_last_of('_'); std::string strBhvrLastPart((std::string::npos != idxBhvrLastPart) && (idxBhvrLastPart < strBhvr.size()) ? strBhvr.substr(idxBhvrLastPart + 1) : LLStringUtil::null); @@ -402,14 +400,14 @@ const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::stri bool fStrict = (strBhvrLastPart.compare("sec") == 0); if (pfStrict) *pfStrict = fStrict; - ERlvBehaviourModifier eBhvrModifier = RLV_MODIFIER_UNKNOWN; + ERlvLocalBhvrModifier eBhvrModifier = ERlvLocalBhvrModifier::Unknown; rlv_string2info_map_t::const_iterator itBhvr = m_String2InfoMap.find(std::make_pair( (!fStrict) ? strBhvr : strBhvr.substr(0, strBhvr.size() - 4), (eParamType & RLV_TYPE_ADDREM) ? RLV_TYPE_ADDREM : eParamType)); if ( (m_String2InfoMap.end() == itBhvr) && (!fStrict) && (!strBhvrLastPart.empty()) && (RLV_TYPE_FORCE == eParamType) ) { // No match found but it could still be a local scope modifier auto itBhvrMod = m_String2InfoMap.find(std::make_pair(strBhvr.substr(0, idxBhvrLastPart), RLV_TYPE_ADDREM)); - if ( (m_String2InfoMap.end() != itBhvrMod) && (eBhvrModifier = itBhvrMod->second->lookupBehaviourModifier(strBhvrLastPart)) != RLV_MODIFIER_UNKNOWN) + if ( (m_String2InfoMap.end() != itBhvrMod) && (eBhvrModifier = itBhvrMod->second->lookupBehaviourModifier(strBhvrLastPart)) != ERlvLocalBhvrModifier::Unknown) itBhvr = itBhvrMod; } @@ -420,10 +418,10 @@ const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::stri ERlvBehaviour RlvBehaviourDictionary::getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict) const { - ERlvBehaviourModifier eBhvrModifier; + ERlvLocalBhvrModifier eBhvrModifier; const RlvBehaviourInfo* pBhvrInfo = getBehaviourInfo(strBhvr, eParamType, pfStrict, &eBhvrModifier); // Filter out locally scoped modifier commands since they don't actually have a unique behaviour value of their own - return (pBhvrInfo && RLV_MODIFIER_UNKNOWN != eBhvrModifier) ? pBhvrInfo->getBehaviourType() : RLV_BHVR_UNKNOWN; + return (pBhvrInfo && ERlvLocalBhvrModifier::Unknown != eBhvrModifier) ? pBhvrInfo->getBehaviourType() : RLV_BHVR_UNKNOWN; } bool RlvBehaviourDictionary::getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list& cmdList) const @@ -547,7 +545,6 @@ void RlvBehaviourModifier::clearValues(const LLUUID& idRlvObj) [&idRlvObj](const RlvBehaviourModifierValueTuple& modValue) { return (std::get<1>(modValue) == idRlvObj) && (std::get<2>(modValue) == RLV_BHVR_UNKNOWN); }), m_Values.end()); - RlvBehaviourModifierAnimator::instance().clearTweens(idRlvObj); if (origCount != m_Values.size()) { onValueChange(); @@ -1127,12 +1124,12 @@ std::string RlvObject::getStatusString(const std::string& strFilter, const std:: return strStatus; } -void RlvObject::clearModifierValue(ERlvBehaviourModifier eBhvrModifier) +void RlvObject::clearModifierValue(ERlvLocalBhvrModifier eBhvrModifier) { m_Modifiers.erase(eBhvrModifier); } -void RlvObject::setModifierValue(ERlvBehaviourModifier eBhvrModifier, const RlvBehaviourModifierValue& newValue) +void RlvObject::setModifierValue(ERlvLocalBhvrModifier eBhvrModifier, const RlvBehaviourModifierValue& newValue) { auto itBhvrModifierValue = m_Modifiers.find(eBhvrModifier); if (m_Modifiers.end() != itBhvrModifierValue) diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index 322fd7dcda..f5e9c7c6d2 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -66,7 +66,7 @@ public: : m_strBhvr(strBhvr), m_eBhvr(eBhvr), m_maskParamType(maskParamType), m_nBhvrFlags(nBhvrFlags) {} virtual ~RlvBehaviourInfo() {} - void addModifier(ERlvBehaviourModifier eBhvrMod, const std::type_info& valueType, const std::string& strBhvrMod, modifier_handler_func_t fnHandler = nullptr); + void addModifier(ERlvLocalBhvrModifier eBhvrMod, const std::type_info& valueType, const std::string& strBhvrMod, modifier_handler_func_t fnHandler = nullptr); const std::string& getBehaviour() const { return m_strBhvr; } ERlvBehaviour getBehaviourType() const { return m_eBhvr; } U32 getBehaviourFlags() const { return m_nBhvrFlags; } @@ -76,7 +76,7 @@ public: bool isExperimental() const { return m_nBhvrFlags & BHVR_EXPERIMENTAL; } bool isExtended() const { return m_nBhvrFlags & BHVR_EXTENDED; } bool isSynonym() const { return m_nBhvrFlags & BHVR_SYNONYM; } - ERlvBehaviourModifier lookupBehaviourModifier(const std::string& strBhvrMod) const; + ERlvLocalBhvrModifier lookupBehaviourModifier(const std::string& strBhvrMod) const; void toggleBehaviourFlag(EBehaviourFlags eBhvrFlag, bool fEnable); virtual ERlvCmdRet processCommand(const RlvCommand& rlvCmd) const { return RLV_RET_NO_PROCESSOR; } @@ -87,7 +87,7 @@ protected: ERlvBehaviour m_eBhvr; U32 m_nBhvrFlags; U32 m_maskParamType; - typedef std::map> modifier_lookup_t; + typedef std::map> modifier_lookup_t; modifier_lookup_t m_BhvrModifiers; }; @@ -112,7 +112,7 @@ public: public: void clearModifiers(const LLUUID& idRlvObj); ERlvBehaviour getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const; - const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = nullptr, ERlvBehaviourModifier* eBhvrModifier = nullptr) const; + const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = nullptr, ERlvLocalBhvrModifier* peBhvrModifier = nullptr) const; bool getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list& cmdList) const; bool getHasStrict(ERlvBehaviour eBhvr) const; RlvBehaviourModifier* getModifier(ERlvBehaviourModifier eBhvrMod) const { return (eBhvrMod < RLV_MODIFIER_COUNT) ? m_BehaviourModifiers[eBhvrMod] : nullptr; } @@ -299,14 +299,14 @@ public: const RlvBehaviourInfo* getBehaviourInfo() const { return m_pBhvrInfo; } ERlvBehaviour getBehaviourType() const { return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviourType() : RLV_BHVR_UNKNOWN; } U32 getBehaviourFlags() const{ return (m_pBhvrInfo) ? m_pBhvrInfo->getBehaviourFlags() : 0; } - ERlvBehaviourModifier getBehaviourModifier() const { return m_eBhvrModifier; } + ERlvLocalBhvrModifier getBehaviourModifier() const { return m_eBhvrModifier; } const LLUUID& getObjectID() const { return m_idObj; } const std::string& getOption() const { return m_strOption; } const std::string& getParam() const { return m_strParam; } ERlvParamType getParamType() const { return m_eParamType; } bool hasOption() const { return !m_strOption.empty(); } bool isBlocked() const { return (m_pBhvrInfo) ? m_pBhvrInfo->isBlocked() : false; } - bool isModifier() const { return RLV_MODIFIER_UNKNOWN != m_eBhvrModifier; } + bool isModifier() const { return ERlvLocalBhvrModifier::Unknown != m_eBhvrModifier; } bool isRefCounted() const { return m_fRefCounted; } bool isStrict() const { return m_fStrict; } bool isValid() const { return m_fValid; } @@ -331,7 +331,7 @@ protected: std::string m_strBehaviour; const RlvBehaviourInfo* m_pBhvrInfo = nullptr; ERlvParamType m_eParamType = RLV_TYPE_UNKNOWN; - ERlvBehaviourModifier m_eBhvrModifier = RLV_MODIFIER_UNKNOWN; + ERlvLocalBhvrModifier m_eBhvrModifier = ERlvLocalBhvrModifier::Unknown; bool m_fStrict = false; std::string m_strOption; std::string m_strParam; @@ -467,9 +467,9 @@ public: * Local-scope modifiers */ public: - void clearModifierValue(ERlvBehaviourModifier eBhvrMod); - template bool getModifierValue(ERlvBehaviourModifier eBhvrModifier, T& value) const; - void setModifierValue(ERlvBehaviourModifier eBhvrMod, const RlvBehaviourModifierValue& modValue); + void clearModifierValue(ERlvLocalBhvrModifier eBhvrMod); + template bool getModifierValue(ERlvLocalBhvrModifier eBhvrModifier, T& value) const; + void setModifierValue(ERlvLocalBhvrModifier eBhvrMod, const RlvBehaviourModifierValue& modValue); /* * Member variables @@ -481,7 +481,7 @@ protected: bool m_fLookup; // TRUE if the object existed in gObjectList at one point in time S16 m_nLookupMisses; // Count of unsuccessful lookups in gObjectList by the GC rlv_command_list_t m_Commands; // List of behaviours held by this object (in the order they were received) - typedef std::map bhvr_modifier_map_t; + typedef std::map bhvr_modifier_map_t; bhvr_modifier_map_t m_Modifiers; // List of (local scope) modifiers set on this object friend class RlvHandler; @@ -707,17 +707,17 @@ std::string rlvGetLastParenthesisedText(const std::string& strText, std::string: // Inlined class member functions // -inline void RlvBehaviourInfo::addModifier(ERlvBehaviourModifier eBhvrMod, const std::type_info& valueType, const std::string& strBhvrMod, modifier_handler_func_t fnHandler) +inline void RlvBehaviourInfo::addModifier(ERlvLocalBhvrModifier eBhvrMod, const std::type_info& valueType, const std::string& strBhvrMod, modifier_handler_func_t fnHandler) { RLV_ASSERT_DBG(m_BhvrModifiers.find(strBhvrMod) == m_BhvrModifiers.end()); m_BhvrModifiers.insert(std::make_pair(strBhvrMod, std::make_tuple(eBhvrMod, std::type_index(valueType), fnHandler))); } -inline ERlvBehaviourModifier RlvBehaviourInfo::lookupBehaviourModifier(const std::string& strBhvrMod) const +inline ERlvLocalBhvrModifier RlvBehaviourInfo::lookupBehaviourModifier(const std::string& strBhvrMod) const { auto itBhvrModifier = m_BhvrModifiers.find(strBhvrMod); - return (m_BhvrModifiers.end() != itBhvrModifier) ? std::get<0>(itBhvrModifier->second) : RLV_MODIFIER_UNKNOWN; + return (m_BhvrModifiers.end() != itBhvrModifier) ? std::get<0>(itBhvrModifier->second) : ERlvLocalBhvrModifier::Unknown; } inline void RlvBehaviourInfo::toggleBehaviourFlag(EBehaviourFlags eBhvrFlag, bool fEnable) @@ -745,7 +745,7 @@ inline bool RlvCommand::operator ==(const RlvCommand& rhs) const } template -inline bool RlvObject::getModifierValue(ERlvBehaviourModifier eBhvrModifier, T& value) const +inline bool RlvObject::getModifierValue(ERlvLocalBhvrModifier eBhvrModifier, T& value) const { auto itBhvrModifierValue = m_Modifiers.find(eBhvrModifier); if (m_Modifiers.end() != itBhvrModifierValue) diff --git a/indra/newview/rlvmodifiers.cpp b/indra/newview/rlvmodifiers.cpp deleted file mode 100644 index ce082254f2..0000000000 --- a/indra/newview/rlvmodifiers.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/** - * - * Copyright (c) 2009-2018, Kitty Barnett - * - * The source code in this file is provided to you under the terms of the - * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A - * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt - * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt - * - * By copying, modifying or distributing this software, you acknowledge that - * you have read and understood your obligations described above, and agree to - * abide by those obligations. - * - */ - -#include "llviewerprecompiledheaders.h" - -#include "rlvmodifiers.h" - -// ==================================================================================== -// RlvBehaviourModifierAnimator -// - -RlvBehaviourModifierAnimator::~RlvBehaviourModifierAnimator() -{ - if (!m_TimerHandle.isDead()) - m_TimerHandle.markDead(); -} - -void RlvBehaviourModifierAnimator::addTween(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod, RlvBehaviourModifierAnimationType eAnimType, const RlvBehaviourModifierValue& endValue, float nDuration) -{ - // Make sure we don't run two animations on the same modifier for the same object - const auto itTween = std::find_if(m_Tweens.begin(), m_Tweens.end(), [&idObject, eBhvrMod](const RlvBehaviourModifierTween& t) { return t.idObject == idObject && t.eBhvrMod == eBhvrMod; }); - if (m_Tweens.end() != itTween) - m_Tweens.erase(itTween); - - if (const RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(eBhvrMod)) - { - RlvBehaviourModifierTween newTween; - newTween.idObject = idObject; - newTween.eBhvrMod = eBhvrMod; - newTween.eAnimType = RlvBehaviourModifierAnimationType::Lerp; - newTween.nStartTime = LLTimer::getElapsedSeconds(); - newTween.nDuration = nDuration; - newTween.startValue = pBhvrModifier->getValue(); - newTween.endValue = endValue; - if (newTween.startValue.which() == newTween.endValue.which()) - { - if (m_TimerHandle.isDead()) - m_TimerHandle = (new AnimationTimer())->getHandle(); - m_Tweens.emplace_back(std::move(newTween)); - } - } -} - -void RlvBehaviourModifierAnimator::clearTweens(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod) -{ - m_Tweens.erase(std::remove_if(m_Tweens.begin(), m_Tweens.end(), - [&idObject, eBhvrMod](const RlvBehaviourModifierTween& cmpTween) - { - return cmpTween.idObject == idObject && ((cmpTween.eBhvrMod == eBhvrMod) || (RLV_MODIFIER_UNKNOWN == eBhvrMod)); - }), m_Tweens.end()); -} - -// ==================================================================================== -// RlvBehaviourModifierAnimator timer -// - -RlvBehaviourModifierAnimator::AnimationTimer::AnimationTimer() - : LLEventTimer(1.f / RLV_MODIFIER_ANIMATION_FREQUENCY) -{ -} - - -BOOL RlvBehaviourModifierAnimator::AnimationTimer::tick() -{ - RlvBehaviourModifierAnimator& modAnimatior = RlvBehaviourModifierAnimator::instance(); - const double curTime = LLTimer::getElapsedSeconds(); - - const auto activeTweens = modAnimatior.m_Tweens; - for (const auto& curTween : activeTweens) - { - if (RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(curTween.eBhvrMod)) - { - // Update the modifier's value - float curFactor = (curTime - curTween.nStartTime) / curTween.nDuration; - if (curFactor < 1.0) - { - const auto& valueType = curTween.startValue.type(); - if (typeid(float) == valueType) - pBhvrModifier->setValue(lerp(boost::get(curTween.startValue), boost::get(curTween.endValue), curFactor), curTween.idObject); - else if (typeid(int) == valueType) - pBhvrModifier->setValue(lerp(boost::get(curTween.startValue), boost::get(curTween.endValue), curFactor), curTween.idObject); - else if (typeid(LLVector3) == valueType) - pBhvrModifier->setValue(lerp(boost::get(curTween.startValue), boost::get(curTween.endValue), curFactor), curTween.idObject); - } - else - { - pBhvrModifier->setValue(curTween.endValue, curTween.idObject); - auto itTween = std::find_if(modAnimatior.m_Tweens.begin(), modAnimatior.m_Tweens.end(), - [&curTween](const RlvBehaviourModifierTween& t) - { - // NOTE: implementation leak - taking advantage of the fact that we know there can only be one active tween per object/modifier/type combination - return t.idObject == curTween.idObject && t.eBhvrMod == curTween.eBhvrMod && t.eAnimType == curTween.eAnimType; - }); - modAnimatior.m_Tweens.erase(itTween); - } - } - } - - return modAnimatior.m_Tweens.empty(); -} - - // ==================================================================================== diff --git a/indra/newview/rlvmodifiers.h b/indra/newview/rlvmodifiers.h index 3ccec3e71c..374ef58567 100644 --- a/indra/newview/rlvmodifiers.h +++ b/indra/newview/rlvmodifiers.h @@ -73,56 +73,6 @@ struct RlvBehaviourModifierCompMax : public RlvBehaviourModifierComp } }; -// ==================================================================================== -// RlvBehaviourModifierAnimator - A class to animate behaviour modifiers -// - -enum class RlvBehaviourModifierAnimationType { Lerp }; - -struct RlvBehaviourModifierTween -{ - LLUUID idObject; - ERlvBehaviourModifier eBhvrMod; - RlvBehaviourModifierAnimationType eAnimType; - double nStartTime; - float nDuration; - RlvBehaviourModifierValue startValue; - RlvBehaviourModifierValue endValue; -}; - -class RlvBehaviourModifierAnimator : public LLSingleton -{ - LLSINGLETON_EMPTY_CTOR(RlvBehaviourModifierAnimator); -public: - ~RlvBehaviourModifierAnimator() override; - - /* - * Member functions - */ -public: - void addTween(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod, RlvBehaviourModifierAnimationType eAnimType, const RlvBehaviourModifierValue& endValue, float nDuration); - void clearTweens(const LLUUID& idObject) { clearTweens(idObject, RLV_MODIFIER_UNKNOWN); } - void clearTweens(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod); - - /* - * Animation timer - */ -protected: - class AnimationTimer : public LLEventTimer, public LLHandleProvider - { - public: - AnimationTimer(); - BOOL tick() override; - }; - - /* - * Member variables - */ -protected: - LLHandle m_TimerHandle; - std::list< RlvBehaviourModifierTween> m_Tweens; -}; - // ==================================================================================== // RlvCachedBehaviourModifier - Provides an optimized way to access a modifier that's frequently accessed and rarely updated // From 5a9c548020e2f2fcd251132c004a80d4e44a2a3c Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 5 Jan 2021 15:58:24 +0100 Subject: [PATCH 008/106] Rework @setsphere into a visual effect and consolidate all the code --- indra/newview/pipeline.cpp | 50 +---------- indra/newview/rlvactions.cpp | 33 -------- indra/newview/rlvactions.h | 9 -- indra/newview/rlvdefines.h | 25 ++---- indra/newview/rlveffects.cpp | 158 +++++++++++++++++++++++++++++++++++ indra/newview/rlveffects.h | 36 +++++++- indra/newview/rlvhandler.cpp | 15 ++++ indra/newview/rlvhelper.cpp | 22 ++--- 8 files changed, 224 insertions(+), 124 deletions(-) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index f039a9575e..886d58e3b0 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -116,6 +116,7 @@ #include "llprogressview.h" #include "llcleanup.h" // [RLVa:KB] - Checked: RLVa-2.0.0 +#include "llvisualeffect.h" #include "rlvactions.h" #include "rlvlocks.h" // [/RLVa:KB] @@ -9081,58 +9082,15 @@ void LLPipeline::renderDeferredLighting() } } + mScreen.flush(); + // [RLVa:KB] - @setsphere if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) { LL_RECORD_BLOCK_TIME(FTM_POST_DEFERRED_RLV); - - LLGLDepthTest depth(GL_FALSE, GL_FALSE); - - //mScreen.bindTarget(); - gDeferredRlvProgram.bind(); - - S32 nDiffuseChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); - if (nDiffuseChannel > -1) - { - mScreen.bindTexture(0, nDiffuseChannel); - gGL.getTexUnit(nDiffuseChannel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); - } - - S32 nDepthChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage()); - if (nDepthChannel > -1) - { - gGL.getTexUnit(nDepthChannel)->bind(&mDeferredDepth, TRUE); - } - - RlvActions::setEffectSphereShaderUniforms(&gDeferredRlvProgram, &mScreen); - - gGL.matrixMode(LLRender::MM_PROJECTION); - gGL.pushMatrix(); - gGL.loadIdentity(); - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.pushMatrix(); - gGL.loadMatrix(gGLModelView); - - mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); - mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); - - gGL.matrixMode(LLRender::MM_PROJECTION); - gGL.popMatrix(); - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.popMatrix(); - - gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); - gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DEPTH, mScreen.getUsage()); - gDeferredRlvProgram.unbind(); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(0)->activate(); - - //mScreen.flush(); + LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere); } // [/RLVa:KB] - - mScreen.flush(); - } void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp index bb656372c3..e96fdbcf60 100644 --- a/indra/newview/rlvactions.cpp +++ b/indra/newview/rlvactions.cpp @@ -17,7 +17,6 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llimview.h" -#include "llshadermgr.h" #include "llviewercamera.h" #include "llvoavatarself.h" #include "llworld.h" @@ -258,38 +257,6 @@ EChatType RlvActions::checkChatVolume(EChatType chatType) return chatType; } -// ============================================================================ -// Effects -// - -// static -void RlvActions::setEffectSphereShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget) -{ - if (!pShader || !pRenderTarget) - return; - - pShader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); - pShader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, pRenderTarget->getWidth(), pRenderTarget->getHeight()); - - // Pass the center of the sphere to the shader - const LLVector4 posSphereOrigin(isAgentAvatarValid() ? gAgentAvatarp->getRenderPosition() : gAgent.getPositionAgent() , 1.0f); - glh::vec4f posSphereOriginGl(posSphereOrigin.mV); - const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); - mvMatrix.mult_matrix_vec(posSphereOriginGl); - pShader->uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, posSphereOriginGl.v); - - const RlvBehaviourDictionary& rlvBhvrDict = RlvBehaviourDictionary::instance(); - - // Pack min/max distance and alpha together - pShader->uniform4f(LLShaderMgr::RLV_EFFECT_PARAM1, - rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MINALPHA)->getValue(), rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MINDIST)->getValue(), - rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MAXALPHA)->getValue(), rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_MAXDIST)->getValue()); - - // Pass color - const glh::vec4f sphereColor(rlvBhvrDict.getModifier(RLV_MODIFIER_EFFECT_SPHERE_COLOR)->getValue().mV, 1.0); - pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereColor.v); -} - // ============================================================================ // Inventory // diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h index 7525ef860b..122c2d4863 100644 --- a/indra/newview/rlvactions.h +++ b/indra/newview/rlvactions.h @@ -142,15 +142,6 @@ protected: // Backwards logic so that we can initialize to 0 and it won't block when we forget to/don't check if RLVa is disabled static bool s_BlockNamesContexts[SNC_COUNT]; - // ======= - // Effects - // ======= -public: - /* - * Sets the uniform values needed by the 'vision spheres' effect - */ - static void setEffectSphereShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* renderTarget); - // ========= // Inventory // ========= diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index d5e684b2e6..bb292d0d49 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -242,13 +242,6 @@ enum ERlvBehaviour { // Effects RLV_BHVR_SETSPHERE, // Gives an object exclusive control of the 'vision spheres' effect - RLV_BHVR_SETSPHERE_COLOR, - RLV_BHVR_SETSPHERE_DENSITY, - RLV_BHVR_SETSPHERE_MAXALPHA, - RLV_BHVR_SETSPHERE_MAXDIST, - RLV_BHVR_SETSPHERE_MINALPHA, - RLV_BHVR_SETSPHERE_MINDIST, - RLV_BHVR_SETOVERLAY, // Gives an object exclusive control of the overlay RLV_BHVR_SETOVERLAY_TWEEN, // Animate between the current overlay settings and the supplied values @@ -258,24 +251,13 @@ enum ERlvBehaviour { enum ERlvBehaviourModifier { - // "Vision spheres" post processing effect - RLV_MODIFIER_EFFECT_SPHERE_COLOR, // Colour to mix with the actual pixel colour (alpha depends non-linerally ) - RLV_MODIFIER_EFFECT_SPHERE_DENSITY, // Not exposed at the moment - RLV_MODIFIER_EFFECT_SPHERE_MAXALPHA,// Alpha of the mix colour at maximum distance - RLV_MODIFIER_EFFECT_SPHERE_MAXDIST, // Distance at which the blending stops ; or colour = mix(colour, sphere_colour, max_alpha) - RLV_MODIFIER_EFFECT_SPHERE_MINALPHA,// Alpha of the mix colour at minimum distance - RLV_MODIFIER_EFFECT_SPHERE_MINDIST, // Distance at which the gradual blending starts; or colour = mix(colour, sphere_colour, min_alpha) - RLV_MODIFIER_FARTOUCHDIST, // Radius of a sphere around the user in which they can interact with the world - - RLV_MODIFIER_RECVIMDISTMIN, // Minimum distance to receive an IM from an otherwise restricted sender (squared value) RLV_MODIFIER_RECVIMDISTMAX, // Maximum distance to receive an IM from an otherwise restricted sender (squared value) RLV_MODIFIER_SENDIMDISTMIN, // Minimum distance to send an IM to an otherwise restricted recipient (squared value) RLV_MODIFIER_SENDIMDISTMAX, // Maximum distance to send an IM to an otherwise restricted recipient (squared value) RLV_MODIFIER_STARTIMDISTMIN, // Minimum distance to start an IM to an otherwise restricted recipient (squared value) RLV_MODIFIER_STARTIMDISTMAX, // Maximum distance to start an IM to an otherwise restricted recipient (squared value) - RLV_MODIFIER_SETCAM_AVDIST, // Distance at which nearby avatars turn into a silhouette (normal value) RLV_MODIFIER_SETCAM_AVDISTMIN, // Minimum distance between the camera position and the user's avatar (normal value) RLV_MODIFIER_SETCAM_AVDISTMAX, // Maximum distance between the camera position and the user's avatar (normal value) @@ -287,10 +269,8 @@ enum ERlvBehaviourModifier RLV_MODIFIER_SETCAM_FOVMIN, // Minimum value for the camera's field of view (angle in radians) RLV_MODIFIER_SETCAM_FOVMAX, // Maximum value for the camera's field of view (angle in radians) RLV_MODIFIER_SETCAM_TEXTURE, // Specifies the UUID of the texture used to texture the world view - RLV_MODIFIER_SITTPDIST, RLV_MODIFIER_TPLOCALDIST, - RLV_MODIFIER_COUNT, RLV_MODIFIER_UNKNOWN }; @@ -301,6 +281,11 @@ enum class ERlvLocalBhvrModifier OverlayTexture, // Specifies the UUID of the overlay texture OverlayTint, // The tint that's applied to the overlay texture OverlayTouch, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction + SphereColor, // Colour to mix with the actual pixel colour (alpha depends non-linerally ) + SphereMaxAlpha, // Alpha of the mix colour at maximum distance + SphereMaxDist, // Distance at which the blending stops ; or colour = mix(colour, sphere_colour, max_alpha) + SphereMinAlpha, // Alpha of the mix colour at minimum distance + SphereMinDist, // Distance at which the gradual blending starts; or colour = mix(colour, sphere_colour, min_alpha) Unknown, }; diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 4750442089..842e0c27c9 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -16,10 +16,14 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" #include "llglslshader.h" #include "llrender2dutils.h" +#include "llviewershadermgr.h" #include "llviewertexturelist.h" #include "llviewerwindow.h" +#include "llvoavatarself.h" +#include "pipeline.h" #include "rlveffects.h" #include "rlvhandler.h" @@ -173,3 +177,157 @@ void RlvOverlayEffect::run() } // ==================================================================================== +// RlvSphereEffect class +// + +const float c_SphereDefaultAlpha = 1.0f; +const float c_SphereDefaultDistance = 0.0f; +const float c_SphereDefaultColor[3] = { 0.0f, 0.0f, 0.0f }; + +RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj) + : LLVisualEffect(idRlvObj, EVisualEffect::RlvSphere, EVisualEffectType::PostProcessShader) + , m_Color(LLColor3(c_SphereDefaultColor)) + , m_nMinAlpha(c_SphereDefaultAlpha), m_nMaxAlpha(c_SphereDefaultAlpha) + , m_nMinDistance(c_SphereDefaultDistance), m_nMaxDistance(c_SphereDefaultDistance) +{ + if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) + { + LLVector3 vecColor; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereColor, vecColor)) + m_Color = LLColor3(vecColor.mV); + + float nValue; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinAlpha, nValue)) + m_nMinAlpha = nValue; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxAlpha, nValue)) + m_nMaxAlpha = nValue; + + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinDist, nValue)) + m_nMinDistance = nValue; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxDist, nValue)) + m_nMaxDistance = nValue; + } +} + +RlvSphereEffect::~RlvSphereEffect() +{ +} + +// static +ERlvCmdRet RlvSphereEffect::onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_Color = LLColor3((newValue) ? boost::get(newValue.value()).mV : c_SphereDefaultColor); + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvSphereEffect::onMinAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nMinAlpha = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvSphereEffect::onMaxAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nMaxAlpha = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvSphereEffect::onMinDistChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nMinDistance = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvSphereEffect::onMaxDistChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nMaxDistance = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + } + return RLV_RET_SUCCESS; +} + +void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget) +{ + pShader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); + pShader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, pRenderTarget->getWidth(), pRenderTarget->getHeight()); + + // Pass the sphere origin to the shader + const LLVector4 posSphereOrigin(isAgentAvatarValid() ? gAgentAvatarp->getRenderPosition() : gAgent.getPositionAgent(), 1.0f); + glh::vec4f posSphereOriginGl(posSphereOrigin.mV); + const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); + mvMatrix.mult_matrix_vec(posSphereOriginGl); + pShader->uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, posSphereOriginGl.v); + + // Pack min/max distance and alpha together + const glh::vec4f sphereParams(m_nMinAlpha, m_nMinDistance, m_nMaxAlpha, m_nMaxDistance); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM1, 1, sphereParams.v); + + // Pass color + const glh::vec4f sphereColor(m_Color.mV, 1.0); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereColor.v); +} + +void RlvSphereEffect::run() +{ + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + + gPipeline.mScreen.bindTarget(); + gDeferredRlvProgram.bind(); + + S32 nDiffuseChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); + if (nDiffuseChannel > -1) + { + gPipeline.mScreen.bindTexture(0, nDiffuseChannel); + gGL.getTexUnit(nDiffuseChannel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + } + + S32 nDepthChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mDeferredDepth.getUsage()); + if (nDepthChannel > -1) + { + gGL.getTexUnit(nDepthChannel)->bind(&gPipeline.mDeferredDepth, TRUE); + } + + setShaderUniforms(&gDeferredRlvProgram, &gPipeline.mScreen); + + gGL.matrixMode(LLRender::MM_PROJECTION); + gGL.pushMatrix(); + gGL.loadIdentity(); + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.pushMatrix(); + gGL.loadMatrix(gGLModelView); + + gPipeline.mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + gPipeline.mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); + + gGL.matrixMode(LLRender::MM_PROJECTION); + gGL.popMatrix(); + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.popMatrix(); + + gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); + gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mScreen.getUsage()); + gDeferredRlvProgram.unbind(); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.getTexUnit(0)->activate(); + + gPipeline.mScreen.flush(); +} + +// ==================================================================================== diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h index 181187fe9d..86a6f3e7c4 100644 --- a/indra/newview/rlveffects.h +++ b/indra/newview/rlveffects.h @@ -36,9 +36,10 @@ public: ~RlvOverlayEffect(); public: + bool hitTest(const LLCoordGL& ptMouse) const; + void run() override; void tweenAlpha(float endAlpha, double duration) { m_nAlpha.start(endAlpha, duration); } void tweenColor(LLColor3 endColor, double duration) { m_Color.start(endColor, duration); } - bool hitTest(const LLCoordGL& ptMouse) const; static ERlvCmdRet onAlphaValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onBlockTouchValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onColorValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); @@ -47,8 +48,6 @@ protected: void clearImage(); void setImage(const LLUUID& idTexture); - void run() override; - /* * Member variables */ @@ -62,3 +61,34 @@ protected: }; // ==================================================================================== +// RlvSphereEffect class +// + +class RlvSphereEffect : public LLVisualEffect +{ +public: + RlvSphereEffect(const LLUUID& idRlvObj); + ~RlvSphereEffect(); + +public: + void run() override; + static ERlvCmdRet onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onMinAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onMaxAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onMinDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onMaxDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); +protected: + void setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget); + + /* + * Member variables + */ +protected: + LLColor3 m_Color; + float m_nMinAlpha; + float m_nMaxAlpha; + float m_nMinDistance; + float m_nMaxDistance; +}; + +// ==================================================================================== diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index a89338d5f9..af44f0dd15 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -2059,6 +2059,21 @@ void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehavio LLVfxManager::instance().removeEffect(gRlvHandler.getCurrentObject()); } +// Handles: @setsphere=n|y +template<> template<> +ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) +{ + ERlvCmdRet eRet = RlvBehaviourGenericHandler::onCommand(rlvCmd, fRefCount); + if ( (RLV_RET_SUCCESS == eRet) && (!rlvCmd.isModifier()) ) + { + if (gRlvHandler.hasBehaviour(rlvCmd.getObjectID(), rlvCmd.getBehaviourType())) + LLVfxManager::instance().addEffect(new RlvSphereEffect(rlvCmd.getObjectID())); + else + LLVfxManager::instance().removeEffect(gRlvHandler.getCurrentObject()); + } + return RLV_RET_SUCCESS; +} + // Handles: @sendchannel[:]=n|y and @sendchannel_except[:]=n|y template<> template<> ERlvCmdRet RlvBehaviourSendChannelHandler::onCommand(const RlvCommand& rlvCmd, bool& fRefCount) diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 21c5c164be..da441cfffc 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -215,19 +215,6 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() addEntry(new RlvBehaviourProcessor("camzoommax", RlvBehaviourInfo::BHVR_DEPRECATED)); addEntry(new RlvBehaviourGenericToggleProcessor("camunlock", RlvBehaviourInfo::BHVR_SYNONYM | RlvBehaviourInfo::BHVR_DEPRECATED)); - // Effect: "vision spheres" - addEntry(new RlvBehaviourGenericProcessor("setsphere", RLV_BHVR_SETSPHERE, RlvBehaviourInfo::BHVR_EXPERIMENTAL)); - addModifier(new RlvForceGenericProcessor("setsphere_color", RLV_BHVR_SETSPHERE_COLOR, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_EFFECT_SPHERE_COLOR, new RlvBehaviourModifier("Effect: Vision spheres - Color", LLVector3(.0f, .0f, .0f), true, new RlvBehaviourModifierComp())); - addModifier(new RlvForceGenericProcessor("setsphere_maxdist", RLV_BHVR_SETSPHERE_MAXDIST, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_EFFECT_SPHERE_MAXDIST, new RlvBehaviourModifier("Effect: Vision spheres - Max distance", 0.f, false, new RlvBehaviourModifierCompMin())); - addModifier(new RlvForceGenericProcessor("setsphere_maxalpha", RLV_BHVR_SETSPHERE_MAXALPHA, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_EFFECT_SPHERE_MAXALPHA, new RlvBehaviourModifier("Effect: Vision spheres - Max distance alpha", 1.0f, false, new RlvBehaviourModifierCompMax())); - addModifier(new RlvForceGenericProcessor("setsphere_mindist", RLV_BHVR_SETSPHERE_MINDIST, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_EFFECT_SPHERE_MINDIST, new RlvBehaviourModifier("Effect: Vision spheres - Min distance", 0.f, false, new RlvBehaviourModifierCompMin())); - addModifier(new RlvForceGenericProcessor("setsphere_minalpha", RLV_BHVR_SETSPHERE_MINALPHA, RlvBehaviourInfo::BHVR_EXPERIMENTAL), - RLV_MODIFIER_EFFECT_SPHERE_MINALPHA, new RlvBehaviourModifier("Effect: Vision spheres - Min distance alpha", 1.0f, false, new RlvBehaviourModifierCompMax())); - // Overlay RlvBehaviourInfo* pSetOverlayBhvr = new RlvBehaviourGenericToggleProcessor("setoverlay"); pSetOverlayBhvr->addModifier(ERlvLocalBhvrModifier::OverlayAlpha, typeid(float), "alpha", &RlvOverlayEffect::onAlphaValueChanged); @@ -237,6 +224,15 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() addEntry(pSetOverlayBhvr); addEntry(new RlvForceProcessor("setoverlay_tween", RlvBehaviourInfo::BHVR_EXPERIMENTAL)); + // Sphere + RlvBehaviourInfo* pSetSphereBhvr = new RlvBehaviourProcessor("setsphere", RlvBehaviourInfo::BHVR_EXPERIMENTAL); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereColor, typeid(LLVector3), "color", &RlvSphereEffect::onColorChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinAlpha, typeid(float), "minalpha", &RlvSphereEffect::onMinAlphaChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxAlpha, typeid(float), "maxalpha", &RlvSphereEffect::onMaxAlphaChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinDist, typeid(float), "mindist", &RlvSphereEffect::onMinDistChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxDist, typeid(float), "maxdist", &RlvSphereEffect::onMaxDistChanged); + addEntry(pSetSphereBhvr); + // // Force-wear // From 626f806fc46c3a88be75d75e43cc9ce3171c06dc Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 5 Jan 2021 23:27:00 +0100 Subject: [PATCH 009/106] Add a mode parameter to @setsphere and add a blur effect --- indra/llrender/llshadermgr.cpp | 1 + indra/llrender/llshadermgr.h | 1 + .../shaders/class1/deferred/rlvF.glsl | 35 +++++- indra/newview/rlvdefines.h | 1 + indra/newview/rlveffects.cpp | 104 ++++++++++++------ indra/newview/rlveffects.h | 18 +-- indra/newview/rlvhelper.cpp | 5 +- 7 files changed, 119 insertions(+), 46 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index a827d01aaf..b442375f4c 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1254,6 +1254,7 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("camPosLocal"); // [RLVa:KB] - @setsphere mReservedUniforms.push_back("avPosLocal"); + mReservedUniforms.push_back("rlvEffectMode"); mReservedUniforms.push_back("rlvEffectParam1"); mReservedUniforms.push_back("rlvEffectParam2"); mReservedUniforms.push_back("rlvEffectParam3"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 02fbd8e4d1..50e1c99f92 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -205,6 +205,7 @@ public: WL_CAMPOSLOCAL, // [RLVa:KB] - @setsphere RLV_AVPOSLOCAL, + RLV_EFFECT_MODE, RLV_EFFECT_PARAM1, RLV_EFFECT_PARAM2, RLV_EFFECT_PARAM3, diff --git a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl index 2f99e88936..384592cbd3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl @@ -30,9 +30,10 @@ uniform mat4 inv_proj; uniform vec2 screen_res; uniform vec4 avPosLocal; +uniform int rlvEffectMode; uniform vec4 rlvEffectParam1; uniform vec4 rlvEffectParam2; -uniform vec4 rlvEffectParam3; +uniform vec2 rlvEffectParam3; vec4 getPosition_d(vec2 pos_screen, float depth) { @@ -46,6 +47,27 @@ vec4 getPosition_d(vec2 pos_screen, float depth) return pos; } +vec3 blur13(sampler2DRect image, vec2 uv, vec2 direction) +{ + vec4 color = vec4(0.0); + vec2 off1 = vec2(1.411764705882353) * direction; + vec2 off2 = vec2(3.2941176470588234) * direction; + vec2 off3 = vec2(5.176470588235294) * direction; + + color += texture2D(image, uv) * 0.1964825501511404; + + color += texture2D(image, uv + off1) * 0.2969069646728344; + color += texture2D(image, uv - off1) * 0.2969069646728344; + + color += texture2D(image, uv + off2) * 0.09447039785044732; + color += texture2D(image, uv - off2) * 0.09447039785044732; + + color += texture2D(image, uv + off3) * 0.010381362401148057; + color += texture2D(image, uv - off3) * 0.010381362401148057; + + return color.xyz; +} + void main() { vec2 fragTC = vary_fragcoord.st; @@ -62,7 +84,16 @@ void main() float effectStrength = mix(sphereMinMaxValue.x, 0, distance < sphereMinMaxDist.x) + mix(0, sphereMinMaxValue.y - sphereMinMaxValue.x, clamp((distance - sphereMinMaxDist.x) / (sphereMinMaxDist.y - sphereMinMaxDist.x), 0.0, 1.0)); - fragColor = mix(fragColor, sphereColour, effectStrength); + // *TODO: It should be fine to branch on a uniform? + switch (rlvEffectMode) + { + case 0: // Blend + fragColor = mix(fragColor, sphereColour, effectStrength); + break; + case 1: // Blur + fragColor = blur13(diffuseRect, fragTC, effectStrength * rlvEffectParam3.xy); + break; + } frag_color.rgb = fragColor; frag_color.a = 0.0; diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index bb292d0d49..d5c410e7ea 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -281,6 +281,7 @@ enum class ERlvLocalBhvrModifier OverlayTexture, // Specifies the UUID of the overlay texture OverlayTint, // The tint that's applied to the overlay texture OverlayTouch, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction + SphereMode, SphereColor, // Colour to mix with the actual pixel colour (alpha depends non-linerally ) SphereMaxAlpha, // Alpha of the mix colour at maximum distance SphereMaxDist, // Distance at which the blending stops ; or colour = mix(colour, sphere_colour, max_alpha) diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 842e0c27c9..247414014b 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -180,27 +180,33 @@ void RlvOverlayEffect::run() // RlvSphereEffect class // +const int c_SphereDefaultMode = 0; const float c_SphereDefaultAlpha = 1.0f; const float c_SphereDefaultDistance = 0.0f; const float c_SphereDefaultColor[3] = { 0.0f, 0.0f, 0.0f }; RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj) : LLVisualEffect(idRlvObj, EVisualEffect::RlvSphere, EVisualEffectType::PostProcessShader) + , m_nMode((ESphereMode)c_SphereDefaultMode) , m_Color(LLColor3(c_SphereDefaultColor)) - , m_nMinAlpha(c_SphereDefaultAlpha), m_nMaxAlpha(c_SphereDefaultAlpha) , m_nMinDistance(c_SphereDefaultDistance), m_nMaxDistance(c_SphereDefaultDistance) + , m_nMinValue(c_SphereDefaultAlpha), m_nMaxValue(c_SphereDefaultAlpha) { if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) { + int nMode; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMode, nMode)) + m_nMode = (ESphereMode)nMode; + LLVector3 vecColor; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereColor, vecColor)) m_Color = LLColor3(vecColor.mV); float nValue; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinAlpha, nValue)) - m_nMinAlpha = nValue; + m_nMinValue = nValue; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxAlpha, nValue)) - m_nMaxAlpha = nValue; + m_nMaxValue = nValue; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinDist, nValue)) m_nMinDistance = nValue; @@ -213,6 +219,16 @@ RlvSphereEffect::~RlvSphereEffect() { } +// static +ERlvCmdRet RlvSphereEffect::onModeChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nMode = (ESphereMode)((newValue) ? boost::get(newValue.value()) : c_SphereDefaultMode); + } + return RLV_RET_SUCCESS; +} + // static ERlvCmdRet RlvSphereEffect::onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue) { @@ -223,26 +239,6 @@ ERlvCmdRet RlvSphereEffect::onColorChanged(const LLUUID& idRlvObj, const boost:: return RLV_RET_SUCCESS; } -// static -ERlvCmdRet RlvSphereEffect::onMinAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue) -{ - if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) - { - pEffect->m_nMinAlpha = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; - } - return RLV_RET_SUCCESS; -} - -// static -ERlvCmdRet RlvSphereEffect::onMaxAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue) -{ - if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) - { - pEffect->m_nMaxAlpha = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; - } - return RLV_RET_SUCCESS; -} - // static ERlvCmdRet RlvSphereEffect::onMinDistChanged(const LLUUID& idRlvObj, const boost::optional newValue) { @@ -263,10 +259,31 @@ ERlvCmdRet RlvSphereEffect::onMaxDistChanged(const LLUUID& idRlvObj, const boost return RLV_RET_SUCCESS; } +// static +ERlvCmdRet RlvSphereEffect::onMinValueChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nMinValue = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvSphereEffect::onMaxValueChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nMaxValue = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + } + return RLV_RET_SUCCESS; +} + void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget) { pShader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); pShader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, pRenderTarget->getWidth(), pRenderTarget->getHeight()); + pShader->uniform1i(LLShaderMgr::RLV_EFFECT_MODE, llclamp((int)m_nMode, 0, (int)ESphereMode::Count)); // Pass the sphere origin to the shader const LLVector4 posSphereOrigin(isAgentAvatarValid() ? gAgentAvatarp->getRenderPosition() : gAgent.getPositionAgent(), 1.0f); @@ -276,7 +293,7 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p pShader->uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, posSphereOriginGl.v); // Pack min/max distance and alpha together - const glh::vec4f sphereParams(m_nMinAlpha, m_nMinDistance, m_nMaxAlpha, m_nMaxDistance); + const glh::vec4f sphereParams(m_nMinValue, m_nMinDistance, m_nMaxValue, m_nMaxDistance); pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM1, 1, sphereParams.v); // Pass color @@ -284,28 +301,23 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereColor.v); } -void RlvSphereEffect::run() +void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const { - LLGLDepthTest depth(GL_FALSE, GL_FALSE); - gPipeline.mScreen.bindTarget(); - gDeferredRlvProgram.bind(); - S32 nDiffuseChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); + S32 nDiffuseChannel = pShader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); if (nDiffuseChannel > -1) { gPipeline.mScreen.bindTexture(0, nDiffuseChannel); gGL.getTexUnit(nDiffuseChannel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } - S32 nDepthChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mDeferredDepth.getUsage()); + S32 nDepthChannel = pShader->enableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mDeferredDepth.getUsage()); if (nDepthChannel > -1) { gGL.getTexUnit(nDepthChannel)->bind(&gPipeline.mDeferredDepth, TRUE); } - setShaderUniforms(&gDeferredRlvProgram, &gPipeline.mScreen); - gGL.matrixMode(LLRender::MM_PROJECTION); gGL.pushMatrix(); gGL.loadIdentity(); @@ -321,13 +333,35 @@ void RlvSphereEffect::run() gGL.matrixMode(LLRender::MM_MODELVIEW); gGL.popMatrix(); - gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); - gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mScreen.getUsage()); - gDeferredRlvProgram.unbind(); + pShader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); + pShader->disableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mScreen.getUsage()); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(0)->activate(); gPipeline.mScreen.flush(); } +void RlvSphereEffect::run() +{ + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + + gDeferredRlvProgram.bind(); + setShaderUniforms(&gDeferredRlvProgram, &gPipeline.mScreen); + + switch (m_nMode) + { + case ESphereMode::Blend: + renderPass(&gDeferredRlvProgram); + break; + case ESphereMode::Blur: + gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM3, 1.f, 0.f); + renderPass(&gDeferredRlvProgram); + gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM3, 0.f, 1.f); + renderPass(&gDeferredRlvProgram); + break; + } + + gDeferredRlvProgram.unbind(); +} + // ==================================================================================== diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h index 86a6f3e7c4..f9336e8ae3 100644 --- a/indra/newview/rlveffects.h +++ b/indra/newview/rlveffects.h @@ -72,23 +72,27 @@ public: public: void run() override; + static ERlvCmdRet onModeChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue); - static ERlvCmdRet onMinAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue); - static ERlvCmdRet onMaxAlphaChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onMinDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onMaxDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onMinValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onMaxValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); protected: + void renderPass(LLGLSLShader* pShader) const; void setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget); /* * Member variables */ protected: - LLColor3 m_Color; - float m_nMinAlpha; - float m_nMaxAlpha; - float m_nMinDistance; - float m_nMaxDistance; + enum class ESphereMode { Blend = 0, SoftBlur, Blur, Count }; + ESphereMode m_nMode; + LLColor3 m_Color; + float m_nMinValue; + float m_nMaxValue; + float m_nMinDistance; + float m_nMaxDistance; }; // ==================================================================================== diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index da441cfffc..f5b8921037 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -226,9 +226,10 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() // Sphere RlvBehaviourInfo* pSetSphereBhvr = new RlvBehaviourProcessor("setsphere", RlvBehaviourInfo::BHVR_EXPERIMENTAL); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMode, typeid(int), "mode", &RlvSphereEffect::onModeChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereColor, typeid(LLVector3), "color", &RlvSphereEffect::onColorChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinAlpha, typeid(float), "minalpha", &RlvSphereEffect::onMinAlphaChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxAlpha, typeid(float), "maxalpha", &RlvSphereEffect::onMaxAlphaChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinAlpha, typeid(float), "minalpha", &RlvSphereEffect::onMinValueChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxAlpha, typeid(float), "maxalpha", &RlvSphereEffect::onMaxValueChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinDist, typeid(float), "mindist", &RlvSphereEffect::onMinDistChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxDist, typeid(float), "maxdist", &RlvSphereEffect::onMaxDistChanged); addEntry(pSetSphereBhvr); From db89a4646c4e1296052fcc14e43f38d371e9c6e1 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Tue, 5 Jan 2021 23:52:23 +0100 Subject: [PATCH 010/106] Minor refactoring + add @setsphere_origin to switch between avatar and camera anchoring --- indra/llrender/llshadermgr.cpp | 2 +- indra/llrender/llshadermgr.h | 2 +- .../shaders/class1/deferred/rlvF.glsl | 21 +++--- indra/newview/rlvdefines.h | 15 +++-- indra/newview/rlveffects.cpp | 64 +++++++++++++------ indra/newview/rlveffects.h | 15 +++-- indra/newview/rlvhelper.cpp | 5 +- 7 files changed, 78 insertions(+), 46 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index b442375f4c..25a9b98240 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1253,11 +1253,11 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("camPosLocal"); // [RLVa:KB] - @setsphere - mReservedUniforms.push_back("avPosLocal"); mReservedUniforms.push_back("rlvEffectMode"); mReservedUniforms.push_back("rlvEffectParam1"); mReservedUniforms.push_back("rlvEffectParam2"); mReservedUniforms.push_back("rlvEffectParam3"); + mReservedUniforms.push_back("rlvEffectParam4"); // [/RLV:KB] mReservedUniforms.push_back("gWindDir"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 50e1c99f92..724d7eca5d 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -204,11 +204,11 @@ public: WL_CAMPOSLOCAL, // [RLVa:KB] - @setsphere - RLV_AVPOSLOCAL, RLV_EFFECT_MODE, RLV_EFFECT_PARAM1, RLV_EFFECT_PARAM2, RLV_EFFECT_PARAM3, + RLV_EFFECT_PARAM4, // [/RLVa:KB] AVATAR_WIND, diff --git a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl index 384592cbd3..3f17354569 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl @@ -29,11 +29,11 @@ uniform sampler2DRect depthMap; uniform mat4 inv_proj; uniform vec2 screen_res; -uniform vec4 avPosLocal; -uniform int rlvEffectMode; -uniform vec4 rlvEffectParam1; -uniform vec4 rlvEffectParam2; -uniform vec2 rlvEffectParam3; +uniform int rlvEffectMode; // ESphereMode +uniform vec4 rlvEffectParam1; // Sphere origin (in local coordinates) +uniform vec4 rlvEffectParam2; // Min/max dist + min/max value +uniform vec4 rlvEffectParam3; // Sphere color (not used for blur) +uniform vec2 rlvEffectParam4; // Blur direction (not used for blend) vec4 getPosition_d(vec2 pos_screen, float depth) { @@ -70,15 +70,16 @@ vec3 blur13(sampler2DRect image, vec2 uv, vec2 direction) void main() { + vec3 avPosLocal = rlvEffectParam1.xyz; vec2 fragTC = vary_fragcoord.st; float fragDepth = texture2DRect(depthMap, fragTC).x; vec3 fragPosLocal = getPosition_d(fragTC, fragDepth).xyz; vec3 fragColor = texture2DRect(diffuseRect, fragTC).rgb; - float distance = length(fragPosLocal.xyz - avPosLocal.xyz); + float distance = length(fragPosLocal.xyz - avPosLocal); - vec2 sphereMinMaxDist = rlvEffectParam1.yw; - vec2 sphereMinMaxValue = rlvEffectParam1.xz; - vec3 sphereColour = rlvEffectParam2.rgb; + vec2 sphereMinMaxDist = rlvEffectParam2.yw; + vec2 sphereMinMaxValue = rlvEffectParam2.xz; + vec3 sphereColour = rlvEffectParam3.rgb; // Linear non-branching interpolation of the strength of the sphere effect (replaces if/elseif/else for x < min, min <= x <= max and x > max) float effectStrength = mix(sphereMinMaxValue.x, 0, distance < sphereMinMaxDist.x) + @@ -91,7 +92,7 @@ void main() fragColor = mix(fragColor, sphereColour, effectStrength); break; case 1: // Blur - fragColor = blur13(diffuseRect, fragTC, effectStrength * rlvEffectParam3.xy); + fragColor = blur13(diffuseRect, fragTC, effectStrength * rlvEffectParam4.xy); break; } diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index d5c410e7ea..1736b688f0 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -277,16 +277,19 @@ enum ERlvBehaviourModifier enum class ERlvLocalBhvrModifier { + // @setoverlay OverlayAlpha, // Transparency level of the overlay texture (in addition to the texture's own alpha channel) OverlayTexture, // Specifies the UUID of the overlay texture OverlayTint, // The tint that's applied to the overlay texture OverlayTouch, // Determines whether the overlay texture's alpha channel will be used to allow/block world interaction - SphereMode, - SphereColor, // Colour to mix with the actual pixel colour (alpha depends non-linerally ) - SphereMaxAlpha, // Alpha of the mix colour at maximum distance - SphereMaxDist, // Distance at which the blending stops ; or colour = mix(colour, sphere_colour, max_alpha) - SphereMinAlpha, // Alpha of the mix colour at minimum distance - SphereMinDist, // Distance at which the gradual blending starts; or colour = mix(colour, sphere_colour, min_alpha) + // @setsphere + SphereMode, // The type of effect that will apply to any pixel that intersects with the sphere (e.g. blend, blur, ...) + SphereOrigin, // The origin of the sphere can either be the avatar or the camera position + SphereColor, // [Blend only] Colour to mix with the actual pixel colour + SphereMinDist, // Distance at which the effect starts and has weight minValue; e.g. for blend this would be colour = mix(colour, sphere_colour, min_alpha) + SphereMaxDist, // Distance at which the effect starts and has weight maxValue; e.g. for blend this would be colour = mix(colour, sphere_colour, max_alpha) + SphereMinValue, // Value of the effect at minimum distance + SphereMaxValue, // Value of the effect at maximum distance Unknown, }; diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 247414014b..5c11bcba84 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -181,37 +181,41 @@ void RlvOverlayEffect::run() // const int c_SphereDefaultMode = 0; -const float c_SphereDefaultAlpha = 1.0f; -const float c_SphereDefaultDistance = 0.0f; +const int c_SphereDefaultOrigin = 0; const float c_SphereDefaultColor[3] = { 0.0f, 0.0f, 0.0f }; +const float c_SphereDefaultDistance = 0.0f; +const float c_SphereDefaultAlpha = 1.0f; RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj) : LLVisualEffect(idRlvObj, EVisualEffect::RlvSphere, EVisualEffectType::PostProcessShader) , m_nMode((ESphereMode)c_SphereDefaultMode) + , m_nOrigin((ESphereOrigin)c_SphereDefaultOrigin) , m_Color(LLColor3(c_SphereDefaultColor)) , m_nMinDistance(c_SphereDefaultDistance), m_nMaxDistance(c_SphereDefaultDistance) , m_nMinValue(c_SphereDefaultAlpha), m_nMaxValue(c_SphereDefaultAlpha) { if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) { - int nMode; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMode, nMode)) - m_nMode = (ESphereMode)nMode; + int nNumber; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMode, nNumber)) + m_nMode = (ESphereMode)nNumber; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereOrigin, nNumber)) + m_nOrigin = (ESphereOrigin)nNumber; LLVector3 vecColor; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereColor, vecColor)) m_Color = LLColor3(vecColor.mV); - float nValue; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinAlpha, nValue)) - m_nMinValue = nValue; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxAlpha, nValue)) - m_nMaxValue = nValue; + float nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinDist, nFloat)) + m_nMinDistance = nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxDist, nFloat)) + m_nMaxDistance = nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinDist, nValue)) - m_nMinDistance = nValue; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxDist, nValue)) - m_nMaxDistance = nValue; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinValue, nFloat)) + m_nMinValue = nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxValue, nFloat)) + m_nMaxValue = nFloat; } } @@ -229,6 +233,16 @@ ERlvCmdRet RlvSphereEffect::onModeChanged(const LLUUID& idRlvObj, const boost::o return RLV_RET_SUCCESS; } +// static +ERlvCmdRet RlvSphereEffect::onOriginChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nOrigin = (ESphereOrigin)((newValue) ? boost::get(newValue.value()) : c_SphereDefaultOrigin); + } + return RLV_RET_SUCCESS; +} + // static ERlvCmdRet RlvSphereEffect::onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue) { @@ -286,19 +300,29 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p pShader->uniform1i(LLShaderMgr::RLV_EFFECT_MODE, llclamp((int)m_nMode, 0, (int)ESphereMode::Count)); // Pass the sphere origin to the shader - const LLVector4 posSphereOrigin(isAgentAvatarValid() ? gAgentAvatarp->getRenderPosition() : gAgent.getPositionAgent(), 1.0f); + LLVector4 posSphereOrigin; + switch (m_nOrigin) + { + case ESphereOrigin::Camera: + posSphereOrigin.setVec(LLViewerCamera::instance().getOrigin(), 1.0f); + break; + case ESphereOrigin::Avatar: + default: + posSphereOrigin.setVec((isAgentAvatarValid()) ? gAgentAvatarp->getRenderPosition() : gAgent.getPositionAgent(), 1.0f); + break; + } glh::vec4f posSphereOriginGl(posSphereOrigin.mV); const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); mvMatrix.mult_matrix_vec(posSphereOriginGl); - pShader->uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, posSphereOriginGl.v); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM1, 1, posSphereOriginGl.v); // Pack min/max distance and alpha together const glh::vec4f sphereParams(m_nMinValue, m_nMinDistance, m_nMaxValue, m_nMaxDistance); - pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM1, 1, sphereParams.v); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereParams.v); // Pass color const glh::vec4f sphereColor(m_Color.mV, 1.0); - pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereColor.v); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM3, 1, sphereColor.v); } void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const @@ -354,9 +378,9 @@ void RlvSphereEffect::run() renderPass(&gDeferredRlvProgram); break; case ESphereMode::Blur: - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM3, 1.f, 0.f); + gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM4, 1.f, 0.f); renderPass(&gDeferredRlvProgram); - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM3, 0.f, 1.f); + gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM4, 0.f, 1.f); renderPass(&gDeferredRlvProgram); break; } diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h index f9336e8ae3..09e5a5b8c7 100644 --- a/indra/newview/rlveffects.h +++ b/indra/newview/rlveffects.h @@ -73,6 +73,7 @@ public: public: void run() override; static ERlvCmdRet onModeChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onOriginChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onMinDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onMaxDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); @@ -87,12 +88,14 @@ protected: */ protected: enum class ESphereMode { Blend = 0, SoftBlur, Blur, Count }; - ESphereMode m_nMode; - LLColor3 m_Color; - float m_nMinValue; - float m_nMaxValue; - float m_nMinDistance; - float m_nMaxDistance; + ESphereMode m_nMode; + enum class ESphereOrigin { Avatar = 0, Camera, Count }; + ESphereOrigin m_nOrigin; + LLColor3 m_Color; + float m_nMinDistance; + float m_nMaxDistance; + float m_nMinValue; + float m_nMaxValue; }; // ==================================================================================== diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index f5b8921037..324c774c25 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -227,11 +227,12 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() // Sphere RlvBehaviourInfo* pSetSphereBhvr = new RlvBehaviourProcessor("setsphere", RlvBehaviourInfo::BHVR_EXPERIMENTAL); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMode, typeid(int), "mode", &RlvSphereEffect::onModeChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereOrigin, typeid(int), "origin", &RlvSphereEffect::onOriginChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereColor, typeid(LLVector3), "color", &RlvSphereEffect::onColorChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinAlpha, typeid(float), "minalpha", &RlvSphereEffect::onMinValueChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxAlpha, typeid(float), "maxalpha", &RlvSphereEffect::onMaxValueChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinDist, typeid(float), "mindist", &RlvSphereEffect::onMinDistChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxDist, typeid(float), "maxdist", &RlvSphereEffect::onMaxDistChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinValue, typeid(float), "minvalue", &RlvSphereEffect::onMinValueChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxValue, typeid(float), "maxvalue", &RlvSphereEffect::onMaxValueChanged); addEntry(pSetSphereBhvr); // From 22a5734051070dee0fad6944ee91269fa9e66a92 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 6 Jan 2021 04:36:56 +0100 Subject: [PATCH 011/106] A clever bunny noticed that other commands use dist[min|max] rather than [min|max]dist --- indra/llrender/llshadermgr.cpp | 1 + indra/llrender/llshadermgr.h | 1 + .../shaders/class1/deferred/rlvF.glsl | 31 ++++--- indra/newview/rlvdefines.h | 9 ++- indra/newview/rlveffects.cpp | 80 ++++++++++++------- indra/newview/rlveffects.h | 23 +++--- indra/newview/rlvhelper.cpp | 9 ++- 7 files changed, 92 insertions(+), 62 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 25a9b98240..c65cad6ecf 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1258,6 +1258,7 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("rlvEffectParam2"); mReservedUniforms.push_back("rlvEffectParam3"); mReservedUniforms.push_back("rlvEffectParam4"); + mReservedUniforms.push_back("rlvEffectParam5"); // [/RLV:KB] mReservedUniforms.push_back("gWindDir"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 724d7eca5d..92bfce924c 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -209,6 +209,7 @@ public: RLV_EFFECT_PARAM2, RLV_EFFECT_PARAM3, RLV_EFFECT_PARAM4, + RLV_EFFECT_PARAM5, // [/RLVa:KB] AVATAR_WIND, diff --git a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl index 3f17354569..6ad884446b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl @@ -32,8 +32,18 @@ uniform vec2 screen_res; uniform int rlvEffectMode; // ESphereMode uniform vec4 rlvEffectParam1; // Sphere origin (in local coordinates) uniform vec4 rlvEffectParam2; // Min/max dist + min/max value -uniform vec4 rlvEffectParam3; // Sphere color (not used for blur) -uniform vec2 rlvEffectParam4; // Blur direction (not used for blend) +uniform bvec2 rlvEffectParam3; // Min/max dist extend +uniform vec4 rlvEffectParam4; // Sphere color (not used for blur) +uniform vec2 rlvEffectParam5; // Blur direction (not used for blend) + +#define SPHERE_ORIGIN rlvEffectParam1.xyz +#define SPHERE_DISTMIN rlvEffectParam2.y +#define SPHERE_DISTMAX rlvEffectParam2.w +#define SPHERE_DISTEXTEND rlvEffectParam3 +#define SPHERE_VALUEMIN rlvEffectParam2.x +#define SPHERE_VALUEMAX rlvEffectParam2.z +#define SPHERE_COLOUR rlvEffectParam4.rgb +#define BLUR_DIRECTION rlvEffectParam5.xy vec4 getPosition_d(vec2 pos_screen, float depth) { @@ -70,29 +80,24 @@ vec3 blur13(sampler2DRect image, vec2 uv, vec2 direction) void main() { - vec3 avPosLocal = rlvEffectParam1.xyz; vec2 fragTC = vary_fragcoord.st; float fragDepth = texture2DRect(depthMap, fragTC).x; vec3 fragPosLocal = getPosition_d(fragTC, fragDepth).xyz; vec3 fragColor = texture2DRect(diffuseRect, fragTC).rgb; - float distance = length(fragPosLocal.xyz - avPosLocal); - - vec2 sphereMinMaxDist = rlvEffectParam2.yw; - vec2 sphereMinMaxValue = rlvEffectParam2.xz; - vec3 sphereColour = rlvEffectParam3.rgb; + float distance = length(fragPosLocal.xyz - SPHERE_ORIGIN); // Linear non-branching interpolation of the strength of the sphere effect (replaces if/elseif/else for x < min, min <= x <= max and x > max) - float effectStrength = mix(sphereMinMaxValue.x, 0, distance < sphereMinMaxDist.x) + - mix(0, sphereMinMaxValue.y - sphereMinMaxValue.x, clamp((distance - sphereMinMaxDist.x) / (sphereMinMaxDist.y - sphereMinMaxDist.x), 0.0, 1.0)); + float effectStrength = SPHERE_VALUEMIN + mix(0, SPHERE_VALUEMAX - SPHERE_VALUEMIN, (distance - SPHERE_DISTMIN) / (SPHERE_DISTMAX - SPHERE_DISTMIN)); + effectStrength = mix(effectStrength, mix(0, SPHERE_VALUEMIN, SPHERE_DISTEXTEND.x), distance < SPHERE_DISTMIN); + effectStrength = mix(effectStrength, mix(0, SPHERE_VALUEMAX, SPHERE_DISTEXTEND.y), distance > SPHERE_DISTMAX); - // *TODO: It should be fine to branch on a uniform? switch (rlvEffectMode) { case 0: // Blend - fragColor = mix(fragColor, sphereColour, effectStrength); + fragColor = mix(fragColor, SPHERE_COLOUR, effectStrength); break; case 1: // Blur - fragColor = blur13(diffuseRect, fragTC, effectStrength * rlvEffectParam4.xy); + fragColor = blur13(diffuseRect, fragTC, effectStrength * BLUR_DIRECTION); break; } diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 1736b688f0..526572975b 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -286,10 +286,11 @@ enum class ERlvLocalBhvrModifier SphereMode, // The type of effect that will apply to any pixel that intersects with the sphere (e.g. blend, blur, ...) SphereOrigin, // The origin of the sphere can either be the avatar or the camera position SphereColor, // [Blend only] Colour to mix with the actual pixel colour - SphereMinDist, // Distance at which the effect starts and has weight minValue; e.g. for blend this would be colour = mix(colour, sphere_colour, min_alpha) - SphereMaxDist, // Distance at which the effect starts and has weight maxValue; e.g. for blend this would be colour = mix(colour, sphere_colour, max_alpha) - SphereMinValue, // Value of the effect at minimum distance - SphereMaxValue, // Value of the effect at maximum distance + SphereDistMin, // Distance at which the effect starts and has weight minValue; e.g. for blend this would be colour = mix(colour, sphere_colour, min_alpha) + SphereDistMax, // Distance at which the effect starts and has weight maxValue; e.g. for blend this would be colour = mix(colour, sphere_colour, max_alpha) + SphereDistExtend, // Specifies the value beyond min dist or max dist (by default the sphere extends beyond max distance at max vlaue) + SphereValueMin, // Value of the effect at minimum distance + SphereValueMax, // Value of the effect at maximum distance Unknown, }; diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 5c11bcba84..954e428022 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -184,38 +184,42 @@ const int c_SphereDefaultMode = 0; const int c_SphereDefaultOrigin = 0; const float c_SphereDefaultColor[3] = { 0.0f, 0.0f, 0.0f }; const float c_SphereDefaultDistance = 0.0f; +const int c_SphereDefaultDistanceExtend = 0; const float c_SphereDefaultAlpha = 1.0f; RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj) : LLVisualEffect(idRlvObj, EVisualEffect::RlvSphere, EVisualEffectType::PostProcessShader) - , m_nMode((ESphereMode)c_SphereDefaultMode) - , m_nOrigin((ESphereOrigin)c_SphereDefaultOrigin) + , m_eMode((ESphereMode)c_SphereDefaultMode) + , m_eOrigin((ESphereOrigin)c_SphereDefaultOrigin) , m_Color(LLColor3(c_SphereDefaultColor)) - , m_nMinDistance(c_SphereDefaultDistance), m_nMaxDistance(c_SphereDefaultDistance) - , m_nMinValue(c_SphereDefaultAlpha), m_nMaxValue(c_SphereDefaultAlpha) + , m_nDistanceMin(c_SphereDefaultDistance), m_nDistanceMax(c_SphereDefaultDistance) + , m_eDistExtend((ESphereDistExtend)0) + , m_nValueMin(c_SphereDefaultAlpha), m_nValueMax(c_SphereDefaultAlpha) { if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) { int nNumber; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMode, nNumber)) - m_nMode = (ESphereMode)nNumber; + m_eMode = (ESphereMode)nNumber; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereOrigin, nNumber)) - m_nOrigin = (ESphereOrigin)nNumber; + m_eOrigin = (ESphereOrigin)nNumber; LLVector3 vecColor; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereColor, vecColor)) m_Color = LLColor3(vecColor.mV); float nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinDist, nFloat)) - m_nMinDistance = nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxDist, nFloat)) - m_nMaxDistance = nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereDistMin, nFloat)) + m_nDistanceMin = nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereDistMax, nFloat)) + m_nDistanceMax = nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereDistExtend, nNumber)) + m_eDistExtend = (ESphereDistExtend)nNumber; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMinValue, nFloat)) - m_nMinValue = nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMaxValue, nFloat)) - m_nMaxValue = nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereValueMin, nFloat)) + m_nValueMin = nFloat; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereValueMax, nFloat)) + m_nValueMax = nFloat; } } @@ -228,7 +232,7 @@ ERlvCmdRet RlvSphereEffect::onModeChanged(const LLUUID& idRlvObj, const boost::o { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nMode = (ESphereMode)((newValue) ? boost::get(newValue.value()) : c_SphereDefaultMode); + pEffect->m_eMode = (ESphereMode)((newValue) ? boost::get(newValue.value()) : c_SphereDefaultMode); } return RLV_RET_SUCCESS; } @@ -238,7 +242,7 @@ ERlvCmdRet RlvSphereEffect::onOriginChanged(const LLUUID& idRlvObj, const boost: { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nOrigin = (ESphereOrigin)((newValue) ? boost::get(newValue.value()) : c_SphereDefaultOrigin); + pEffect->m_eOrigin = (ESphereOrigin)((newValue) ? boost::get(newValue.value()) : c_SphereDefaultOrigin); } return RLV_RET_SUCCESS; } @@ -254,41 +258,51 @@ ERlvCmdRet RlvSphereEffect::onColorChanged(const LLUUID& idRlvObj, const boost:: } // static -ERlvCmdRet RlvSphereEffect::onMinDistChanged(const LLUUID& idRlvObj, const boost::optional newValue) +ERlvCmdRet RlvSphereEffect::onDistMinChanged(const LLUUID& idRlvObj, const boost::optional newValue) { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nMinDistance = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + pEffect->m_nDistanceMin = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; } return RLV_RET_SUCCESS; } // static -ERlvCmdRet RlvSphereEffect::onMaxDistChanged(const LLUUID& idRlvObj, const boost::optional newValue) +ERlvCmdRet RlvSphereEffect::onDistMaxChanged(const LLUUID& idRlvObj, const boost::optional newValue) { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nMaxDistance = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + pEffect->m_nDistanceMax = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; } return RLV_RET_SUCCESS; } // static -ERlvCmdRet RlvSphereEffect::onMinValueChanged(const LLUUID& idRlvObj, const boost::optional newValue) +ERlvCmdRet RlvSphereEffect::onDistExtendChanged(const LLUUID& idRlvObj, const boost::optional newValue) { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nMinValue = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + pEffect->m_eDistExtend = (ESphereDistExtend)((newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistanceExtend); } return RLV_RET_SUCCESS; } // static -ERlvCmdRet RlvSphereEffect::onMaxValueChanged(const LLUUID& idRlvObj, const boost::optional newValue) +ERlvCmdRet RlvSphereEffect::onValueMinChanged(const LLUUID& idRlvObj, const boost::optional newValue) { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nMaxValue = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + pEffect->m_nValueMin = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvSphereEffect::onValueMaxChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nValueMax = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; } return RLV_RET_SUCCESS; } @@ -297,11 +311,11 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p { pShader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); pShader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, pRenderTarget->getWidth(), pRenderTarget->getHeight()); - pShader->uniform1i(LLShaderMgr::RLV_EFFECT_MODE, llclamp((int)m_nMode, 0, (int)ESphereMode::Count)); + pShader->uniform1i(LLShaderMgr::RLV_EFFECT_MODE, llclamp((int)m_eMode, 0, (int)ESphereMode::Count)); // Pass the sphere origin to the shader LLVector4 posSphereOrigin; - switch (m_nOrigin) + switch (m_eOrigin) { case ESphereOrigin::Camera: posSphereOrigin.setVec(LLViewerCamera::instance().getOrigin(), 1.0f); @@ -317,12 +331,16 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM1, 1, posSphereOriginGl.v); // Pack min/max distance and alpha together - const glh::vec4f sphereParams(m_nMinValue, m_nMinDistance, m_nMaxValue, m_nMaxDistance); + const glh::vec4f sphereParams(m_nValueMin, m_nDistanceMin, m_nValueMax, m_nDistanceMax); pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereParams.v); + // Pass dist extend + int eDistExtend = (int)m_eDistExtend; + pShader->uniform2f(LLShaderMgr::RLV_EFFECT_PARAM3, eDistExtend & (int)ESphereDistExtend::Min, eDistExtend & (int)ESphereDistExtend::Max); + // Pass color const glh::vec4f sphereColor(m_Color.mV, 1.0); - pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM3, 1, sphereColor.v); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM4, 1, sphereColor.v); } void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const @@ -372,15 +390,15 @@ void RlvSphereEffect::run() gDeferredRlvProgram.bind(); setShaderUniforms(&gDeferredRlvProgram, &gPipeline.mScreen); - switch (m_nMode) + switch (m_eMode) { case ESphereMode::Blend: renderPass(&gDeferredRlvProgram); break; case ESphereMode::Blur: - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM4, 1.f, 0.f); + gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 1.f, 0.f); renderPass(&gDeferredRlvProgram); - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM4, 0.f, 1.f); + gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 0.f, 1.f); renderPass(&gDeferredRlvProgram); break; } diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h index 09e5a5b8c7..4a4773d448 100644 --- a/indra/newview/rlveffects.h +++ b/indra/newview/rlveffects.h @@ -75,10 +75,11 @@ public: static ERlvCmdRet onModeChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onOriginChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue); - static ERlvCmdRet onMinDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); - static ERlvCmdRet onMaxDistChanged(const LLUUID& idRlvObj, const boost::optional newValue); - static ERlvCmdRet onMinValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); - static ERlvCmdRet onMaxValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onDistMinChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onDistMaxChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onDistExtendChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onValueMinChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onValueMaxChanged(const LLUUID& idRlvObj, const boost::optional newValue); protected: void renderPass(LLGLSLShader* pShader) const; void setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget); @@ -88,14 +89,16 @@ protected: */ protected: enum class ESphereMode { Blend = 0, SoftBlur, Blur, Count }; - ESphereMode m_nMode; + ESphereMode m_eMode; enum class ESphereOrigin { Avatar = 0, Camera, Count }; - ESphereOrigin m_nOrigin; + ESphereOrigin m_eOrigin; LLColor3 m_Color; - float m_nMinDistance; - float m_nMaxDistance; - float m_nMinValue; - float m_nMaxValue; + float m_nDistanceMin; + float m_nDistanceMax; + enum class ESphereDistExtend { Max = 0x01, Min = 0x02, Both = 0x03 }; + ESphereDistExtend m_eDistExtend; + float m_nValueMin; + float m_nValueMax; }; // ==================================================================================== diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 324c774c25..817bce82d3 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -229,10 +229,11 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMode, typeid(int), "mode", &RlvSphereEffect::onModeChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereOrigin, typeid(int), "origin", &RlvSphereEffect::onOriginChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereColor, typeid(LLVector3), "color", &RlvSphereEffect::onColorChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinDist, typeid(float), "mindist", &RlvSphereEffect::onMinDistChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxDist, typeid(float), "maxdist", &RlvSphereEffect::onMaxDistChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMinValue, typeid(float), "minvalue", &RlvSphereEffect::onMinValueChanged); - pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereMaxValue, typeid(float), "maxvalue", &RlvSphereEffect::onMaxValueChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereDistMin, typeid(float), "distmin", &RlvSphereEffect::onDistMinChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereDistMax, typeid(float), "distmax", &RlvSphereEffect::onDistMaxChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereDistExtend, typeid(int), "distextend", &RlvSphereEffect::onDistExtendChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereValueMin, typeid(float), "valuemin", &RlvSphereEffect::onValueMinChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereValueMax, typeid(float), "valuemax", &RlvSphereEffect::onValueMaxChanged); addEntry(pSetSphereBhvr); // From 978aa9a540861946076d7a75f8b7e367f8fd17d7 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 6 Jan 2021 15:33:44 +0100 Subject: [PATCH 012/106] Make @setsphere work with only Windlight enabled by forcing use of FBO --- indra/newview/llappviewer.cpp | 5 +++- indra/newview/llviewercontrol.cpp | 24 +++++++++++++++--- indra/newview/llviewerdisplay.cpp | 9 +++++++ indra/newview/llviewershadermgr.cpp | 34 +++++++++++++------------- indra/newview/llviewershadermgr.h | 2 +- indra/newview/pipeline.cpp | 38 +++++++++++++++++++++++------ indra/newview/pipeline.h | 3 +++ indra/newview/rlvactions.h | 2 -- indra/newview/rlvdefines.h | 1 + indra/newview/rlveffects.cpp | 20 +++++++++------ indra/newview/rlvhandler.cpp | 14 +++++++++++ 11 files changed, 112 insertions(+), 40 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 3d3404e494..51f4ccd36d 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -616,7 +616,10 @@ static void settings_to_globals() static void settings_modify() { - LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred"); +// LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred"); +// [RLVa:KB] - @setsphere + LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred") || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture); +// [/RLVa:KB] LLPipeline::sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); LLPipeline::sRenderDeferred = LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred"); LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor"); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index dc984694be..528cc68eea 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -395,9 +395,21 @@ static bool handleRenderLocalLightsChanged(const LLSD& newvalue) return true; } +// [RLVa:KB] - @setsphere +static bool handleWindLightAtmosShadersChanged(const LLSD& newvalue) +{ + LLRenderTarget::sUseFBO = newvalue.asBoolean() && LLPipeline::sUseDepthTexture; + handleSetShaderChanged(LLSD()); + return true; +} +// [/RLVa:KB] + static bool handleRenderDeferredChanged(const LLSD& newvalue) { - LLRenderTarget::sUseFBO = newvalue.asBoolean(); +// LLRenderTarget::sUseFBO = newvalue.asBoolean(); +// [RLVa:KB] - @setsphere + LLRenderTarget::sUseFBO = newvalue.asBoolean() || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture); +// [/RLVa:KB] if (gPipeline.isInit()) { LLPipeline::refreshCachedSettings(); @@ -419,7 +431,10 @@ static bool handleRenderDeferredChanged(const LLSD& newvalue) // static bool handleRenderBumpChanged(const LLSD& newval) { - LLRenderTarget::sUseFBO = newval.asBoolean(); +// LLRenderTarget::sUseFBO = newval.asBoolean(); +// [RLVa:KB] - @setsphere + LLRenderTarget::sUseFBO = newval.asBoolean() || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture); +// [/RLVa:KB] if (gPipeline.isInit()) { gPipeline.updateRenderBump(); @@ -624,7 +639,10 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderGlowResolutionPow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); - gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); +// gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); +// [RLVa:KB] - @setsphere + gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleWindLightAtmosShadersChanged, _2)); +// [/RLVa:KB] gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2)); gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 817ff4ee53..b0eef1f446 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1036,6 +1036,15 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { gPipeline.renderDeferredLighting(); } +// [RLVa:KB] - @setsphere + else if (LLRenderTarget::sUseFBO && LLPipeline::sUseDepthTexture) + { + if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) + { + LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere); + } + } +// [/RLVa:KB] LLPipeline::sUnderWaterRender = FALSE; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 7497e122aa..d31e4629d6 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -244,7 +244,7 @@ LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; LLGLSLShader gDeferredSkinnedFullbrightProgram; LLGLSLShader gNormalMapGenProgram; // [RLVa:KB] - @setsphere -LLGLSLShader gDeferredRlvProgram; +LLGLSLShader gRlvSphereProgram; // [/RLVa:KB] // Deferred materials shaders @@ -352,7 +352,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredWLSkyProgram); mShaderList.push_back(&gDeferredWLCloudProgram); // [RLVa:KB] - @setsphere - mShaderList.push_back(&gDeferredRlvProgram); + mShaderList.push_back(&gRlvSphereProgram); // [/RLVa:KB] } @@ -1181,9 +1181,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightProgram.unload(); -// [RLVa:KB] - @setsphere - gDeferredRlvProgram.unload(); -// [/RLVa:KB] gDeferredHighlightProgram.unload(); gDeferredHighlightNormalProgram.unload(); @@ -2096,18 +2093,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gNormalMapGenProgram.createShader(NULL, NULL); } -// [RLVa:KB] - @setsphere - if (success) - { - gDeferredRlvProgram.mName = "Deferred (RLVa) Post Processing Shader"; - gDeferredRlvProgram.mShaderFiles.clear(); - gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB)); - gDeferredRlvProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredRlvProgram.createShader(NULL, NULL); - } -// [/RLV:KB] - return success; } @@ -3417,6 +3402,9 @@ BOOL LLViewerShaderMgr::loadShadersWindLight() { gWLSkyProgram.unload(); gWLCloudProgram.unload(); +// [RLVa:KB] - @setsphere + gRlvSphereProgram.unload(); +// [/RLVa:KB] return TRUE; } @@ -3444,6 +3432,18 @@ BOOL LLViewerShaderMgr::loadShadersWindLight() success = gWLCloudProgram.createShader(NULL, NULL); } +// [RLVa:KB] - @setsphere + if (success) + { + gRlvSphereProgram.mName = "RLVa Sphere Post Processing Shader"; + gRlvSphereProgram.mShaderFiles.clear(); + gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvV.glsl", GL_VERTEX_SHADER_ARB)); + gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB)); + gRlvSphereProgram.mShaderLevel = mVertexShaderLevel[SHADER_WINDLIGHT]; + success = gRlvSphereProgram.createShader(NULL, NULL); + } +// [/RLV:KB] + return success; } diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index dfcfbb89c7..486617a405 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -345,7 +345,7 @@ extern LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; extern LLGLSLShader gDeferredSkinnedFullbrightProgram; extern LLGLSLShader gNormalMapGenProgram; // [RLVa:KB] - @setsphere -extern LLGLSLShader gDeferredRlvProgram; +extern LLGLSLShader gRlvSphereProgram; // [/RLVa:KB] // Deferred materials shaders diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 886d58e3b0..ffe5786547 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -260,9 +260,6 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State"); LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline"); LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy"); LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading"); -// [RLVa:KB] - @setsphere -LLTrace::BlockTimerStatHandle FTM_POST_DEFERRED_RLV("Post-process (Deferred RLVa)"); -// [/RLVa:KB] static LLTrace::BlockTimerStatHandle FTM_STATESORT_DRAWABLE("Sort Drawables"); @@ -412,6 +409,9 @@ bool LLPipeline::sRenderingHUDs; // [SL:KB] - Patch: Render-TextureToggle (Catznip-4.0) bool LLPipeline::sRenderTextures = true; // [/SL:KB] +// [RLVa:KB] - @setsphere +bool LLPipeline::sUseDepthTexture = false; +// [/RLVa:KB] // EventHost API LLPipeline listener. static LLPipelineListener sPipelineListener; @@ -1069,9 +1069,22 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) mFXAABuffer.release(); mScreen.release(); mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first - mDeferredDepth.release(); - mOcclusionDepth.release(); - +// [RLVa:KB] - @setsphere + if (!LLRenderTarget::sUseFBO || !LLPipeline::sUseDepthTexture) + { + mDeferredDepth.release(); + mOcclusionDepth.release(); + } + else + { + const U32 occlusion_divisor = 3; + if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; + if (!mOcclusionDepth.allocate(resX / occlusion_divisor, resY / occlusion_divisor, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; + } +// [/RLVa:KB] +// mDeferredDepth.release(); +// mOcclusionDepth.release(); + if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false; } @@ -4509,7 +4522,17 @@ void LLPipeline::renderGeom(LLCamera& camera, bool forceVBOUpdate) gGLLastMatrix = NULL; gGL.loadMatrix(gGLModelView); LLGLSLShader::bindNoShader(); - doOcclusion(camera); +// [RLVa:KB] - @setsphere + if (LLPipeline::RenderDeferred || !LLRenderTarget::sUseFBO || !LLPipeline::sUseDepthTexture) + { + doOcclusion(camera); + } + else + { + doOcclusion(camera, mScreen, mOcclusionDepth, &mDeferredDepth); + } +// [/RLVa:KB] +// doOcclusion(camera); } pool_set_t::iterator iter2 = iter1; @@ -9087,7 +9110,6 @@ void LLPipeline::renderDeferredLighting() // [RLVa:KB] - @setsphere if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) { - LL_RECORD_BLOCK_TIME(FTM_POST_DEFERRED_RLV); LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere); } // [/RLVa:KB] diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index fc79ae5016..1e59c3c0d1 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -592,6 +592,9 @@ public: // [SL:KB] - Patch: Render-TextureToggle (Catznip-4.0) static bool sRenderTextures; // [/SL:KB] +// [RLVa:KB] - @setsphere + static bool sUseDepthTexture; +// [/RLVa:KB] static LLTrace::EventStatHandle sStatBatchSize; diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h index 122c2d4863..a6a5219933 100644 --- a/indra/newview/rlvactions.h +++ b/indra/newview/rlvactions.h @@ -24,10 +24,8 @@ // Forward declarations // -class LLGLSLShader; class LLInventoryCategory; class LLInventoryItem; -class LLRenderTarget; // ============================================================================ // RlvActions class declaration - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 526572975b..da9716b083 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -271,6 +271,7 @@ enum ERlvBehaviourModifier RLV_MODIFIER_SETCAM_TEXTURE, // Specifies the UUID of the texture used to texture the world view RLV_MODIFIER_SITTPDIST, RLV_MODIFIER_TPLOCALDIST, + RLV_MODIFIER_COUNT, RLV_MODIFIER_UNKNOWN }; diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 954e428022..8b303847e3 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -17,6 +17,7 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" +#include "llfasttimer.h" #include "llglslshader.h" #include "llrender2dutils.h" #include "llviewershadermgr.h" @@ -383,27 +384,30 @@ void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const gPipeline.mScreen.flush(); } +LLTrace::BlockTimerStatHandle FTM_RLV_EFFECT_SPHERE("Post-process (RLVa sphere)"); + void RlvSphereEffect::run() { + LL_RECORD_BLOCK_TIME(FTM_RLV_EFFECT_SPHERE); LLGLDepthTest depth(GL_FALSE, GL_FALSE); - gDeferredRlvProgram.bind(); - setShaderUniforms(&gDeferredRlvProgram, &gPipeline.mScreen); + gRlvSphereProgram.bind(); + setShaderUniforms(&gRlvSphereProgram, &gPipeline.mScreen); switch (m_eMode) { case ESphereMode::Blend: - renderPass(&gDeferredRlvProgram); + renderPass(&gRlvSphereProgram); break; case ESphereMode::Blur: - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 1.f, 0.f); - renderPass(&gDeferredRlvProgram); - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 0.f, 1.f); - renderPass(&gDeferredRlvProgram); + gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 1.f, 0.f); + renderPass(&gRlvSphereProgram); + gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 0.f, 1.f); + renderPass(&gRlvSphereProgram); break; } - gDeferredRlvProgram.unbind(); + gRlvSphereProgram.unbind(); } // ==================================================================================== diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index af44f0dd15..e0acc3c279 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -51,8 +51,10 @@ #include "lltabcontainer.h" // @showinv - Tab container control for inventory tabs #include "lltoolmgr.h" // @edit #include "llviewercamera.h" // @setcam and related +#include "llviewershadermgr.h" // @setsphere #include "llworldmapmessage.h" // @tpto #include "llviewertexturelist.h" // @setcam_texture +#include "pipeline.h" // @setsphere // RLVa includes #include "rlvactions.h" @@ -2066,6 +2068,18 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& ERlvCmdRet eRet = RlvBehaviourGenericHandler::onCommand(rlvCmd, fRefCount); if ( (RLV_RET_SUCCESS == eRet) && (!rlvCmd.isModifier()) ) { + // If we're not using deferred but are using Windlight shaders we need to force use of FBO and depthmap texture + if ( (!LLPipeline::RenderDeferred) && (LLPipeline::WindLightUseAtmosShaders) && (!LLPipeline::sUseDepthTexture) ) + { + LLRenderTarget::sUseFBO = true; + LLPipeline::sUseDepthTexture = true; + + gPipeline.releaseGLBuffers(); + gPipeline.createGLBuffers(); + gPipeline.resetVertexBuffers(); + LLViewerShaderMgr::instance()->setShaders(); + } + if (gRlvHandler.hasBehaviour(rlvCmd.getObjectID(), rlvCmd.getBehaviourType())) LLVfxManager::instance().addEffect(new RlvSphereEffect(rlvCmd.getObjectID())); else From 72d6aff610c99a6125e633d067dc71ef37d56f46 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Jan 2021 20:55:37 +0100 Subject: [PATCH 013/106] Add @viewtransparent and @viewwireframe --- indra/newview/llviewermenu.cpp | 12 ++++++------ indra/newview/rlvactions.cpp | 22 ++++++++++++++++++++++ indra/newview/rlvactions.h | 14 ++++++++++++++ indra/newview/rlvdefines.h | 2 ++ indra/newview/rlvhandler.cpp | 20 ++++++++++++++++++++ indra/newview/rlvhelper.cpp | 2 ++ 6 files changed, 66 insertions(+), 6 deletions(-) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f7b789c5d6..556a13c361 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1214,11 +1214,11 @@ class LLAdvancedToggleWireframe : public view_listener_t { bool handleEvent(const LLSD& userdata) { -// [RLVa:KB] - Checked: RLVa-2.0.0 - bool fRlvBlockWireframe = gRlvAttachmentLocks.hasLockedHUD(); - if ( (!gUseWireframe) && (fRlvBlockWireframe) ) +// [RLVa:KB] - @detach and @viewwireframe + const bool fRlvCanViewWireframe = RlvActions::canViewWireframe(); + if ( (!gUseWireframe) && (!fRlvCanViewWireframe) ) RlvUtil::notifyBlocked(RlvStringKeys::Blocked::Wireframe); - set_use_wireframe( (!gUseWireframe) && (!fRlvBlockWireframe) ); + set_use_wireframe( (!gUseWireframe) && (fRlvCanViewWireframe) ); return true; } }; @@ -8672,8 +8672,8 @@ class LLViewHighlightTransparent : public view_listener_t bool handleEvent(const LLSD& userdata) { // LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha; -// [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c - LLDrawPoolAlpha::sShowDebugAlpha = (!LLDrawPoolAlpha::sShowDebugAlpha) && (!gRlvHandler.hasBehaviour(RLV_BHVR_EDIT)); +// [RLVa:KB] - @edit and @viewtransparent + LLDrawPoolAlpha::sShowDebugAlpha = (!LLDrawPoolAlpha::sShowDebugAlpha) && (RlvActions::canHighlightTransparent()); // [/RLVa:KB] return true; } diff --git a/indra/newview/rlvactions.cpp b/indra/newview/rlvactions.cpp index b5126ee47b..44def7256c 100644 --- a/indra/newview/rlvactions.cpp +++ b/indra/newview/rlvactions.cpp @@ -584,6 +584,28 @@ bool RlvActions::canShowLocation() return !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC); } +// ============================================================================ +// World (General) +// + +bool RlvActions::canHighlightTransparent() +{ + // User cannot highlight transparent faces if: + // - prevented from editing (exceptions are not taken into account) + // - specifically prevented from highlight transparent faces + return !gRlvHandler.hasBehaviour(RLV_BHVR_EDIT) && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC); +} + +bool RlvActions::canViewWireframe() +{ + // User can use wireframe rendering if: + // - no HUD attachment is (remove) locked + // - not specifically prevented from using wireframe mode + return + !gRlvAttachmentLocks.hasLockedHUD() && // Trivial function so no overhead when RLV is not enabled + !gRlvHandler.hasBehaviour(RLV_BHVR_VIEWWIREFRAME); +} + // ============================================================================ // Helper functions // diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h index 7022e33eeb..6571023ca7 100644 --- a/indra/newview/rlvactions.h +++ b/indra/newview/rlvactions.h @@ -300,6 +300,20 @@ public: */ static bool canTouch(const LLViewerObject* pObj, const LLVector3& posOffset = LLVector3::zero); + // =============== + // World (General) + // =============== +public: + /* + * Returns true if the user can highlight transparent faces + */ + static bool canHighlightTransparent(); + + /* + * Returns true if the user can switch to wireframe rendering + */ + static bool canViewWireframe(); + // ================ // Helper functions // ================ diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index ca3180d5c1..777f88d15e 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -157,6 +157,8 @@ enum ERlvBehaviour { RLV_BHVR_BUY, // "buy" RLV_BHVR_EDIT, // "edit" RLV_BHVR_EDITOBJ, // "editobj" + RLV_BHVR_VIEWTRANSPARENT, + RLV_BHVR_VIEWWIREFRAME, RLV_BHVR_PAY, // "pay" RLV_BHVR_REZ, // "rez" RLV_BHVR_FARTOUCH, // "fartouch" diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index 369eb3334c..f916ca819e 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -2612,6 +2612,26 @@ void RlvBehaviourShowSelfToggleHandler::onCommandToggle(ERlvBehaviour eBvhr, boo gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode()); } +// Handles: @viewtransparent toggles +template<> template<> +void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) +{ + if (fHasBhvr) + { + LLDrawPoolAlpha::sShowDebugAlpha = false; + } +} + +// Handles: @viewwireframe toggles +template<> template<> +void RlvBehaviourToggleHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr) +{ + if (fHasBhvr) + { + set_use_wireframe(false); + } +} + // ============================================================================ // Command handlers (RLV_TYPE_FORCE) // diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index e28f13661b..2f29ef1c74 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -100,6 +100,8 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() addEntry(new RlvBehaviourInfo("detachallthis_except", RLV_BHVR_DETACHTHISEXCEPT, RLV_TYPE_ADDREM, RlvBehaviourInfo::FORCEWEAR_SUBTREE)); addEntry(new RlvBehaviourGenericToggleProcessor("edit")); addEntry(new RlvBehaviourGenericProcessor("editobj", RLV_BHVR_EDITOBJ)); + addEntry(new RlvBehaviourGenericToggleProcessor("viewtransparent", RlvBehaviourInfo::BHVR_EXPERIMENTAL)); + addEntry(new RlvBehaviourGenericToggleProcessor("viewwireframe", RlvBehaviourInfo::BHVR_EXPERIMENTAL)); addEntry(new RlvBehaviourGenericProcessor("emote", RLV_BHVR_EMOTE)); addEntry(new RlvBehaviourGenericProcessor("fartouch", RLV_BHVR_FARTOUCH)); addModifier(RLV_BHVR_FARTOUCH, RLV_MODIFIER_FARTOUCHDIST, new RlvBehaviourModifier("Fartouch Distance", RLV_MODIFIER_FARTOUCH_DEFAULT, true, new RlvBehaviourModifierCompMin)); From f623f1f9b14da6eca60bbed22dbb9a4bdc7ada4a Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Jan 2021 22:26:18 +0100 Subject: [PATCH 014/106] Add additional sphere effects for the initial RFC release and make params tweenable for the fun of it --- indra/llmath/v4math.h | 13 +++ .../shaders/class1/deferred/rlvF.glsl | 87 ++++++++++++++++--- indra/newview/rlvcommon.h | 2 +- indra/newview/rlvdefines.h | 4 +- indra/newview/rlveffects.cpp | 80 ++++++++++++++--- indra/newview/rlveffects.h | 15 ++-- indra/newview/rlvhelper.cpp | 11 +++ 7 files changed, 177 insertions(+), 35 deletions(-) diff --git a/indra/llmath/v4math.h b/indra/llmath/v4math.h index 623c8b2003..d1b5a9646b 100644 --- a/indra/llmath/v4math.h +++ b/indra/llmath/v4math.h @@ -434,6 +434,19 @@ inline LLVector4 operator-(const LLVector4 &a) return LLVector4( -a.mV[VX], -a.mV[VY], -a.mV[VZ] ); } +// [RLVa:KB] - RlvBehaviourModifierCompMin/Max +inline bool operator<(const LLVector4& lhs, const LLVector4& rhs) +{ + return (lhs.mV[0] < rhs.mV[0] + || (lhs.mV[0] == rhs.mV[0] + && (lhs.mV[1] < rhs.mV[1] + || ((lhs.mV[1] == rhs.mV[1]) + && lhs.mV[2] < rhs.mV[2] + || ((lhs.mV[2] == rhs.mV[2]) + && lhs.mV[3] < rhs.mV[3]))))); +} +// [/RLVa:KB] + inline F32 dist_vec(const LLVector4 &a, const LLVector4 &b) { LLVector4 vec = a - b; diff --git a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl index 6ad884446b..8661ffe923 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/rlvF.glsl @@ -33,7 +33,7 @@ uniform int rlvEffectMode; // ESphereMode uniform vec4 rlvEffectParam1; // Sphere origin (in local coordinates) uniform vec4 rlvEffectParam2; // Min/max dist + min/max value uniform bvec2 rlvEffectParam3; // Min/max dist extend -uniform vec4 rlvEffectParam4; // Sphere color (not used for blur) +uniform vec4 rlvEffectParam4; // Sphere params (=color when using blend) uniform vec2 rlvEffectParam5; // Blur direction (not used for blend) #define SPHERE_ORIGIN rlvEffectParam1.xyz @@ -42,7 +42,7 @@ uniform vec2 rlvEffectParam5; // Blur direction (not used for blend) #define SPHERE_DISTEXTEND rlvEffectParam3 #define SPHERE_VALUEMIN rlvEffectParam2.x #define SPHERE_VALUEMAX rlvEffectParam2.z -#define SPHERE_COLOUR rlvEffectParam4.rgb +#define SPHERE_PARAMS rlvEffectParam4 #define BLUR_DIRECTION rlvEffectParam5.xy vec4 getPosition_d(vec2 pos_screen, float depth) @@ -57,33 +57,77 @@ vec4 getPosition_d(vec2 pos_screen, float depth) return pos; } -vec3 blur13(sampler2DRect image, vec2 uv, vec2 direction) +vec3 blur13(sampler2DRect source, vec2 tc, vec2 direction) { vec4 color = vec4(0.0); vec2 off1 = vec2(1.411764705882353) * direction; vec2 off2 = vec2(3.2941176470588234) * direction; vec2 off3 = vec2(5.176470588235294) * direction; - color += texture2D(image, uv) * 0.1964825501511404; + color += texture2DRect(source, tc) * 0.1964825501511404; - color += texture2D(image, uv + off1) * 0.2969069646728344; - color += texture2D(image, uv - off1) * 0.2969069646728344; + color += texture2DRect(source, tc + off1) * 0.2969069646728344; + color += texture2DRect(source, tc - off1) * 0.2969069646728344; - color += texture2D(image, uv + off2) * 0.09447039785044732; - color += texture2D(image, uv - off2) * 0.09447039785044732; + color += texture2DRect(source, tc + off2) * 0.09447039785044732; + color += texture2DRect(source, tc - off2) * 0.09447039785044732; - color += texture2D(image, uv + off3) * 0.010381362401148057; - color += texture2D(image, uv - off3) * 0.010381362401148057; + color += texture2DRect(source, tc + off3) * 0.010381362401148057; + color += texture2DRect(source, tc - off3) * 0.010381362401148057; return color.xyz; } +const float pi = 3.14159265; + +// http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html +vec3 blurVariable(sampler2DRect source, vec2 tc, float kernelSize, vec2 direction, float strength) { + float numBlurPixelsPerSide = float(kernelSize / 2); + + // Incremental Gaussian Coefficent Calculation (See GPU Gems 3 pp. 877 - 889) + vec3 incrementalGaussian; + incrementalGaussian.x = 1.0 / (sqrt(2.0 * pi) * strength); + incrementalGaussian.y = exp(-0.5 / (strength * strength)); + incrementalGaussian.z = incrementalGaussian.y * incrementalGaussian.y; + + vec4 avgValue = vec4(0.0, 0.0, 0.0, 0.0); + float coefficientSum = 0.0; + + // Take the central sample first... + avgValue += texture2DRect(source, tc) * incrementalGaussian.x; + coefficientSum += incrementalGaussian.x; + incrementalGaussian.xy *= incrementalGaussian.yz; + + // Go through the remaining 8 vertical samples (4 on each side of the center) + for (float i = 1.0; i <= numBlurPixelsPerSide; i++) { + avgValue += texture2DRect(source, tc - i * direction) * incrementalGaussian.x; + avgValue += texture2DRect(source, tc + i * direction) * incrementalGaussian.x; + coefficientSum += 2.0 * incrementalGaussian.x; + incrementalGaussian.xy *= incrementalGaussian.yz; + } + + return (avgValue / coefficientSum).rgb; +} + +vec3 chromaticAberration(sampler2DRect source, vec2 tc, vec2 redDrift, vec2 blueDrift, float strength) +{ + vec3 sourceColor = texture2DRect(source, tc).rgb; + + // Sample the color components + vec3 driftColor; + driftColor.r = texture2DRect(source, tc + redDrift).r; + driftColor.g = sourceColor.g; + driftColor.b = texture2DRect(source, tc + blueDrift).b; + + // Adjust the strength of the effect + return mix(sourceColor, driftColor, strength); +} + void main() { vec2 fragTC = vary_fragcoord.st; float fragDepth = texture2DRect(depthMap, fragTC).x; vec3 fragPosLocal = getPosition_d(fragTC, fragDepth).xyz; - vec3 fragColor = texture2DRect(diffuseRect, fragTC).rgb; float distance = length(fragPosLocal.xyz - SPHERE_ORIGIN); // Linear non-branching interpolation of the strength of the sphere effect (replaces if/elseif/else for x < min, min <= x <= max and x > max) @@ -91,14 +135,31 @@ void main() effectStrength = mix(effectStrength, mix(0, SPHERE_VALUEMIN, SPHERE_DISTEXTEND.x), distance < SPHERE_DISTMIN); effectStrength = mix(effectStrength, mix(0, SPHERE_VALUEMAX, SPHERE_DISTEXTEND.y), distance > SPHERE_DISTMAX); + vec3 fragColor; switch (rlvEffectMode) { case 0: // Blend - fragColor = mix(fragColor, SPHERE_COLOUR, effectStrength); + fragColor = texture2DRect(diffuseRect, fragTC).rgb; + fragColor = mix(fragColor, SPHERE_PARAMS.rgb, effectStrength); break; - case 1: // Blur + case 1: // Blur (fixed) fragColor = blur13(diffuseRect, fragTC, effectStrength * BLUR_DIRECTION); break; + case 2: // Blur (variable) + fragColor = texture2DRect(diffuseRect, fragTC).rgb; + fragColor = mix(fragColor, blurVariable(diffuseRect, fragTC, SPHERE_PARAMS.x, BLUR_DIRECTION, effectStrength), effectStrength > 0); + break; + case 3: // ChromaticAberration + fragColor = chromaticAberration(diffuseRect, fragTC, SPHERE_PARAMS.xy, SPHERE_PARAMS.zw, effectStrength); + break; + case 4: // Pixelate + { + effectStrength = sign(effectStrength); + float pixelWidth = max(1, round(SPHERE_PARAMS.x * effectStrength)); float pixelHeight = max(1, round(SPHERE_PARAMS.y * effectStrength)); + fragTC = vec2(pixelWidth * floor(fragTC.x / pixelWidth), pixelHeight * floor(fragTC.y / pixelHeight)); + fragColor = texture2DRect(diffuseRect, fragTC).rgb; + } + break; } frag_color.rgb = fragColor; diff --git a/indra/newview/rlvcommon.h b/indra/newview/rlvcommon.h index 82fca44f91..9777ff9d0b 100644 --- a/indra/newview/rlvcommon.h +++ b/indra/newview/rlvcommon.h @@ -56,7 +56,7 @@ class RlvObject; struct RlvException; typedef boost::variant RlvExceptionOption; -typedef boost::variant RlvBehaviourModifierValue; +typedef boost::variant RlvBehaviourModifierValue; class RlvGCTimer; diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index da9716b083..690bda54fc 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -286,12 +286,14 @@ enum class ERlvLocalBhvrModifier // @setsphere SphereMode, // The type of effect that will apply to any pixel that intersects with the sphere (e.g. blend, blur, ...) SphereOrigin, // The origin of the sphere can either be the avatar or the camera position - SphereColor, // [Blend only] Colour to mix with the actual pixel colour + SphereColor, // [Blend only] Colour to mix with the actual pixel colour (stored as params) + SphereParams, // Effect parameters (dependent on mode - see RlvSphereEffect) SphereDistMin, // Distance at which the effect starts and has weight minValue; e.g. for blend this would be colour = mix(colour, sphere_colour, min_alpha) SphereDistMax, // Distance at which the effect starts and has weight maxValue; e.g. for blend this would be colour = mix(colour, sphere_colour, max_alpha) SphereDistExtend, // Specifies the value beyond min dist or max dist (by default the sphere extends beyond max distance at max vlaue) SphereValueMin, // Value of the effect at minimum distance SphereValueMax, // Value of the effect at maximum distance + SphereTween, // Amount of seconds it takes to lerp from value A to value B Unknown, }; diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 8b303847e3..454a9db38c 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -183,19 +183,20 @@ void RlvOverlayEffect::run() const int c_SphereDefaultMode = 0; const int c_SphereDefaultOrigin = 0; -const float c_SphereDefaultColor[3] = { 0.0f, 0.0f, 0.0f }; +const float c_SphereDefaultColor[4] = { 0.0, 0.f, 0.f, 0.f }; const float c_SphereDefaultDistance = 0.0f; -const int c_SphereDefaultDistanceExtend = 0; +const int c_SphereDefaultDistanceExtend = 1; const float c_SphereDefaultAlpha = 1.0f; RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj) : LLVisualEffect(idRlvObj, EVisualEffect::RlvSphere, EVisualEffectType::PostProcessShader) , m_eMode((ESphereMode)c_SphereDefaultMode) , m_eOrigin((ESphereOrigin)c_SphereDefaultOrigin) - , m_Color(LLColor3(c_SphereDefaultColor)) + , m_Params(LLVector4(c_SphereDefaultColor)) , m_nDistanceMin(c_SphereDefaultDistance), m_nDistanceMax(c_SphereDefaultDistance) - , m_eDistExtend((ESphereDistExtend)0) + , m_eDistExtend((ESphereDistExtend)c_SphereDefaultDistanceExtend) , m_nValueMin(c_SphereDefaultAlpha), m_nValueMax(c_SphereDefaultAlpha) + , m_nTweenDuration(0.f) { if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) { @@ -207,7 +208,10 @@ RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj) LLVector3 vecColor; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereColor, vecColor)) - m_Color = LLColor3(vecColor.mV); + m_Params = LLVector4(vecColor.mV[VX], vecColor.mV[VY], vecColor.mV[VZ], 1.0f); + LLVector4 vecParams; + if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereParams, vecParams)) + m_Params = vecParams; float nFloat; if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereDistMin, nFloat)) @@ -253,7 +257,11 @@ ERlvCmdRet RlvSphereEffect::onColorChanged(const LLUUID& idRlvObj, const boost:: { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_Color = LLColor3((newValue) ? boost::get(newValue.value()).mV : c_SphereDefaultColor); + LLVector4 vecColor = (newValue) ? LLVector4(boost::get(newValue.value()), 1.0f) : LLVector4(c_SphereDefaultColor); + if (!pEffect->m_nTweenDuration) + pEffect->m_Params = vecColor; + else + pEffect->m_Params.start(vecColor, pEffect->m_nTweenDuration); } return RLV_RET_SUCCESS; } @@ -263,7 +271,11 @@ ERlvCmdRet RlvSphereEffect::onDistMinChanged(const LLUUID& idRlvObj, const boost { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nDistanceMin = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + float nDistanceMin = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + if (!pEffect->m_nTweenDuration) + pEffect->m_nDistanceMin = nDistanceMin; + else + pEffect->m_nDistanceMin.start(nDistanceMin, pEffect->m_nTweenDuration); } return RLV_RET_SUCCESS; } @@ -273,7 +285,11 @@ ERlvCmdRet RlvSphereEffect::onDistMaxChanged(const LLUUID& idRlvObj, const boost { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nDistanceMax = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + float nDistanceMax = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultDistance; + if (!pEffect->m_nTweenDuration) + pEffect->m_nDistanceMax = nDistanceMax; + else + pEffect->m_nDistanceMax.start(nDistanceMax, pEffect->m_nTweenDuration); } return RLV_RET_SUCCESS; } @@ -288,12 +304,40 @@ ERlvCmdRet RlvSphereEffect::onDistExtendChanged(const LLUUID& idRlvObj, const bo return RLV_RET_SUCCESS; } +// static +ERlvCmdRet RlvSphereEffect::onParamsChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + LLVector4 params = LLVector4((newValue) ? boost::get(newValue.value()).mV : c_SphereDefaultColor); + if (!pEffect->m_nTweenDuration) + pEffect->m_Params = params; + else + pEffect->m_Params.start(params, pEffect->m_nTweenDuration); + } + return RLV_RET_SUCCESS; +} + +// static +ERlvCmdRet RlvSphereEffect::onTweenDurationChanged(const LLUUID& idRlvObj, const boost::optional newValue) +{ + if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) + { + pEffect->m_nTweenDuration = (newValue) ? boost::get(newValue.value()) : 0; + } + return RLV_RET_SUCCESS; +} + // static ERlvCmdRet RlvSphereEffect::onValueMinChanged(const LLUUID& idRlvObj, const boost::optional newValue) { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nValueMin = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + float nValueMin = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha;; + if (!pEffect->m_nTweenDuration) + pEffect->m_nValueMin = nValueMin; + else + pEffect->m_nValueMin.start(nValueMin, pEffect->m_nTweenDuration); } return RLV_RET_SUCCESS; } @@ -303,7 +347,11 @@ ERlvCmdRet RlvSphereEffect::onValueMaxChanged(const LLUUID& idRlvObj, const boos { if (RlvSphereEffect* pEffect = dynamic_cast(LLVfxManager::instance().getEffect(idRlvObj))) { - pEffect->m_nValueMax = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + float nValueMax = (newValue) ? boost::get(newValue.value()) : c_SphereDefaultAlpha; + if (!pEffect->m_nTweenDuration) + pEffect->m_nValueMax = nValueMax; + else + pEffect->m_nValueMax.start(nValueMax, pEffect->m_nTweenDuration); } return RLV_RET_SUCCESS; } @@ -332,16 +380,17 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM1, 1, posSphereOriginGl.v); // Pack min/max distance and alpha together - const glh::vec4f sphereParams(m_nValueMin, m_nDistanceMin, m_nValueMax, m_nDistanceMax); + float nDistMin = m_nDistanceMin.get(), nDistMax = m_nDistanceMax.get(); + const glh::vec4f sphereParams(m_nValueMin.get(), nDistMin, m_nValueMax.get(), (nDistMax >= nDistMin) ? nDistMax : nDistMin); pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM2, 1, sphereParams.v); // Pass dist extend int eDistExtend = (int)m_eDistExtend; pShader->uniform2f(LLShaderMgr::RLV_EFFECT_PARAM3, eDistExtend & (int)ESphereDistExtend::Min, eDistExtend & (int)ESphereDistExtend::Max); - // Pass color - const glh::vec4f sphereColor(m_Color.mV, 1.0); - pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM4, 1, sphereColor.v); + // Pass effect params + const glh::vec4f effectParams(m_Params.get().mV); + pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM4, 1, effectParams.v); } void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const @@ -397,9 +446,12 @@ void RlvSphereEffect::run() switch (m_eMode) { case ESphereMode::Blend: + case ESphereMode::ChromaticAberration: + case ESphereMode::Pixelate: renderPass(&gRlvSphereProgram); break; case ESphereMode::Blur: + case ESphereMode::BlurVariable: gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 1.f, 0.f); renderPass(&gRlvSphereProgram); gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 0.f, 1.f); diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h index 4a4773d448..283346c9f9 100644 --- a/indra/newview/rlveffects.h +++ b/indra/newview/rlveffects.h @@ -78,6 +78,8 @@ public: static ERlvCmdRet onDistMinChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onDistMaxChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onDistExtendChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onParamsChanged(const LLUUID& idRlvObj, const boost::optional newValue); + static ERlvCmdRet onTweenDurationChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onValueMinChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onValueMaxChanged(const LLUUID& idRlvObj, const boost::optional newValue); protected: @@ -88,17 +90,18 @@ protected: * Member variables */ protected: - enum class ESphereMode { Blend = 0, SoftBlur, Blur, Count }; + enum class ESphereMode { Blend = 0, Blur, BlurVariable, ChromaticAberration, Pixelate, Count }; ESphereMode m_eMode; enum class ESphereOrigin { Avatar = 0, Camera, Count }; ESphereOrigin m_eOrigin; - LLColor3 m_Color; - float m_nDistanceMin; - float m_nDistanceMax; + LLTweenableValueLerp m_Params; + LLTweenableValueLerp m_nDistanceMin; + LLTweenableValueLerp m_nDistanceMax; enum class ESphereDistExtend { Max = 0x01, Min = 0x02, Both = 0x03 }; ESphereDistExtend m_eDistExtend; - float m_nValueMin; - float m_nValueMax; + LLTweenableValueLerp m_nValueMin; + LLTweenableValueLerp m_nValueMax; + float m_nTweenDuration; }; // ==================================================================================== diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index 817bce82d3..d56f0898f4 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -232,6 +232,8 @@ RlvBehaviourDictionary::RlvBehaviourDictionary() pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereDistMin, typeid(float), "distmin", &RlvSphereEffect::onDistMinChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereDistMax, typeid(float), "distmax", &RlvSphereEffect::onDistMaxChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereDistExtend, typeid(int), "distextend", &RlvSphereEffect::onDistExtendChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereParams, typeid(LLVector4), "param", &RlvSphereEffect::onParamsChanged); + pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereTween, typeid(float), "tween", &RlvSphereEffect::onTweenDurationChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereValueMin, typeid(float), "valuemin", &RlvSphereEffect::onValueMinChanged); pSetSphereBhvr->addModifier(ERlvLocalBhvrModifier::SphereValueMax, typeid(float), "valuemax", &RlvSphereEffect::onValueMaxChanged); addEntry(pSetSphereBhvr); @@ -655,6 +657,15 @@ bool RlvBehaviourModifier::convertOptionValue(const std::string& optionValue, co return true; } } + else if (modType == typeid(LLVector4)) + { + LLVector4 vecOption; + if (4 == sscanf(optionValue.c_str(), "%f/%f/%f/%f", vecOption.mV + 0, vecOption.mV + 1, vecOption.mV + 2, vecOption.mV + 3)) + { + modValue = vecOption; + return true; + } + } else if (modType == typeid(LLUUID)) { LLUUID idOption; From db3ec78900eb834dc19a0521605bed6d204f477b Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Jan 2021 23:24:48 +0100 Subject: [PATCH 015/106] Fixed minor UI disabling issue related to Touch/Edit of attachments + @showloc and @edit (=open) workarounds --- indra/newview/llfloateropenobject.cpp | 14 +++++++++++++- indra/newview/llinventoryfunctions.cpp | 5 ++++- indra/newview/llviewermenu.cpp | 5 ++++- indra/newview/llviewerwindow.cpp | 10 ++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index 2a1749bd42..c2d0261edb 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -48,7 +48,9 @@ #include "llviewerobject.h" #include "lluictrlfactory.h" #include "llviewerwindow.h" - +// [RLVa:KB] - @edit +#include "rlvactions.h" +// [/RLVa:KB] LLFloaterOpenObject::LLFloaterOpenObject(const LLSD& key) : LLFloater(key), @@ -102,6 +104,16 @@ void LLFloaterOpenObject::refresh() BOOL enabled = FALSE; LLSelectNode* node = mObjectSelection->getFirstRootNode(); +// [RLVa:KB] - @edit and @editobj + if ( (RlvActions::isRlvEnabled()) && (node) && (!RlvActions::canEdit(node->getObject())) ) + { + // If the floater was already open before getting edit restricted then a transient selection will allow manipulation + // of the object's inventory without it getting selected by LLSelectMgr::deselectIfTooFar(). + // Killing the selection would result in the user not realizing why their right-click breaks so close the floater instead. + closeFloater(); + return; + } +// [/RLVa:KB] if (node) { name = node->mName; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 5e99ac5c29..b5a0a647e1 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -685,7 +685,10 @@ bool get_is_item_editable(const LLUUID& inv_item_id) case LLAssetType::AT_CLOTHING: return gAgentWearables.isWearableModifiable(inv_item_id); case LLAssetType::AT_OBJECT: - return true; +// [RLVa:KB] - @touch* + return (!RlvActions::isRlvEnabled()) || ((isAgentAvatarValid()) && (RlvActions::canEdit(gAgentAvatarp->getWornAttachment(inv_item_id)))); +// [/RLVa:KB] +// return true; default: return false;; } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 556a13c361..4c2030f656 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2911,7 +2911,10 @@ bool enable_attachment_touch(const LLUUID& inv_item_id) if (isAgentAvatarValid()) { const LLViewerObject* attach_obj = gAgentAvatarp->getWornAttachment(gInventory.getLinkedItemID(inv_item_id)); - return (attach_obj) && (attach_obj->flagHandleTouch()); +// [RLVa:KB] - @touch* + return (attach_obj) && (attach_obj->flagHandleTouch()) && (!RlvActions::isRlvEnabled() || RlvActions::canTouch(attach_obj)); +// [/RLVa:KB] +// return (attach_obj) && (attach_obj->flagHandleTouch()); } return false; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 7728d59345..5e2a981e4a 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -214,6 +214,7 @@ #include "llcleanup.h" // [RLVa:KB] - Checked: 2010-03-31 (RLVa-1.2.0c) +#include "rlvactions.h" #include "rlvhandler.h" // [/RLVa:KB] @@ -458,6 +459,15 @@ public: camera_view_text = llformat("CameraAtAxis %f %f %f", (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); +// [RLVa:KB] - @showloc + if (!RlvActions::canShowLocation()) + { + agent_center_text = RlvStrings::getString(RlvStringKeys::Hidden::Generic); + agent_root_center_text = RlvStrings::getString(RlvStringKeys::Hidden::Generic); + camera_center_text = RlvStrings::getString(RlvStringKeys::Hidden::Generic); + } +// [/RLVa:KB] + addText(xpos, ypos, agent_center_text); ypos += y_inc; addText(xpos, ypos, agent_root_center_text); ypos += y_inc; addText(xpos, ypos, agent_view_text); ypos += y_inc; From 099c23ab6898530fcfbf412630c4051a42cc2c0b Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 7 Jan 2021 23:46:01 +0100 Subject: [PATCH 016/106] Visual effect base branch --- indra/newview/CMakeLists.txt | 2 + indra/newview/llvisualeffect.cpp | 140 ++++++++++++++++++++++++++++ indra/newview/llvisualeffect.h | 153 +++++++++++++++++++++++++++++++ 3 files changed, 295 insertions(+) create mode 100644 indra/newview/llvisualeffect.cpp create mode 100644 indra/newview/llvisualeffect.h diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index dd3890188e..ba61c46357 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -682,6 +682,7 @@ set(viewer_SOURCE_FILES llviewerwearable.cpp llviewerwindow.cpp llviewerwindowlistener.cpp + llvisualeffect.cpp llvlcomposition.cpp llvlmanager.cpp llvoavatar.cpp @@ -1302,6 +1303,7 @@ set(viewer_HEADER_FILES llviewerwearable.h llviewerwindow.h llviewerwindowlistener.h + llvisualeffect.h llvlcomposition.h llvlmanager.h llvoavatar.h diff --git a/indra/newview/llvisualeffect.cpp b/indra/newview/llvisualeffect.cpp new file mode 100644 index 0000000000..23c9065f96 --- /dev/null +++ b/indra/newview/llvisualeffect.cpp @@ -0,0 +1,140 @@ +/** + * + * Copyright (c) 2021, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the + * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt + * + * By copying, modifying or distributing this software, you acknowledge that + * you have read and understood your obligations described above, and agree to + * abide by those obligations. + * + */ + +#include "llviewerprecompiledheaders.h" + +#include "llvisualeffect.h" + +#include +#include + +// ============================================================================ +// LLTweenableValue class +// + +template<> +float LLTweenableValueLerp::get() +{ + if (!m_CurValue) + { + float curFactor = (LLTimer::getElapsedSeconds() - m_StartTime) / m_Duration; + if (curFactor < 1.0) + return lerp(m_StartValue, m_EndValue, curFactor); + m_CurValue = m_EndValue; + } + return m_CurValue.get(); +} + +template<> +LLColor3 LLTweenableValueLerp::get() +{ + if (!m_CurValue) + { + float curFactor = (LLTimer::getElapsedSeconds() - m_StartTime) / m_Duration; + if (curFactor < 1.0) + return lerp(m_StartValue, m_EndValue, curFactor); + m_CurValue = m_EndValue; + } + return m_CurValue.get(); +} + +template<> +LLVector4 LLTweenableValueLerp::get() +{ + if (!m_CurValue) + { + float curFactor = (LLTimer::getElapsedSeconds() - m_StartTime) / m_Duration; + if (curFactor < 1.0) + return lerp(m_StartValue, m_EndValue, curFactor); + m_CurValue = m_EndValue; + } + return m_CurValue.get(); +} + +// ============================================================================ +// LLVfxManager class +// + +LLVfxManager::LLVfxManager() +{ + +} + +bool LLVfxManager::addEffect(LLVisualEffect* pEffectInst) +{ + if (m_Effects.end() != m_Effects.find(pEffectInst)) + return false; + + m_Effects.insert(pEffectInst); + + return true; +} + +LLVisualEffect* LLVfxManager::getEffect(const LLUUID& idEffect) const +{ + auto itEffect = std::find_if(m_Effects.begin(), m_Effects.end(), [&idEffect](const LLVisualEffect* pEffect) { return pEffect->getId() == idEffect; }); + return (m_Effects.end() != itEffect) ? *itEffect : nullptr; +} + +LLVisualEffect* LLVfxManager::getEffect(EVisualEffect eCode) const +{ + // NOTE: returns the first found but there could be more + auto itEffect = std::find_if(m_Effects.begin(), m_Effects.end(), [eCode](const LLVisualEffect* pEffect) { return pEffect->getCode() == eCode; }); + return (m_Effects.end() != itEffect) ? *itEffect : nullptr; +} + +bool LLVfxManager::removeEffect(const LLUUID& idEffect) +{ + auto itEffect = std::find_if(m_Effects.begin(), m_Effects.end(), [&idEffect](const LLVisualEffect* pEffect) { return pEffect->getId() == idEffect; }); + if (m_Effects.end() == itEffect) + return false; + + delete *itEffect; + m_Effects.erase(itEffect); + return true; +} + +void LLVfxManager::runEffect(EVisualEffect eCode) +{ + // *TODO-Catz: once we're done, check whether iterating over the entire list still has negliable impact + auto pred = [eCode](const LLVisualEffect* pEffect) { return pEffect->getCode() == eCode; }; + + auto beginEffect = boost::make_filter_iterator(pred, m_Effects.begin(), m_Effects.end()), + endEffect = boost::make_filter_iterator(pred, m_Effects.end(), m_Effects.end()); + + auto effectRange = boost::make_iterator_range(beginEffect, endEffect); + for (LLVisualEffect* pEffect : effectRange) + { + pEffect->run(); + } +} + +void LLVfxManager::runEffect(EVisualEffectType eType) +{ + // *TODO-Catz: once we're done, check whether iterating over the entire list still has negliable impact + auto pred = [eType](const LLVisualEffect* pEffect) { return pEffect->getType() == eType; }; + + auto beginEffect = boost::make_filter_iterator(pred, m_Effects.begin(), m_Effects.end()), + endEffect = boost::make_filter_iterator(pred, m_Effects.end(), m_Effects.end()); + + auto effectRange = boost::make_iterator_range(beginEffect, endEffect); + for (LLVisualEffect* pEffect : effectRange) + { + pEffect->run(); + } +} + +// ============================================================================ diff --git a/indra/newview/llvisualeffect.h b/indra/newview/llvisualeffect.h new file mode 100644 index 0000000000..86f3ab56c7 --- /dev/null +++ b/indra/newview/llvisualeffect.h @@ -0,0 +1,153 @@ +/** + * + * Copyright (c) 2021, Kitty Barnett + * + * The source code in this file is provided to you under the terms of the + * GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt + * in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt + * + * By copying, modifying or distributing this software, you acknowledge that + * you have read and understood your obligations described above, and agree to + * abide by those obligations. + * + */ + +#pragma once + +#include "llsingleton.h" + +// ============================================================================ +// +// + +enum class EVisualEffect +{ + RlvOverlay, + RlvSphere, +}; + +enum class EVisualEffectType +{ + PostProcessShader, + Custom, +}; + +// ============================================================================ +// +// + +class LLVisualEffect +{ +public: + LLVisualEffect(LLUUID id, EVisualEffect eCode, EVisualEffectType eType) + : m_id(id), m_eCode(eCode), m_eType(eType) + {} + virtual ~LLVisualEffect() {} + + EVisualEffect getCode() const { return m_eCode;} + const LLUUID& getId() const { return m_id;} + U32 getPriority() const { return m_nPriority; } + EVisualEffectType getType() const { return m_eType;} + + virtual void run() = 0; + + /* + * Member variables + */ +protected: + LLUUID m_id; + EVisualEffect m_eCode; + EVisualEffectType m_eType; + U32 m_nPriority; +}; + +// ============================================================================ +// +// + +enum class LLTweenType +{ + None, + Lerp, +}; + +template +class LLTweenableValue +{ +public: + LLTweenableValue(const T& defaultValue) : m_CurValue(defaultValue) {} + virtual ~LLTweenableValue() {} + + virtual T get() = 0; + virtual void start(const T& endValue, double duration) = 0; + + T& operator =(const T& value) { m_CurValue = value; } + + /* + * Member variables + */ +protected: + boost::optional m_CurValue; +}; + +template +class LLTweenableValueLerp : public LLTweenableValue +{ +public: + LLTweenableValueLerp(const T& defaultValue) : LLTweenableValue(defaultValue) {} + + T get() override; + void start(const T& endValue, double duration) override + { + m_StartValue = get(); + m_CurValue = boost::none; + m_EndValue = endValue; + + m_StartTime = LLTimer::getElapsedSeconds(); + m_Duration = duration; + } + + /* + * Member variables + */ +protected: + double m_StartTime; + double m_Duration; + T m_StartValue; + T m_EndValue; +}; + +// ============================================================================ +// +// + +class LLVfxManager : public LLSingleton +{ + LLSINGLETON(LLVfxManager); +protected: + ~LLVfxManager() {} + + /* + * Member functions + */ +public: + bool addEffect(LLVisualEffect* pEffectInst); + LLVisualEffect* getEffect(const LLUUID& idEffect) const; + template T* getEffect(const LLUUID& idEffect) const { return dynamic_cast(getEffect(idEffect)); } + LLVisualEffect* getEffect(EVisualEffect eCode) const; + template T* getEffect(EVisualEffect eCode) const { return dynamic_cast(getEffect(eCode)); } + bool removeEffect(const LLUUID& idEffect); + void runEffect(EVisualEffect eCode); + void runEffect(EVisualEffectType eType); +protected: + + /* + * Member variables + */ +protected: + std::set m_Effects; +}; + +// ============================================================================ From 35a34ccf7172517bcf3ba6f45a685c7065315c70 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Fri, 8 Jan 2021 02:20:02 +0100 Subject: [PATCH 017/106] Increment version to RLVa-2.4.0 and spec version to v3.4.3 --- indra/newview/rlvdefines.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index ca3180d5c1..09dd9982dc 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -26,19 +26,19 @@ // Version of the specifcation we report const S32 RLV_VERSION_MAJOR = 3; -const S32 RLV_VERSION_MINOR = 3; +const S32 RLV_VERSION_MINOR = 4; const S32 RLV_VERSION_PATCH = 3; const S32 RLV_VERSION_BUILD = 0; // Version of the specifcation we report (in compatibility mode) const S32 RLV_VERSION_MAJOR_COMPAT = 2; -const S32 RLV_VERSION_MINOR_COMPAT = 8; -const S32 RLV_VERSION_PATCH_COMPAT = 0; +const S32 RLV_VERSION_MINOR_COMPAT = 9; +const S32 RLV_VERSION_PATCH_COMPAT = 28; const S32 RLV_VERSION_BUILD_COMPAT = 0; // Implementation version const S32 RLVa_VERSION_MAJOR = 2; -const S32 RLVa_VERSION_MINOR = 3; +const S32 RLVa_VERSION_MINOR = 4; const S32 RLVa_VERSION_PATCH = 0; const S32 RLVa_IMPL_ID = 13; From 36913120e5956e437f1f214ff74af0e26ead4b3d Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sun, 10 Jan 2021 23:34:01 +0100 Subject: [PATCH 018/106] Clear local modifiers when their base restriction is removed (after some feedback) --- indra/newview/rlvcommon.cpp | 2 ++ indra/newview/rlvdefines.h | 1 + indra/newview/rlveffects.cpp | 44 ----------------------------------- indra/newview/rlvfloaters.cpp | 2 +- indra/newview/rlvhandler.cpp | 4 +++- indra/newview/rlvhelper.cpp | 31 +++++++++++++++++++++--- indra/newview/rlvhelper.h | 8 +++++-- 7 files changed, 41 insertions(+), 51 deletions(-) diff --git a/indra/newview/rlvcommon.cpp b/indra/newview/rlvcommon.cpp index 0eee08d0a6..d4b9e30232 100644 --- a/indra/newview/rlvcommon.cpp +++ b/indra/newview/rlvcommon.cpp @@ -399,6 +399,8 @@ const char* RlvStrings::getStringFromReturnCode(ERlvCmdRet eRet) return "deprecated and disabled"; case RLV_RET_FAILED_NOBEHAVIOUR: return "no active behaviours"; + case RLV_RET_FAILED_UNHELDBEHAVIOUR: + return "base behaviour not held"; case RLV_RET_FAILED_BLOCKED: return "blocked object"; case RLV_RET_FAILED_THROTTLED: diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 690bda54fc..c1d2959ed9 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -335,6 +335,7 @@ enum ERlvCmdRet { RLV_RET_FAILED_NOSHAREDROOT, // Command failed (missing #RLV) RLV_RET_FAILED_DEPRECATED, // Command failed (deprecated and no longer supported) RLV_RET_FAILED_NOBEHAVIOUR, // Command failed (force modifier on an object with no active restrictions) + RLV_RET_FAILED_UNHELDBEHAVIOUR, // Command failed (local modifier on an object that doesn't hold the base behaviour) RLV_RET_FAILED_BLOCKED, // Command failed (object is blocked) RLV_RET_FAILED_THROTTLED, // Command failed (throttled) RLV_RET_NO_PROCESSOR // Command doesn't have a template processor define (legacy code) diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 454a9db38c..9a14f848e7 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -42,22 +42,6 @@ RlvOverlayEffect::RlvOverlayEffect(const LLUUID& idRlvObj) , m_fBlockTouch(false) , m_Color(LLColor3(c_DefaultColor)) { - if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) - { - float nAlpha; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayAlpha, nAlpha)) - m_nAlpha = nAlpha; - - pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayTouch, m_fBlockTouch); - - LLVector3 vecColor; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayTint, vecColor)) - m_Color = LLColor3(vecColor.mV); - - LLUUID idTexture; - if ( (pRlvObj) && (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::OverlayTexture, idTexture)) ) - setImage(idTexture); - } } RlvOverlayEffect::~RlvOverlayEffect() @@ -198,34 +182,6 @@ RlvSphereEffect::RlvSphereEffect(const LLUUID& idRlvObj) , m_nValueMin(c_SphereDefaultAlpha), m_nValueMax(c_SphereDefaultAlpha) , m_nTweenDuration(0.f) { - if (RlvObject* pRlvObj = gRlvHandler.getObject(idRlvObj)) - { - int nNumber; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereMode, nNumber)) - m_eMode = (ESphereMode)nNumber; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereOrigin, nNumber)) - m_eOrigin = (ESphereOrigin)nNumber; - - LLVector3 vecColor; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereColor, vecColor)) - m_Params = LLVector4(vecColor.mV[VX], vecColor.mV[VY], vecColor.mV[VZ], 1.0f); - LLVector4 vecParams; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereParams, vecParams)) - m_Params = vecParams; - - float nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereDistMin, nFloat)) - m_nDistanceMin = nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereDistMax, nFloat)) - m_nDistanceMax = nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereDistExtend, nNumber)) - m_eDistExtend = (ESphereDistExtend)nNumber; - - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereValueMin, nFloat)) - m_nValueMin = nFloat; - if (pRlvObj->getModifierValue(ERlvLocalBhvrModifier::SphereValueMax, nFloat)) - m_nValueMax = nFloat; - } } RlvSphereEffect::~RlvSphereEffect() diff --git a/indra/newview/rlvfloaters.cpp b/indra/newview/rlvfloaters.cpp index 5f90fa1259..b0b089e138 100644 --- a/indra/newview/rlvfloaters.cpp +++ b/indra/newview/rlvfloaters.cpp @@ -813,7 +813,7 @@ void RlvFloaterConsole::onInput(LLUICtrl* pCtrl, const LLSD& sdParam) strCmd.clear(); // Only show feedback on successful commands when there's an informational notice if (!pstr->empty()) - pstr->push_back(','); + pstr->append(", "); pstr->append(strCmd); } diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index e0acc3c279..5d9e16fac6 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -1717,6 +1717,8 @@ ERlvCmdRet RlvCommandHandlerBaseImpl::processCommand(const RlvC { if (rlvCmd.isStrict()) gRlvHandler.removeException(rlvCmd.getObjectID(), RLV_BHVR_PERMISSIVE, eBhvr); + if (RlvObject* pRlvObj = gRlvHandler.getObject(rlvCmd.getObjectID())) + pRlvObj->clearModifiers(eBhvr); gRlvHandler.m_Behaviours[eBhvr]--; } @@ -2085,7 +2087,7 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& else LLVfxManager::instance().removeEffect(gRlvHandler.getCurrentObject()); } - return RLV_RET_SUCCESS; + return eRet; } // Handles: @sendchannel[:]=n|y and @sendchannel_except[:]=n|y diff --git a/indra/newview/rlvhelper.cpp b/indra/newview/rlvhelper.cpp index d56f0898f4..3b369cd7a5 100644 --- a/indra/newview/rlvhelper.cpp +++ b/indra/newview/rlvhelper.cpp @@ -406,6 +406,20 @@ void RlvBehaviourDictionary::clearModifiers(const LLUUID& idRlvObj) } } +const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(ERlvBehaviour eBhvr, ERlvParamType eParamType) const +{ + const RlvBehaviourInfo* pBhvrInfo = nullptr; + for (auto itBhvrLower = m_Bhvr2InfoMap.lower_bound(eBhvr), itBhvrUpper = m_Bhvr2InfoMap.upper_bound(eBhvr); + std::find_if(itBhvrLower, itBhvrUpper, [eBhvr, eParamType](const rlv_bhvr2info_map_t::value_type& bhvrEntry) { return bhvrEntry.second->getParamTypeMask() == eParamType; }) != itBhvrUpper; + ++itBhvrLower) + { + if (pBhvrInfo) + return nullptr; + pBhvrInfo = itBhvrLower->second; + } + return pBhvrInfo; +} + const RlvBehaviourInfo* RlvBehaviourDictionary::getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict, ERlvLocalBhvrModifier* peBhvrModifier) const { size_t idxBhvrLastPart = strBhvr.find_last_of('_'); @@ -491,9 +505,9 @@ void RlvBehaviourDictionary::toggleBehaviourFlag(const std::string& strBhvr, ERl // virtual ERlvCmdRet RlvBehaviourInfo::processModifier(const RlvCommand& rlvCmd) const { - // The object should be holding at least one active behaviour - if (!gRlvHandler.hasBehaviour(rlvCmd.getObjectID())) - return RLV_RET_FAILED_NOBEHAVIOUR; + // The object should have the base behaviour set (or else there's nothing to modify) + if (!gRlvHandler.hasBehaviour(rlvCmd.getObjectID(), rlvCmd.getBehaviourType())) + return RLV_RET_FAILED_UNHELDBEHAVIOUR; auto itBhvrModifier = std::find_if(m_BhvrModifiers.begin(), m_BhvrModifiers.end(), [&rlvCmd](const modifier_lookup_t::value_type& entry) { return std::get<0>(entry.second) == rlvCmd.getBehaviourModifier(); }); if (m_BhvrModifiers.end() == itBhvrModifier) @@ -1147,6 +1161,17 @@ std::string RlvObject::getStatusString(const std::string& strFilter, const std:: return strStatus; } +void RlvObject::clearModifiers(ERlvBehaviour eBhvr) +{ + if (const RlvBehaviourInfo* pBhvrInfo = RlvBehaviourDictionary::instance().getBehaviourInfo(eBhvr, RLV_TYPE_ADDREM)) + { + for (const auto& modifierEntry : pBhvrInfo->getModifiers()) + { + clearModifierValue(std::get<0>(modifierEntry.second)); + } + } +} + void RlvObject::clearModifierValue(ERlvLocalBhvrModifier eBhvrModifier) { m_Modifiers.erase(eBhvrModifier); diff --git a/indra/newview/rlvhelper.h b/indra/newview/rlvhelper.h index f5e9c7c6d2..f3a758d215 100644 --- a/indra/newview/rlvhelper.h +++ b/indra/newview/rlvhelper.h @@ -40,6 +40,8 @@ class RlvBehaviourInfo { typedef std::function)> modifier_handler_func_t; public: + typedef std::map> modifier_lookup_t; + enum EBehaviourFlags { // General behaviour flags @@ -71,6 +73,7 @@ public: ERlvBehaviour getBehaviourType() const { return m_eBhvr; } U32 getBehaviourFlags() const { return m_nBhvrFlags; } U32 getParamTypeMask() const { return m_maskParamType; } + const modifier_lookup_t& getModifiers() const { return m_BhvrModifiers; } bool hasStrict() const { return m_nBhvrFlags & BHVR_STRICT; } bool isBlocked() const { return m_nBhvrFlags & BHVR_BLOCKED; } bool isExperimental() const { return m_nBhvrFlags & BHVR_EXPERIMENTAL; } @@ -87,7 +90,6 @@ protected: ERlvBehaviour m_eBhvr; U32 m_nBhvrFlags; U32 m_maskParamType; - typedef std::map> modifier_lookup_t; modifier_lookup_t m_BhvrModifiers; }; @@ -112,7 +114,8 @@ public: public: void clearModifiers(const LLUUID& idRlvObj); ERlvBehaviour getBehaviourFromString(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = NULL) const; - const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = nullptr, ERlvLocalBhvrModifier* peBhvrModifier = nullptr) const; + const RlvBehaviourInfo* getBehaviourInfo(ERlvBehaviour eBhvr, ERlvParamType eParamType) const; + const RlvBehaviourInfo* getBehaviourInfo(const std::string& strBhvr, ERlvParamType eParamType, bool* pfStrict = nullptr, ERlvLocalBhvrModifier* peBhvrModifier = nullptr) const; bool getCommands(const std::string& strMatch, ERlvParamType eParamType, std::list& cmdList) const; bool getHasStrict(ERlvBehaviour eBhvr) const; RlvBehaviourModifier* getModifier(ERlvBehaviourModifier eBhvrMod) const { return (eBhvrMod < RLV_MODIFIER_COUNT) ? m_BehaviourModifiers[eBhvrMod] : nullptr; } @@ -467,6 +470,7 @@ public: * Local-scope modifiers */ public: + void clearModifiers(ERlvBehaviour eBhvr); void clearModifierValue(ERlvLocalBhvrModifier eBhvrMod); template bool getModifierValue(ERlvLocalBhvrModifier eBhvrModifier, T& value) const; void setModifierValue(ERlvLocalBhvrModifier eBhvrMod, const RlvBehaviourModifierValue& modValue); From 89c729455df96e09f8abf05bae1593f415b78054 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 13 Jan 2021 22:08:57 +0100 Subject: [PATCH 019/106] Move the shader to renderFinalize (and also stop doing that oopsie of writing to the buffer we were reading from) --- indra/newview/llviewerdisplay.cpp | 9 --- indra/newview/pipeline.cpp | 96 +++++++++++++++++++++++++------ indra/newview/rlveffects.cpp | 62 +++++++++++++------- indra/newview/rlveffects.h | 8 +-- 4 files changed, 124 insertions(+), 51 deletions(-) diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 9696727c34..5c1ab2e5e0 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1031,15 +1031,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { gPipeline.renderDeferredLighting(&gPipeline.mScreen); } -// [RLVa:KB] - @setsphere - else if (LLRenderTarget::sUseFBO && LLPipeline::sUseDepthTexture) - { - if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) - { - LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere); - } - } -// [/RLVa:KB] LLPipeline::sUnderWaterRender = FALSE; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 38ce86f8c8..2b36180488 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1003,6 +1003,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) const U32 occlusion_divisor = 3; if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; if (!mOcclusionDepth.allocate(resX / occlusion_divisor, resY / occlusion_divisor, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; + if (RlvActions::isRlvEnabled() && !mDeferredLight.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false; } // [/RLVa:KB] // mDeferredDepth.release(); @@ -7788,6 +7789,9 @@ void LLPipeline::renderFinalize() LLVertexBuffer::unbind(); +// [RLVa:KB] - @setsphere + LLRenderTarget* pRenderBuffer = (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) ? &mDeferredLight : nullptr; +// [/RLVa:KB] if (LLPipeline::sRenderDeferred) { @@ -7796,6 +7800,12 @@ void LLPipeline::renderFinalize() RenderDepthOfField; bool multisample = RenderFSAASamples > 1 && mFXAABuffer.isComplete(); +// [RLVa:KB] - @setsphere + if (multisample && !pRenderBuffer) + { + pRenderBuffer = &mDeferredLight; + } +// [/RLVa:KB] gViewerWindow->setup3DViewport(); @@ -7976,11 +7986,18 @@ void LLPipeline::renderFinalize() } { // combine result based on alpha - if (multisample) +// if (multisample) +// { +// mDeferredLight.bindTarget(); +// glViewport(0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight()); +// } +// [RLVa:KB] - @setsphere + if (pRenderBuffer) { - mDeferredLight.bindTarget(); + pRenderBuffer->bindTarget(); glViewport(0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight()); } +// [/RLVa:KB] else { gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; @@ -8018,18 +8035,30 @@ void LLPipeline::renderFinalize() unbindDeferredShader(*shader); - if (multisample) +// [RLVa:KB] - @setsphere + if (pRenderBuffer) { - mDeferredLight.flush(); + pRenderBuffer->flush(); } +// [/RLVa:KB] +// if (multisample) +// { +// mDeferredLight.flush(); +// } } } else { - if (multisample) +// if (multisample) +// { +// mDeferredLight.bindTarget(); +// } +// [RLVa:KB] - @setsphere + if (pRenderBuffer) { - mDeferredLight.bindTarget(); + pRenderBuffer->bindTarget(); } +// [/RLVa:KB] LLGLSLShader *shader = &gDeferredPostNoDoFProgram; bindDeferredShader(*shader); @@ -8054,12 +8083,27 @@ void LLPipeline::renderFinalize() unbindDeferredShader(*shader); - if (multisample) +// [RLVa:KB] - @setsphere + if (pRenderBuffer) { - mDeferredLight.flush(); + pRenderBuffer->flush(); } +// [/RLVa:KB] +// if (multisample) +// { +// mDeferredLight.flush(); +// } } +// [RLVa:KB] - @setsphere + if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) + { + LLShaderEffectParams params(pRenderBuffer, (multisample) ? &mScreen : nullptr); + LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere, ¶ms); + pRenderBuffer = params.m_pDstBuffer; + } +// [/RLVa:KB] + if (multisample) { // bake out texture2D with RGBL for FXAA shader @@ -8074,11 +8118,18 @@ void LLPipeline::renderFinalize() shader->bind(); shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height); - S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage()); +// S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage()); +// if (channel > -1) +// { +// mDeferredLight.bindTexture(0, channel); +// } +// [RLVa:KB] - @setsphere + S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, pRenderBuffer->getUsage()); if (channel > -1) { - mDeferredLight.bindTexture(0, channel); + pRenderBuffer->bindTexture(0, channel); } +// [RLVa:KB] gGL.begin(LLRender::TRIANGLE_STRIP); gGL.vertex2f(-1, -1); @@ -8088,7 +8139,10 @@ void LLPipeline::renderFinalize() gGL.flush(); - shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage()); +// [RLVa:KB] - @setsphere + shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, pRenderBuffer->getUsage()); +// [/RLVa:KB] +// shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage()); shader->unbind(); mFXAABuffer.flush(); @@ -8129,6 +8183,15 @@ void LLPipeline::renderFinalize() } else // not deferred { +// [RLVa:KB] - @setsphere + if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) + { + LLShaderEffectParams params(&mScreen, &mDeferredLight); + LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere, ¶ms); + pRenderBuffer = params.m_pDstBuffer; + } +// [/RLVa:KB] + U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1; LLPointer buff = new LLVertexBuffer(mask, 0); buff->allocateBuffer(3, 0, TRUE); @@ -8171,7 +8234,10 @@ void LLPipeline::renderFinalize() } gGL.getTexUnit(0)->bind(&mGlow[1]); - gGL.getTexUnit(1)->bind(&mScreen); +// [RLVa:KB] - @setsphere + gGL.getTexUnit(1)->bind( pRenderBuffer ? pRenderBuffer : &mScreen ); +// [/RLVa:KB] +// gGL.getTexUnit(1)->bind(&mScreen); LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0); @@ -9142,12 +9208,6 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget *screen_target) } screen_target->flush(); -// [RLVa:KB] - @setsphere - if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) - { - LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere); - } -// [/RLVa:KB] } void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep) diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 8f6a2b70b3..9ed13747ba 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -118,7 +118,7 @@ void RlvOverlayEffect::setImage(const LLUUID& idTexture) m_pImage->forceToSaveRawImage(0); } -void RlvOverlayEffect::run() +void RlvOverlayEffect::run(const LLVisualEffectParams*) { if (m_pImage) { @@ -310,10 +310,10 @@ ERlvCmdRet RlvSphereEffect::onValueMaxChanged(const LLUUID& idRlvObj, const boos return RLV_RET_SUCCESS; } -void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget) +void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader) { pShader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, get_current_projection().inverse().m); - pShader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, pRenderTarget->getWidth(), pRenderTarget->getHeight()); + pShader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, gPipeline.mScreen.getWidth(), gPipeline.mScreen.getHeight()); pShader->uniform1i(LLShaderMgr::RLV_EFFECT_MODE, llclamp((int)m_eMode, 0, (int)ESphereMode::Count)); // Pass the sphere origin to the shader @@ -329,7 +329,7 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p break; } glh::vec4f posSphereOriginGl(posSphereOrigin.mV); - const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); + const glh::matrix4f& mvMatrix = gGLModelView; mvMatrix.mult_matrix_vec(posSphereOriginGl); pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM1, 1, posSphereOriginGl.v); @@ -347,14 +347,26 @@ void RlvSphereEffect::setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* p pShader->uniform4fv(LLShaderMgr::RLV_EFFECT_PARAM4, 1, effectParams.v); } -void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const +void RlvSphereEffect::renderPass(LLGLSLShader* pShader, const LLShaderEffectParams* pParams) const { - gPipeline.mScreen.bindTarget(); + if (pParams->m_pDstBuffer) + { + pParams->m_pDstBuffer->bindTarget(); + } + else + { + gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; + gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; + gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); + gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); + glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); + } + RLV_ASSERT_DBG(pParams->m_pSrcBuffer); - S32 nDiffuseChannel = pShader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); + S32 nDiffuseChannel = pShader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, pParams->m_pSrcBuffer->getUsage()); if (nDiffuseChannel > -1) { - gPipeline.mScreen.bindTexture(0, nDiffuseChannel); + pParams->m_pSrcBuffer->bindTexture(0, nDiffuseChannel); gGL.getTexUnit(nDiffuseChannel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } @@ -371,45 +383,55 @@ void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const gGL.pushMatrix(); gGL.loadMatrix(gGLModelView); - gPipeline.mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); - gPipeline.mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); + LLVector2 tc1(0, 0); + LLVector2 tc2((F32)gPipeline.mScreen.getWidth() * 2, (F32)gPipeline.mScreen.getHeight() * 2); + gGL.begin(LLRender::TRIANGLE_STRIP); + gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); + gGL.vertex2f(-1, -1); + gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); + gGL.vertex2f(-1, 3); + gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); + gGL.vertex2f(3, -1); + gGL.end(); gGL.matrixMode(LLRender::MM_PROJECTION); gGL.popMatrix(); gGL.matrixMode(LLRender::MM_MODELVIEW); gGL.popMatrix(); - pShader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, gPipeline.mScreen.getUsage()); - pShader->disableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mScreen.getUsage()); - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(0)->activate(); + pShader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, pParams->m_pSrcBuffer->getUsage()); + pShader->disableTexture(LLShaderMgr::DEFERRED_DEPTH, gPipeline.mDeferredDepth.getUsage()); - gPipeline.mScreen.flush(); + if (pParams->m_pDstBuffer) + { + pParams->m_pDstBuffer->flush(); + } } LLTrace::BlockTimerStatHandle FTM_RLV_EFFECT_SPHERE("Post-process (RLVa sphere)"); -void RlvSphereEffect::run() +void RlvSphereEffect::run(const LLVisualEffectParams* pParams) { LL_RECORD_BLOCK_TIME(FTM_RLV_EFFECT_SPHERE); LLGLDepthTest depth(GL_FALSE, GL_FALSE); gRlvSphereProgram.bind(); - setShaderUniforms(&gRlvSphereProgram, &gPipeline.mScreen); + setShaderUniforms(&gRlvSphereProgram); + const LLShaderEffectParams* pShaderParams = static_cast(pParams); switch (m_eMode) { case ESphereMode::Blend: case ESphereMode::ChromaticAberration: case ESphereMode::Pixelate: - renderPass(&gRlvSphereProgram); + renderPass(&gRlvSphereProgram, pShaderParams); break; case ESphereMode::Blur: case ESphereMode::BlurVariable: gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 1.f, 0.f); - renderPass(&gRlvSphereProgram); + renderPass(&gRlvSphereProgram, pShaderParams); gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 0.f, 1.f); - renderPass(&gRlvSphereProgram); + renderPass(&gRlvSphereProgram, pShaderParams); break; } diff --git a/indra/newview/rlveffects.h b/indra/newview/rlveffects.h index 283346c9f9..0b55b2a500 100644 --- a/indra/newview/rlveffects.h +++ b/indra/newview/rlveffects.h @@ -37,7 +37,7 @@ public: public: bool hitTest(const LLCoordGL& ptMouse) const; - void run() override; + void run(const LLVisualEffectParams*) override; void tweenAlpha(float endAlpha, double duration) { m_nAlpha.start(endAlpha, duration); } void tweenColor(LLColor3 endColor, double duration) { m_Color.start(endColor, duration); } static ERlvCmdRet onAlphaValueChanged(const LLUUID& idRlvObj, const boost::optional newValue); @@ -71,7 +71,7 @@ public: ~RlvSphereEffect(); public: - void run() override; + void run(const LLVisualEffectParams* pParams) override; static ERlvCmdRet onModeChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onOriginChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onColorChanged(const LLUUID& idRlvObj, const boost::optional newValue); @@ -83,8 +83,8 @@ public: static ERlvCmdRet onValueMinChanged(const LLUUID& idRlvObj, const boost::optional newValue); static ERlvCmdRet onValueMaxChanged(const LLUUID& idRlvObj, const boost::optional newValue); protected: - void renderPass(LLGLSLShader* pShader) const; - void setShaderUniforms(LLGLSLShader* pShader, LLRenderTarget* pRenderTarget); + void renderPass(LLGLSLShader* pShader, const LLShaderEffectParams* pParams) const; + void setShaderUniforms(LLGLSLShader* pShader); /* * Member variables From 8238aee56026ec7a2ef7e34d56931df523e82fd1 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Wed, 13 Jan 2021 22:10:23 +0100 Subject: [PATCH 020/106] Add LLVisualEffectParams (and derived LLShaderEffectParams) --- indra/newview/llvisualeffect.cpp | 8 ++++---- indra/newview/llvisualeffect.h | 28 +++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/indra/newview/llvisualeffect.cpp b/indra/newview/llvisualeffect.cpp index 23c9065f96..88e0b35807 100644 --- a/indra/newview/llvisualeffect.cpp +++ b/indra/newview/llvisualeffect.cpp @@ -107,7 +107,7 @@ bool LLVfxManager::removeEffect(const LLUUID& idEffect) return true; } -void LLVfxManager::runEffect(EVisualEffect eCode) +void LLVfxManager::runEffect(EVisualEffect eCode, const LLVisualEffectParams* pParams) { // *TODO-Catz: once we're done, check whether iterating over the entire list still has negliable impact auto pred = [eCode](const LLVisualEffect* pEffect) { return pEffect->getCode() == eCode; }; @@ -118,11 +118,11 @@ void LLVfxManager::runEffect(EVisualEffect eCode) auto effectRange = boost::make_iterator_range(beginEffect, endEffect); for (LLVisualEffect* pEffect : effectRange) { - pEffect->run(); + pEffect->run(pParams); } } -void LLVfxManager::runEffect(EVisualEffectType eType) +void LLVfxManager::runEffect(EVisualEffectType eType, const LLVisualEffectParams* pParams) { // *TODO-Catz: once we're done, check whether iterating over the entire list still has negliable impact auto pred = [eType](const LLVisualEffect* pEffect) { return pEffect->getType() == eType; }; @@ -133,7 +133,7 @@ void LLVfxManager::runEffect(EVisualEffectType eType) auto effectRange = boost::make_iterator_range(beginEffect, endEffect); for (LLVisualEffect* pEffect : effectRange) { - pEffect->run(); + pEffect->run(pParams); } } diff --git a/indra/newview/llvisualeffect.h b/indra/newview/llvisualeffect.h index 86f3ab56c7..fb11881e21 100644 --- a/indra/newview/llvisualeffect.h +++ b/indra/newview/llvisualeffect.h @@ -18,6 +18,12 @@ #include "llsingleton.h" +// ============================================================================ +// +// + +class LLRenderTarget; + // ============================================================================ // // @@ -38,6 +44,22 @@ enum class EVisualEffectType // // +struct LLVisualEffectParams +{ +}; + +struct LLShaderEffectParams : LLVisualEffectParams +{ + explicit LLShaderEffectParams(LLRenderTarget* pSrcBuffer, LLRenderTarget* pDstBuffer) : m_pSrcBuffer(pSrcBuffer), m_pDstBuffer(pDstBuffer) {} + + LLRenderTarget* m_pSrcBuffer = nullptr; + LLRenderTarget* m_pDstBuffer = nullptr; +}; + +// ============================================================================ +// +// + class LLVisualEffect { public: @@ -51,7 +73,7 @@ public: U32 getPriority() const { return m_nPriority; } EVisualEffectType getType() const { return m_eType;} - virtual void run() = 0; + virtual void run(const LLVisualEffectParams* pParams) = 0; /* * Member variables @@ -139,8 +161,8 @@ public: LLVisualEffect* getEffect(EVisualEffect eCode) const; template T* getEffect(EVisualEffect eCode) const { return dynamic_cast(getEffect(eCode)); } bool removeEffect(const LLUUID& idEffect); - void runEffect(EVisualEffect eCode); - void runEffect(EVisualEffectType eType); + void runEffect(EVisualEffect eCode, const LLVisualEffectParams* pParams = nullptr); + void runEffect(EVisualEffectType eType, const LLVisualEffectParams* pParams = nullptr); protected: /* From e43634d8c31e40e11b454c442800675a23be1a40 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 16 Jan 2021 16:04:12 +0100 Subject: [PATCH 021/106] Add @getdebug_aspectratio to return the viewer window's AR (helper for @setoverlay) --- indra/newview/rlvextensions.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/newview/rlvextensions.cpp b/indra/newview/rlvextensions.cpp index 9a44df6778..faffcd5bb3 100644 --- a/indra/newview/rlvextensions.cpp +++ b/indra/newview/rlvextensions.cpp @@ -17,6 +17,7 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" #include "llagentcamera.h" +#include "llviewerwindow.h" #include "llvoavatarself.h" #include "rlvextensions.h" @@ -34,6 +35,7 @@ RlvExtGetSet::RlvExtGetSet() if (!m_DbgAllowed.size()) // m_DbgAllowed is static and should only be initialized once { m_DbgAllowed.insert(std::pair("AvatarSex", DBG_READ | DBG_WRITE | DBG_PSEUDO)); + m_DbgAllowed.insert(std::pair("AspectRatio", DBG_READ | DBG_PSEUDO)); m_DbgAllowed.insert(std::pair("RenderResolutionDivisor", DBG_READ | DBG_WRITE)); m_DbgAllowed.insert(std::pair(RlvSettingNames::ForbidGiveToRlv, DBG_READ)); m_DbgAllowed.insert(std::pair(RlvSettingNames::NoSetEnv, DBG_READ)); @@ -196,6 +198,10 @@ std::string RlvExtGetSet::onGetPseudoDebug(const std::string& strSetting) return llformat("%d", (gAgentAvatarp->getSex() == SEX_MALE)); // [See LLFloaterCustomize::LLFloaterCustomize()] } } + else if ("AspectRatio" == strSetting) + { + return llformat("%.3f", (float)gViewerWindow->getWorldViewWidthScaled() / gViewerWindow->getWorldViewHeightScaled()); + } return std::string(); } From 3ac4e2a4fcd57f4a78ed01e43eeb478c3845babd Mon Sep 17 00:00:00 2001 From: Ptolemy Date: Thu, 21 Jan 2021 17:29:54 -0800 Subject: [PATCH 022/106] SL-14705: Merge Sovereign Engineer's fix for name tags showing in front with AMD GPUs: Fix GL_INVALID_OPERATION when copying stencil to default window framebuffer on AMD graphics on windows --- indra/llwindow/llwindowwin32.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index e9e258ff3e..7d26eee5af 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1454,24 +1454,29 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO LL_INFOS("Window") << "pixel formats done." << LL_ENDL ; - S32 swap_method = 0; - S32 cur_format = num_formats-1; - GLint swap_query = WGL_SWAP_METHOD_ARB; + S32 swap_method = 0; + S32 cur_format = 0; + GLint swap_query = WGL_SWAP_METHOD_ARB; - BOOL found_format = FALSE; - - while (!found_format && wglGetPixelFormatAttribivARB(mhDC, pixel_format, 0, 1, &swap_query, &swap_method)) + // SL-14705 Fix name tags showing in front of objects with AMD GPUs. + // On AMD hardware we need to iterate from the first pixel format to the end. + // Spec: + // https://www.khronos.org/registry/OpenGL/extensions/ARB/WGL_ARB_pixel_format.txt + while (wglGetPixelFormatAttribivARB(mhDC, pixel_formats[cur_format], 0, 1, &swap_query, &swap_method)) { - if (swap_method == WGL_SWAP_UNDEFINED_ARB || cur_format <= 0) + if (swap_method == WGL_SWAP_UNDEFINED_ARB) { - found_format = TRUE; + break; } - else + else if (cur_format >= (S32)(num_formats - 1)) { - --cur_format; + cur_format = 0; + break; } + + ++cur_format; } - + pixel_format = pixel_formats[cur_format]; if (mhDC != 0) // Does The Window Have A Device Context? From 80aa04dadd0cdc6c308462441c183da6ab93ee13 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Thu, 4 Feb 2021 19:13:36 +0100 Subject: [PATCH 023/106] Updated Polish translation --- .../skins/default/xui/pl/floater_joystick.xml | 19 +++++++++---------- .../skins/default/xui/pl/notifications.xml | 3 +++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/indra/newview/skins/default/xui/pl/floater_joystick.xml b/indra/newview/skins/default/xui/pl/floater_joystick.xml index d3bded4ab4..e0543a27e0 100644 --- a/indra/newview/skins/default/xui/pl/floater_joystick.xml +++ b/indra/newview/skins/default/xui/pl/floater_joystick.xml @@ -1,16 +1,15 @@ - - nie wykryto urządzenia + + Brak - - - - - - - - + + + + + + + diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 1691db195c..426da0b743 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -3832,6 +3832,9 @@ Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE]. - Pamięć Twojego systemu nie spełnia minimalnych wymagań. + + Nie udało się uruchomić usługi aktualizatora [UPDATER_APP]. Sprawdź, czy przeglądarka jest poprawnie zainstalowana i czy ma niezbędne uprawnienia do uruchomienia. Jeśli nadal będziesz mieć problemy, odwiedź [SUPPORT_SITE]. + Jeśli jesteś właścicielem działki, to możesz ustawić na niej miejsce startu. W innym przypadku możesz poszukać na mapie miejsc oznaczonych jako "Infohub". From 49690e5b8ba1c2579d0d4e0c7ec604cec07bd0c9 Mon Sep 17 00:00:00 2001 From: Beq Date: Thu, 4 Feb 2021 22:12:28 +0000 Subject: [PATCH 024/106] Trap one specific fail code and force refresh of pollset There may well be others that we should do this for but for now this eliminates the worst offender --- indra/llplugin/llpluginprocessparent.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 1d4c10eab2..f56a74237c 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -920,7 +920,8 @@ void LLPluginProcessParent::poll(F64 timeout) // } else { - LL_WARNS("PluginPoll") << "apr_pollset_poll failed with status " << status << " (" << APR_TO_OS_ERROR(status) << ")" << LL_ENDL; + LL_WARNS("PluginPoll") << "apr_pollset_poll failed with status " << status << " (" << APR_TO_OS_ERROR(status) << ") Rebuild PollSet" << LL_ENDL; + sPollsetNeedsRebuild = true; } // } From aca484d2c31b786ece979b3056f574f4ece74800 Mon Sep 17 00:00:00 2001 From: Beq Date: Fri, 5 Feb 2021 01:37:01 +0000 Subject: [PATCH 025/106] FIRE-30732 - Fix side-effects of deferred sort ScrollList now has XUI attribute SortLazily which defaults to False. The deferral period is defaulted to 5 to reduce false triggers further. --- indra/llui/llscrolllistctrl.cpp | 6 +++++- indra/llui/llscrolllistctrl.h | 3 +++ indra/newview/app_settings/settings.xml | 2 +- indra/newview/skins/default/xui/en/panel_group_notices.xml | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index fba3e98411..cb83eda373 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -132,6 +132,7 @@ LLScrollListCtrl::Params::Params() search_column("search_column", 0), sort_column("sort_column", -1), sort_ascending("sort_ascending", true), + sort_lazily("sort_lazily", false), // FIRE-30732 deferred sort as a UI property persist_sort_order("persist_sort_order", false), // Persists sort order of scroll lists primary_sort_only("primary_sort_only", false), // Option to only sort by one column mouse_wheel_opaque("mouse_wheel_opaque", false), @@ -186,6 +187,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) mTotalStaticColumnWidth(0), mTotalColumnPadding(0), mSorted(false), + mSortLazily(p.sort_lazily), // FIRE-30732 deferred sort configurability mDirty(false), mOriginalSelection(-1), mLastSelected(NULL), @@ -2957,7 +2959,9 @@ void LLScrollListCtrl::updateSort() const // if (hasSortOrder() && !isSorted()) // { static LLUICachedControl sortDeferFrameCount("FSSortDeferalFrames"); - if ( hasSortOrder() && !isSorted() && ( mLastUpdateFrame > 1 && ( LLFrameTimer::getFrameCount() - mLastUpdateFrame ) >= sortDeferFrameCount ) ) + if ( hasSortOrder() && !isSorted() && + ( !mSortLazily || // if deferred sorting is off OR the deferral period has been exceeded + ( mLastUpdateFrame > 1 && ( LLFrameTimer::getFrameCount() - mLastUpdateFrame ) >= sortDeferFrameCount ) ) ) // encoding two (unlikely) special values into mLastUpdateFrame 1 means we've sorted and 0 means we've nothing new to do. // 0 is set after sorting, 1 can be set by a parent for any post sorting action. { diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index b6cc6590ed..9f8c93b6ad 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -117,6 +117,7 @@ public: Optional search_column, sort_column; Optional sort_ascending; + Optional sort_lazily; // FIRE-30732 deferred sort as a UI property Optional persist_sort_order; // Persists sort order of scroll lists Optional primary_sort_only; // Option to only sort by one column @@ -559,6 +560,8 @@ private: // Option to only sort by one column bool mPrimarySortOnly; + // deferred sort as a UI property + bool mSortLazily; mutable bool mSorted; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0e286182b6..8323ba1ce7 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -353,7 +353,7 @@ Type U32 Value - 2 + 5 FSGroupNotifyNoTransparency diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index e2f6dc0d75..ed5a0ab299 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -46,6 +46,7 @@ Maximum 200 per group daily draw_heading="true" sort_column="4" sort_ascending="false" + sort_lazily="true" follows="left|top|right" layout="topleft"> Date: Fri, 5 Feb 2021 09:27:06 +0100 Subject: [PATCH 026/106] Unmaintained skin update --- indra/newview/skins/starlight/xui/en/panel_group_notices.xml | 1 + indra/newview/skins/starlightcui/xui/en/panel_group_notices.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/indra/newview/skins/starlight/xui/en/panel_group_notices.xml b/indra/newview/skins/starlight/xui/en/panel_group_notices.xml index 381bc5cc9e..b5404023d9 100644 --- a/indra/newview/skins/starlight/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/starlight/xui/en/panel_group_notices.xml @@ -44,6 +44,7 @@ Maximum 200 per group daily right="-1" name="notice_list" sort_ascending="false" + sort_lazily="true" sort_column="4" top_pad="0" width="304"> diff --git a/indra/newview/skins/starlightcui/xui/en/panel_group_notices.xml b/indra/newview/skins/starlightcui/xui/en/panel_group_notices.xml index 381bc5cc9e..b5404023d9 100644 --- a/indra/newview/skins/starlightcui/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/starlightcui/xui/en/panel_group_notices.xml @@ -44,6 +44,7 @@ Maximum 200 per group daily right="-1" name="notice_list" sort_ascending="false" + sort_lazily="true" sort_column="4" top_pad="0" width="304"> From 3311ecbbd7d7ae38a3ace7c7736b582d8797284e Mon Sep 17 00:00:00 2001 From: Ansariel Date: Fri, 5 Feb 2021 10:02:38 +0100 Subject: [PATCH 027/106] Fix download URL --- indra/newview/skins/default/xui/da/notifications.xml | 2 +- indra/newview/skins/default/xui/de/notifications.xml | 2 +- indra/newview/skins/default/xui/en/notifications.xml | 2 +- indra/newview/skins/default/xui/es/notifications.xml | 2 +- indra/newview/skins/default/xui/fr/notifications.xml | 2 +- indra/newview/skins/default/xui/it/notifications.xml | 2 +- indra/newview/skins/default/xui/ja/notifications.xml | 2 +- indra/newview/skins/default/xui/pl/notifications.xml | 2 +- indra/newview/skins/default/xui/pt/notifications.xml | 2 +- indra/newview/skins/default/xui/ru/notifications.xml | 2 +- indra/newview/skins/default/xui/tr/notifications.xml | 2 +- indra/newview/skins/default/xui/zh/notifications.xml | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index 27e1a4cdf5..36968b04fc 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -68,7 +68,7 @@ Fejl detaljer: Beskeden kaldet '[_NAME]' blev ikke fundet i notificati - Der opstod en fejl ved opdatering af [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer. + Der opstod en fejl ved opdatering af [APP_NAME]. Please [https://www.firestormviewer.org/downloads download the latest version] of the Viewer. diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 26c5d3fb04..3fa2bfeca1 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -82,7 +82,7 @@ Fehlerdetails: The notification called '[_NAME]' was not found in noti - Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte [http://get.secondlife.com laden Sie die aktuellste Version des Viewers herunter]. + Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte [https://www.firestormviewer.org/downloads laden Sie die aktuellste Version des Viewers herunter]. diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 8abb89b6bf..6ed85b384f 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -193,7 +193,7 @@ No tutorial is currently available. icon="alertmodal.tga" name="BadInstallation" type="alertmodal"> - An error occurred while updating [APP_NAME]. Please [http://get.secondlife.com download the latest version] of the Viewer. + An error occurred while updating [APP_NAME]. Please [https://www.firestormviewer.org/downloads download the latest version] of the Viewer. fail - Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor. + Ha habido un error actualizando [APP_NAME]. Por favor, [https://www.firestormviewer.org/downloads descarga la última versión] del Visor. diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index d62f5b7ecd..d8b82fac14 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -82,7 +82,7 @@ Détails de l'erreur : La notification, appelée '[_NAME]', est i - Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez [http://get.secondlife.com télécharger la dernière version] du client. + Une erreur est survenue lors de la mise à jour de [APP_NAME]. Veuillez [https://www.firestormviewer.org/downloads télécharger la dernière version] du client. diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 368df127b7..bb3eef9f17 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -31,7 +31,7 @@ Dettagli errore: La notifica denominata '[_NAME]' non è stata trovata - Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. [http://get.secondlife.com Scarica l'ultima versione] del viewer. + Il programma [APP_NAME] ha riscontrato un'errore durante il tentativo di aggiornamento. [https://www.firestormviewer.org/downloads Scarica l'ultima versione] del viewer. Non è possibile collegarsi alla [SECOND_LIFE_GRID]. diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index d5b27a2596..5e8f9f85ef 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -81,7 +81,7 @@ - [APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [http://get.secondlife.com 最新バージョンをダウンロード] してください。 + [APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [https://www.firestormviewer.org/downloads 最新バージョンをダウンロード] してください。 diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 426da0b743..7709e87898 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -31,7 +31,7 @@ Szczegóły błędu: Błąd o nazwie '[_NAME]' nie został odnaleziony - Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę [http://get.secondlife.com odwiedzić stronę] aby ściągnąć ostatnią wersję klienta. + Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę [https://www.firestormviewer.org/downloads odwiedzić stronę] aby ściągnąć ostatnią wersję klienta. Nie można połączyć z [SECOND_LIFE_GRID]. diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 25d2ee3052..56f61724fc 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -81,7 +81,7 @@ Detalhes do erro: O aviso '[_NAME]' não foi localizado no arquivo not - Um erro ocorreu ao atualizar o [APP_NAME]. [http://get.secondlife.com Baixe a versão atual] do Visualizador. + Um erro ocorreu ao atualizar o [APP_NAME]. [https://www.firestormviewer.org/downloads Baixe a versão atual] do Visualizador. diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index fa727883d2..f6d0963f85 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -37,7 +37,7 @@ [MESSAGE] - Произошла ошибка при обновлении [APP_NAME]. [http://get.secondlife.com Загрузите последнюю версию] клиента. + Произошла ошибка при обновлении [APP_NAME]. [https://www.firestormviewer.org/downloads Загрузите последнюю версию] клиента. Не удалось подключиться к [SECOND_LIFE_GRID]. diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 8ebbd2ea6f..9d8e4f8c4a 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -82,7 +82,7 @@ Hata ayrıntıları: '[_NAME]' adlı bildirim notifications.xml içind - [APP_NAME] güncellenirken bir hata oluştu. Lütfen Görüntüleyici'nin [http://get.secondlife.com son sürümünü karşıdan yükleyin]. + [APP_NAME] güncellenirken bir hata oluştu. Lütfen Görüntüleyici'nin [https://www.firestormviewer.org/downloads son sürümünü karşıdan yükleyin]. diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index 6387ba7878..e2a959859e 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -82,7 +82,7 @@ - [APP_NAME] 更新時出錯。 請 [http://get.secondlife.com 下載] 最新版本的 Viewer。 + [APP_NAME] 更新時出錯。 請 [https://www.firestormviewer.org/downloads 下載] 最新版本的 Viewer。 From 2da8ac774b8988abc6cafa0c80135a2da99b7f21 Mon Sep 17 00:00:00 2001 From: Beq Date: Fri, 5 Feb 2021 20:29:21 +0000 Subject: [PATCH 028/106] Avoid lock silliness --- indra/llwindow/llwindowwin32.cpp | 6 +++++- indra/newview/llviewerstats.cpp | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 7d26eee5af..70072af3af 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -2006,7 +2006,11 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLongPtr( h_wnd, GWLP_USERDATA ); - bool debug_window_proc = gDebugWindowProc || debugLoggingEnabled("Window"); + // avoid unfortunate sleep during trylock by static check + // bool debug_window_proc = gDebugWindowProc || debugLoggingEnabled("Window"); + static auto debug_logging_on = debugLoggingEnabled("Window"); + bool debug_window_proc = gDebugWindowProc || debug_logging_on; + // if (NULL != window_imp) diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index a06f906762..e048947762 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -640,7 +640,11 @@ void send_viewer_stats(bool include_preferences) LL_INFOS("LogViewerStatsPacket") << "Sending viewer statistics: " << body << LL_ENDL; - if (debugLoggingEnabled("LogViewerStatsPacket")) + // avoid unfortunate sleep during trylock by static check + // if (debugLoggingEnabled("LogViewerStatsPacket")) + static auto debug_logging_on = debugLoggingEnabled("LogViewerStatsPacket"); + if (debug_logging_on) + // { std::string filename("viewer_stats_packet.xml"); llofstream of(filename.c_str()); From 03e1fef96ac948ad2f743d7d23dd826b2bafef44 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Fri, 5 Feb 2021 22:43:49 +0100 Subject: [PATCH 029/106] FIRE-30739: Better wording for notification --- indra/newview/skins/default/xui/de/notifications.xml | 2 +- indra/newview/skins/default/xui/en/notifications.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 3fa2bfeca1..372c273d04 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -82,7 +82,7 @@ Fehlerdetails: The notification called '[_NAME]' was not found in noti - Beim Aktualisieren von [APP_NAME] ist ein Fehler aufgetreten. Bitte [https://www.firestormviewer.org/downloads laden Sie die aktuellste Version des Viewers herunter]. + Installation von [APP_NAME] ist defekt. Bitte [https://www.firestormviewer.org/downloads laden Sie neue Kopie des Viewers herunter] und installieren Sie erneut. diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 6ed85b384f..b4372fbf8e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -193,7 +193,7 @@ No tutorial is currently available. icon="alertmodal.tga" name="BadInstallation" type="alertmodal"> - An error occurred while updating [APP_NAME]. Please [https://www.firestormviewer.org/downloads download the latest version] of the Viewer. + Installation of [APP_NAME] is defect. Please [https://www.firestormviewer.org/downloads download a new copy] of the Viewer and reinstall. fail Date: Fri, 5 Feb 2021 22:05:35 +0000 Subject: [PATCH 030/106] Tiny grammar fix --- indra/newview/skins/default/xui/en/notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index b4372fbf8e..4845cfc543 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -193,7 +193,7 @@ No tutorial is currently available. icon="alertmodal.tga" name="BadInstallation" type="alertmodal"> - Installation of [APP_NAME] is defect. Please [https://www.firestormviewer.org/downloads download a new copy] of the Viewer and reinstall. + Installation of [APP_NAME] is defective. Please [https://www.firestormviewer.org/downloads download a new copy] of the Viewer and reinstall. fail Date: Sat, 6 Feb 2021 02:05:22 +0100 Subject: [PATCH 031/106] FIRE-30654 Make sure that LSL Bridge won't ask for OpenCollar in public channel, for whatever reason Newest state/channel will be applied anyway after returning region URL to the viewer --- .../EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt | 9 ++++++--- indra/newview/fslslbridge.cpp | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt index 1c161565a8..9495c0dd27 100644 --- a/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt +++ b/indra/newview/fs_resources/EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt @@ -7,7 +7,7 @@ // // Bridge platform - string BRIDGE_VERSION = "2.25"; // This should match fslslbridge.cpp + string BRIDGE_VERSION = "2.26"; // This should match fslslbridge.cpp string gLatestURL; integer gViewerIsFirestorm; integer gTryHandshakeOnce = TRUE; @@ -85,8 +85,11 @@ { if (gAO_EnabledOC) { - aoListenOC(NULL_KEY, TRUE); - llWhisper(gAO_ChannelOC, "OpenCollar?"); + if (gAO_ChannelOC != PUBLIC_CHANNEL) + { + aoListenOC(NULL_KEY, TRUE); + llWhisper(gAO_ChannelOC, "OpenCollar?"); + } } else { diff --git a/indra/newview/fslslbridge.cpp b/indra/newview/fslslbridge.cpp index ad8c49cc4c..380abb2ad5 100644 --- a/indra/newview/fslslbridge.cpp +++ b/indra/newview/fslslbridge.cpp @@ -55,7 +55,7 @@ static const std::string FS_BRIDGE_FOLDER = "#LSL Bridge"; static const std::string FS_BRIDGE_CONTAINER_FOLDER = "Landscaping"; static const U32 FS_BRIDGE_MAJOR_VERSION = 2; -static const U32 FS_BRIDGE_MINOR_VERSION = 25; +static const U32 FS_BRIDGE_MINOR_VERSION = 26; static const U32 FS_MAX_MINOR_VERSION = 99; static const std::string UPLOAD_SCRIPT_CURRENT = "EBEDD1D2-A320-43f5-88CF-DD47BBCA5DFB.lsltxt"; static const std::string FS_STATE_ATTRIBUTE = "state="; From e560a4c5006e9f00e7ca8d8f52768efbe1a40fc3 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Sat, 6 Feb 2021 02:12:37 +0100 Subject: [PATCH 032/106] Updated Polish translation --- indra/newview/skins/default/xui/pl/notifications.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 7709e87898..b123b3e595 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -31,7 +31,7 @@ Szczegóły błędu: Błąd o nazwie '[_NAME]' nie został odnaleziony - Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę [https://www.firestormviewer.org/downloads odwiedzić stronę] aby ściągnąć ostatnią wersję klienta. + Instalacja [APP_NAME] jest uszkodzona. Proszę [https://www.firestormviewer.org/downloads pobrać nową kopię] przeglądarki i ponownie ją zainstalować. Nie można połączyć z [SECOND_LIFE_GRID]. From 57a1365eda9edf0400883c44771ba412146a15ac Mon Sep 17 00:00:00 2001 From: Zi Ree Date: Sun, 7 Feb 2021 00:55:12 +0100 Subject: [PATCH 033/106] FIRE-24160 FIRE-9305 Show AO enabled/disabled messages in local chat where appropriate, don't allow scripts to enable the AO when it was disabled before, scripts can only pause the AO/AO stands, not disable them for good. --- indra/newview/aoengine.cpp | 10 ++++ indra/newview/aoengine.h | 2 + .../app_settings/settings_per_account.xml | 11 ++++ indra/newview/chatbar_as_cmdline.cpp | 17 +++++- indra/newview/fslslbridge.cpp | 52 ++++++++++++++++++- .../skins/default/xui/en/notifications.xml | 15 ++++++ .../newview/skins/default/xui/en/strings.xml | 8 +++ 7 files changed, 112 insertions(+), 3 deletions(-) diff --git a/indra/newview/aoengine.cpp b/indra/newview/aoengine.cpp index 0f54723867..901a61bbf6 100644 --- a/indra/newview/aoengine.cpp +++ b/indra/newview/aoengine.cpp @@ -63,6 +63,7 @@ AOEngine::AOEngine() : { gSavedPerAccountSettings.getControl("UseAO")->getCommitSignal()->connect(boost::bind(&AOEngine::onToggleAOControl, this)); gSavedPerAccountSettings.getControl("UseAOStands")->getCommitSignal()->connect(boost::bind(&AOEngine::onToggleAOStandsControl, this)); + gSavedPerAccountSettings.getControl("PauseAO")->getCommitSignal()->connect(boost::bind(&AOEngine::onPauseAO, this)); mRegionChangeConnection = gAgent.addRegionChangedCallback(boost::bind(&AOEngine::onRegionChange, this)); } @@ -117,6 +118,15 @@ void AOEngine::onToggleAOStandsControl() enableStands(gSavedPerAccountSettings.getBOOL("UseAOStands")); } +void AOEngine::onPauseAO() +{ + // can't use mEnabled here as that gets switched over by enable() + if (gSavedPerAccountSettings.getBOOL("UseAO")) + { + enable(!gSavedPerAccountSettings.getBOOL("PauseAO")); + } +} + void AOEngine::clear(bool from_timer) { mOldSets.insert(mOldSets.end(), mSets.begin(), mSets.end()); diff --git a/indra/newview/aoengine.h b/indra/newview/aoengine.h index 2bfb85d10b..23b6dd9ba3 100644 --- a/indra/newview/aoengine.h +++ b/indra/newview/aoengine.h @@ -183,6 +183,8 @@ class AOEngine void onToggleAOControl(); void onToggleAOStandsControl(); + void onPauseAO(); + static void onNotecardLoadComplete(LLVFS* vfs, const LLUUID& assetUUID, LLAssetType::EType type, void* userdata, S32 status, LLExtStat extStatus); void parseNotecard(const char* buffer); diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index e35efe7f38..267f34b562 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -744,6 +744,17 @@ Value 0 + UseAO + + Comment + Pause the viewer side Animation Overrider + Persist + 0 + Type + Boolean + Value + 0 + UseAOStands Comment diff --git a/indra/newview/chatbar_as_cmdline.cpp b/indra/newview/chatbar_as_cmdline.cpp index c14b11162c..79015fedaf 100644 --- a/indra/newview/chatbar_as_cmdline.cpp +++ b/indra/newview/chatbar_as_cmdline.cpp @@ -16,7 +16,7 @@ * may be used to endorse or promote products derived from this * software without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS AS IS + * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS �AS IS� * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS @@ -673,13 +673,28 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge std::string status; if (i >> status) { + // send appropriate enable/disable messages to nearby chat - FIRE-24160 + bool aoWasEnabled = gSavedPerAccountSettings.getBOOL("UseAO"); + if (status == "on") { gSavedPerAccountSettings.setBOOL("UseAO", TRUE); + + // send appropriate enable/disable messages to nearby chat - FIRE-24160 + if (!aoWasEnabled) + { + report_to_nearby_chat(LLTrans::getString("FSAOEnabled")); + } } else if (status == "off") { gSavedPerAccountSettings.setBOOL("UseAO", FALSE); + + // send appropriate enable/disable messages to nearby chat - FIRE-24160 + if (aoWasEnabled) + { + report_to_nearby_chat(LLTrans::getString("FSAODisabled")); + } } else if (status == "sit") { diff --git a/indra/newview/fslslbridge.cpp b/indra/newview/fslslbridge.cpp index 380abb2ad5..9294f9850e 100644 --- a/indra/newview/fslslbridge.cpp +++ b/indra/newview/fslslbridge.cpp @@ -316,18 +316,31 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID, } if (tag == " do nothing when the FS AO is disabled + if (!gSavedPerAccountSettings.getBOOL("UseAO")) + { + return true; + } + status = true; size_t valuepos = message.find(FS_STATE_ATTRIBUTE); if (valuepos != std::string::npos) { + // send appropriate enable/disable messages to nearby chat - FIRE-24160 + bool aoWasPaused = gSavedPerAccountSettings.getBOOL("PauseAO"); + bool aoStandsWasEnabled = gSavedPerAccountSettings.getBOOL("UseAOStands"); + // + if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 2) == "on") { - gSavedPerAccountSettings.setBOOL("UseAO", TRUE); + // Pause AO via bridge instead of switch AO on or off - FIRE-9305 + gSavedPerAccountSettings.setBOOL("PauseAO", FALSE); gSavedPerAccountSettings.setBOOL("UseAOStands", TRUE); } else if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 3) == "off") { - gSavedPerAccountSettings.setBOOL("UseAO", FALSE); + // Pause AO via bridge instead of switch AO on or off - FIRE-9305 + gSavedPerAccountSettings.setBOOL("PauseAO", TRUE); } else if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 7) == "standon") { @@ -341,6 +354,41 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID, { LL_WARNS("FSLSLBridge") << "AO control - Received unknown state" << LL_ENDL; } + + // send appropriate enable/disable messages to nearby chat - FIRE-24160 + std::string aoMessage; + + if (aoWasPaused != gSavedPerAccountSettings.getBOOL("PauseAO")) + { + if (aoWasPaused) + { + aoMessage = LLTrans::getString("FSAOResumedScript"); + } + else + { + aoMessage = LLTrans::getString("FSAOPausedScript"); + } + } + + if (aoStandsWasEnabled != gSavedPerAccountSettings.getBOOL("UseAOStands")) + { + if (aoStandsWasEnabled) + { + aoMessage = LLTrans::getString("FSAOStandsPausedScript"); + } + else + { + aoMessage = LLTrans::getString("FSAOStandsResumedScript"); + } + } + + if (!aoMessage.empty()) + { + LLSD args; + args["AO_MESSAGE"] = aoMessage; + LLNotificationsUtil::add("FSAOScriptedNotification", args); + } + // } } // FIRE-962 diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 4845cfc543..be51a1d4f4 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -13609,4 +13609,19 @@ Cannot create inventory item: [NAME] type="notifytip"> Bulk import of Windlights has finished. + + + + FSAOScriptedNotification + +Firestorm Animation Overrider: [AO_MESSAGE] + + + diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 7122d13ef3..3a4ecc2b0e 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3024,6 +3024,14 @@ Your current position: [AVATAR_POS] NOTICE: One or more scripts have been added to your Firestorm bridge! If you did not expect this message, use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to re-create your bridge now. NOTICE: Bridge script is using old LSO (16 KB memory limit) instead of new Mono (64 KB memory limit) virtual machine, which creates high probability of stack-heap collision and bridge failure by running out of memory. Please use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. If you'll see this message again - please try again in a different region. + + Firestorm Animation Overrider enabled. + Firestorm Animation Overrider disabled. + Paused by scripted attachment. + Resumed by scripted attachment. + Standing animations paused by scripted attachment. + Standing animations resumed by scripted attachment. + Draw Distance Max Particles From 5ce817bc9a2e7e5c46550db5f50428d23ea35af1 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sun, 7 Feb 2021 01:38:18 +0100 Subject: [PATCH 034/106] Fix encoding disaster --- indra/newview/chatbar_as_cmdline.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/chatbar_as_cmdline.cpp b/indra/newview/chatbar_as_cmdline.cpp index 79015fedaf..04098fad54 100644 --- a/indra/newview/chatbar_as_cmdline.cpp +++ b/indra/newview/chatbar_as_cmdline.cpp @@ -16,7 +16,7 @@ * may be used to endorse or promote products derived from this * software without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS �AS IS� + * THIS SOFTWARE IS PROVIDED BY MODULAR SYSTEMS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MODULAR SYSTEMS OR CONTRIBUTORS From 31b022494710194f4f0a146ce83334528e165c61 Mon Sep 17 00:00:00 2001 From: Zi Ree Date: Sun, 7 Feb 2021 03:40:52 +0100 Subject: [PATCH 035/106] Copy paste fail - PauseAO control misnamed --- indra/newview/app_settings/settings_per_account.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 267f34b562..81ade2146d 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -744,7 +744,7 @@ Value 0 - UseAO + PauseAO Comment Pause the viewer side Animation Overrider From 1d225b82de482e413b88059669dce1c3c47c2cd9 Mon Sep 17 00:00:00 2001 From: Zi Ree Date: Sun, 7 Feb 2021 14:49:43 +0100 Subject: [PATCH 036/106] Switch back to BOOL to make windows compiler happy --- indra/newview/fslslbridge.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/newview/fslslbridge.cpp b/indra/newview/fslslbridge.cpp index 9294f9850e..60c48e3ff5 100644 --- a/indra/newview/fslslbridge.cpp +++ b/indra/newview/fslslbridge.cpp @@ -327,8 +327,9 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID, if (valuepos != std::string::npos) { // send appropriate enable/disable messages to nearby chat - FIRE-24160 - bool aoWasPaused = gSavedPerAccountSettings.getBOOL("PauseAO"); - bool aoStandsWasEnabled = gSavedPerAccountSettings.getBOOL("UseAOStands"); + // use BOOL to satisfy windows compiler + BOOL aoWasPaused = gSavedPerAccountSettings.getBOOL("PauseAO"); + BOOL aoStandsWasEnabled = gSavedPerAccountSettings.getBOOL("UseAOStands"); // if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 2) == "on") From e0be68917be6e43f2b58185bd33ce289be3a1740 Mon Sep 17 00:00:00 2001 From: Zi Ree Date: Sun, 7 Feb 2021 18:02:49 +0100 Subject: [PATCH 037/106] FIRE-24147 - Disable pose stand when the avatar is sitting to prevent animation issues --- indra/newview/app_settings/commands.xml | 1 + indra/newview/skins/default/xui/en/menu_viewer.xml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 8b3e8996e5..0995fc2bca 100644 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -509,6 +509,7 @@ execute_parameters="fs_posestand" is_running_function="Floater.IsOpen" is_running_parameters="fs_posestand" + is_enabled_function="Agent.enableFlying" /> + From 49039e66ea27e46ef2716fabc1f2231b8bca3763 Mon Sep 17 00:00:00 2001 From: Beq Date: Sun, 7 Feb 2021 17:20:15 +0000 Subject: [PATCH 038/106] Avoid AvNameCache log spam for NULL UUID --- indra/llmessage/llavatarnamecache.cpp | 7 +++++++ indra/newview/llinventorybridge.cpp | 6 +++++- indra/newview/llnotificationhandlerutil.cpp | 5 ++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index a8e9a6bd64..795860e9f7 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -632,6 +632,13 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) // returns bool specifying if av_name was filled, false otherwise bool LLAvatarNameCache::getName(const LLUUID& agent_id, LLAvatarName *av_name) { + // Avoid null entries entering NameCache + // This is a catch-all, better to avoid at call site + if( agent_id.isNull() ) + { + return false; + } + // if (mRunning) { // ...only do immediate lookups when cache is running diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index c1f6c2f167..aa37afe7eb 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -258,7 +258,11 @@ std::string LLInvFVBridge::getSearchableCreatorName() const if(item) { LLAvatarName av_name; - if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name)) + // Avoid null id requests entering name cache + // if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name)) + const auto& creatorId {item->getCreatorUUID()}; + if ( creatorId.notNull() && LLAvatarNameCache::get(creatorId, &av_name) ) + // { std::string username = av_name.getUserName(); LLStringUtil::toUpper(username); diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 4b231ca72b..3666ef7bc4 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -324,7 +324,10 @@ std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notifica from_id = notification->getPayload()["from_id"]; } LLAvatarName av_name; - if(LLAvatarNameCache::get(from_id, &av_name)) + // Avoid null UUID name cache requests + // if(LLAvatarNameCache::get(from_id, &av_name)) + if( from_id.notNull() && LLAvatarNameCache::get(from_id, &av_name) ) + // { res = av_name.getUserName(); } From b98cf495311d0d647e0af36976e0955fd7196701 Mon Sep 17 00:00:00 2001 From: Beq Date: Sun, 7 Feb 2021 17:35:55 +0000 Subject: [PATCH 039/106] Remove logging in drawpool resulting from EEP water reflection changes. There may be a better way to prevent this overhead, for now remove the logging overhead. --- indra/newview/lldrawpoolalpha.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index cc76b2e094..87bf2cb098 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -670,9 +670,12 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) U32 have_mask = params.mVertexBuffer->getTypeMask() & mask; if (have_mask != mask) { //FIXME! - LL_WARNS_ONCE() << "Missing required components, expected mask: " << mask - << " present: " << have_mask - << ". Skipping render batch." << LL_ENDL; + // Remove useless logging info from critical path (can be called many times per frame) + // TODO(Beq) Determine whether this can be intercepted earlier + // LL_WARNS_ONCE() << "Missing required components, expected mask: " << mask + // << " present: " << have_mask + // << ". Skipping render batch." << LL_ENDL; + // continue; } From 62eab88bf7d95afb6b108a656bb96918f47b071f Mon Sep 17 00:00:00 2001 From: Zi Ree Date: Sun, 7 Feb 2021 22:31:19 +0100 Subject: [PATCH 040/106] FIRE-24142 - Show number of elements in object inventory --- indra/newview/llpanelobjectinventory.cpp | 35 +++++++++++++++++-- .../newview/skins/default/xui/en/strings.xml | 5 +++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 4e37d8da59..f17700514c 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -709,12 +709,43 @@ const std::string& LLTaskCategoryBridge::getDisplayName() const if (cat) { - // Make object root folder name localizable again + // FIRE-24142 - Show number of elements in object inventory //mDisplayName.assign(cat->getName()); if (cat->getParentUUID().isNull() && cat->getName() == "Contents") { - mDisplayName.assign(LLTrans::getString("Contents")); + LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); + if (object) + { + LLInventoryObject* inventory_root = object->getInventoryRoot(); + LLInventoryObject::object_list_t contents; + + object->getInventoryContents(contents); + S32 numElements = contents.size(); + + std::string elementsString = "FSObjectInventoryNoElements"; + if (numElements == 1) + { + elementsString = "FSObjectInventoryOneElement"; + } + else + { + elementsString = "FSObjectInventoryElements"; + } + + LLSD args; + args["NUM_ELEMENTS"] = numElements; + mDisplayName.assign(llformat("%s (%s)", + LLTrans::getString("Contents").c_str(), + LLTrans::getString(elementsString, args).c_str())); + } + // fallback in case something goes wrong with finding the inventory object + else + { + // Make object root folder name localizable again + mDisplayName.assign(LLTrans::getString("Contents")); + } } + // else { mDisplayName.assign(cat->getName()); diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 3a4ecc2b0e..bc1b95c6c9 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3208,4 +3208,9 @@ Your current position: [AVATAR_POS] L$[COST] Importing Windlights... + + + No Elements + 1 Element + [NUM_ELEMENTS] Elements From 83be65c8ee769be81f11d330e83fc7a867287309 Mon Sep 17 00:00:00 2001 From: Liny Date: Sun, 7 Feb 2021 20:59:48 -0800 Subject: [PATCH 041/106] Remove unused variable that caused windows to complain. --- indra/newview/llpanelobjectinventory.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index f17700514c..799e0fb412 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -716,7 +716,6 @@ const std::string& LLTaskCategoryBridge::getDisplayName() const LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID()); if (object) { - LLInventoryObject* inventory_root = object->getInventoryRoot(); LLInventoryObject::object_list_t contents; object->getInventoryContents(contents); From 95f6476c267840256ccfdaaa51ab698b7e73570f Mon Sep 17 00:00:00 2001 From: Ansariel Date: Mon, 8 Feb 2021 10:49:40 +0100 Subject: [PATCH 042/106] Replace some hardcoded viewer names with substitution --- .../newview/skins/default/xui/en/strings.xml | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index bc1b95c6c9..1a00dcbbae 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1244,10 +1244,10 @@ If you continue to receive this message, please contact Second Life support for This resident has turned on Unavailable mode and will see your message later. - The Resident you messaged has activated Firestorm viewer's 'autorespond mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing. - The Resident you messaged has activated Firestorm viewer's 'autorespond mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing. - The Resident you messaged has activated Firestorm viewer's 'reject all teleport offers and requests mode' which means they have requested not to be disturbed with teleport offers and requests. You may still send an IM message manually. - The Resident you messaged has activated Firestorm viewer's 'reject all friendship requests mode' which means they have requested not to be disturbed with friendship requests. You may still send an IM message manually. + The Resident you messaged has activated [APP_NAME] viewer's 'autorespond mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing. + The Resident you messaged has activated [APP_NAME] viewer's 'autorespond mode' which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing. + The Resident you messaged has activated [APP_NAME] viewer's 'reject all teleport offers and requests mode' which means they have requested not to be disturbed with teleport offers and requests. You may still send an IM message manually. + The Resident you messaged has activated [APP_NAME] viewer's 'reject all friendship requests mode' which means they have requested not to be disturbed with friendship requests. You may still send an IM message manually. The Resident you messaged has blocked you from sending them any messages. The Resident you messaged is currently away from keyboard. Your message will still be shown in their IM panel for later viewing. @@ -2980,19 +2980,19 @@ and report the problem. Ultra (7/7) Unknown, beyond the normal range, check RenderQualityPerformance debug setting - Firestorm cannot create the LSL bridge if "Enable LSL-Client Bridge" is disabled in Preferences. - Firestorm could not create an LSL bridge. Please enable your library and relog. + [APP_NAME] cannot create the LSL bridge if "Enable LSL-Client Bridge" is disabled in Preferences. + [APP_NAME] could not create an LSL bridge. Please enable your library and relog. Bridge creation in process, cannot start another. Please wait a few minutes before trying again. Creating the bridge. This might take a moment, please wait. Bridge not created. The bridge script could not be created. - Bridge not created. The bridge is named incorrectly. Please use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. - Bridge not created. The bridge couldn't be found in inventory. Please use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. - Bridge failed to attach. This is not the current bridge version. Please use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. - Bridge failed to attach. The bridge wasn't found in the right inventory location. Please use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. - Bridge failed to attach. Something else was using the bridge attachment point. Please use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. + Bridge not created. The bridge is named incorrectly. Please use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. + Bridge not created. The bridge couldn't be found in inventory. Please use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. + Bridge failed to attach. This is not the current bridge version. Please use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. + Bridge failed to attach. The bridge wasn't found in the right inventory location. Please use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. + Bridge failed to attach. Something else was using the bridge attachment point. Please use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. The bridge object could not be found. Cannot proceed with its creation, exiting. The bridge inventory contains unexpected items. - The bridge has not finished creating, you may need to use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate it before using. + The bridge has not finished creating, you may need to use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate it before using. Bridge detached. Bridge created. Script info: '[OBJECT_NAME]': [[OBJECT_RUNNING_SCRIPT_COUNT]/[OBJECT_TOTAL_SCRIPT_COUNT]] running scripts, [OBJECT_SCRIPT_MEMORY] KB allowed memory size limit, [OBJECT_SCRIPT_TIME] ms of CPU time consumed.[PATHFINDING_TEXT] @@ -3021,12 +3021,12 @@ Your current position: [AVATAR_POS] Script info: Object to check is invalid or out of range. Script info: Received malformed response from bridge. Try again. - NOTICE: One or more scripts have been added to your Firestorm bridge! If you did not expect this message, use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to re-create your bridge now. - NOTICE: Bridge script is using old LSO (16 KB memory limit) instead of new Mono (64 KB memory limit) virtual machine, which creates high probability of stack-heap collision and bridge failure by running out of memory. Please use the Firestorm 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. If you'll see this message again - please try again in a different region. + NOTICE: One or more scripts have been added to your [APP_NAME] bridge! If you did not expect this message, use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to re-create your bridge now. + NOTICE: Bridge script is using old LSO (16 KB memory limit) instead of new Mono (64 KB memory limit) virtual machine, which creates high probability of stack-heap collision and bridge failure by running out of memory. Please use the [APP_NAME] 'Avatar/Avatar Health/Recreate Bridge' menu option to recreate the bridge. If you'll see this message again - please try again in a different region. - Firestorm Animation Overrider enabled. - Firestorm Animation Overrider disabled. + [APP_NAME] Animation Overrider enabled. + [APP_NAME] Animation Overrider disabled. Paused by scripted attachment. Resumed by scripted attachment. Standing animations paused by scripted attachment. @@ -3190,7 +3190,7 @@ Your current position: [AVATAR_POS] Noto Sans Celestia Medium Redux Unknown Mode - Firestorm + [APP_NAME] Phoenix [VIEWER_GENERATION] Hybrid From 76b963a2eef6b72f1c07f8e83916295b88838d3e Mon Sep 17 00:00:00 2001 From: Ansariel Date: Mon, 8 Feb 2021 10:49:56 +0100 Subject: [PATCH 043/106] Update German translation --- .../newview/skins/default/xui/de/strings.xml | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index fe60ca8beb..da1e977f14 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -2770,16 +2770,16 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo Dieser Einwohner hat den Nicht-stören-Modus aktiviert und wird Ihre Nachricht später sehen. - Dieser Einwohner hat den Firestorm-Viewer-Modus „Automatische Antwort“ aktiviert. Dies bedeutet, dass er nicht gestört werden möchte. Er wird Ihre Nachricht später sehen. + Dieser Einwohner hat den [APP_NAME]-Viewer-Modus „Automatische Antwort“ aktiviert. Dies bedeutet, dass er nicht gestört werden möchte. Er wird Ihre Nachricht später sehen. - Dieser Einwohner hat den Firestorm-Viewer-Modus „Automatische Antwort“ aktiviert. Dies bedeutet, dass er nicht gestört werden möchte. Er wird Ihre Nachricht später sehen. + Dieser Einwohner hat den [APP_NAME]-Viewer-Modus „Automatische Antwort“ aktiviert. Dies bedeutet, dass er nicht gestört werden möchte. Er wird Ihre Nachricht später sehen. - Dieser Einwohner hat den Firestorm-Viewer-Modus „Teleport-Angebote und -Anforderungen abweisen“ aktiviert. Dies bedeutet, dass er nicht mit Teleport-Angeboten oder -Anforderungen gestört werden möchte. Sie können Ihm weiterhin eine Nachricht senden. + Dieser Einwohner hat den [APP_NAME]-Viewer-Modus „Teleport-Angebote und -Anforderungen abweisen“ aktiviert. Dies bedeutet, dass er nicht mit Teleport-Angeboten oder -Anforderungen gestört werden möchte. Sie können Ihm weiterhin eine Nachricht senden. - Dieser Einwohner hat den Firestorm-Viewer-Modus „Alle Freundschaftsanfragen abweisen“ aktiviert. Dies bedeutet, dass er nicht mit Freundschaftsanfragen gestört werden möchte. Sie können Ihm weiterhin eine Nachricht senden. + Dieser Einwohner hat den [APP_NAME]-Viewer-Modus „Alle Freundschaftsanfragen abweisen“ aktiviert. Dies bedeutet, dass er nicht mit Freundschaftsanfragen gestört werden möchte. Sie können Ihm weiterhin eine Nachricht senden. Dieser Einwohner hat den Empfang Ihrer Nachrichten blockiert. @@ -6692,10 +6692,10 @@ Support-Bereich der Website Secondlife.com und melden Sie das Problem. Unbekannt; Bitte die Debugeinstellung RenderQualityPerformance prüfen! - Firestorm kann die LSL-Brücke nicht erstellen, wenn „LSL-Client-Brücke aktivieren“ in den Einstellungen deaktiviert ist. + [APP_NAME] kann die LSL-Brücke nicht erstellen, wenn „LSL-Client-Brücke aktivieren“ in den Einstellungen deaktiviert ist. - Firestorm konnte die LSL-Brücke nicht erstellen. Bitte die Bibliothek aktivieren und neu einloggen. + [APP_NAME] konnte die LSL-Brücke nicht erstellen. Bitte die Bibliothek aktivieren und neu einloggen. LSL-Brücke wird bereits erstellt. Bitte einige Minuten vor einem erneuten Versuch warten. @@ -6771,10 +6771,29 @@ Ihre aktuelle Position: [AVATAR_POS] Skript-Info: Fehlerhafte Antwort von LSL-Brücke erhalten. Bitte erneut versuchen. - HINWEIS: Ein oder mehrere Skripte wurden zur Firestorm-LSL-Brücke hinzugefügt! Falls dieser Hinweis unerwartet aufgetreten ist, bitte die LSL-Brücke über die Menü-Option „Avatar“ > „Avatar-Befinden“ > „LSL-Brücke neu erstellen“ neu erstellen. + HINWEIS: Ein oder mehrere Skripte wurden zur [APP_NAME]-LSL-Brücke hinzugefügt! Falls dieser Hinweis unerwartet aufgetreten ist, bitte die LSL-Brücke über die Menü-Option „Avatar“ > „Avatar-Befinden“ > „LSL-Brücke neu erstellen“ neu erstellen. - HINWEIS: Das Skript der Firestorm-LSL-Brücke verwendet die alte LSO Virtuelle Maschine (16 KB Speicherlimit) anstelle von Mono (64 KB Speicherlimit), wodurch eine hohe Wahrscheinlichkeit von Stack-Heap-Collisions und Fehlern aufgrund von nicht mehr verfügbarem Speicher besteht! Bitte die LSL-Brücke über die Menü-Option „Avatar“ > „Avatar-Befinden“ > „LSL-Brücke neu erstellen“ neu erstellen. Falls dieser Hinweis erneut angezeigt wurde, bitte die Brücke in einer anderen Region neu erstellen. + HINWEIS: Das Skript der [APP_NAME]-LSL-Brücke verwendet die alte LSO Virtuelle Maschine (16 KB Speicherlimit) anstelle von Mono (64 KB Speicherlimit), wodurch eine hohe Wahrscheinlichkeit von Stack-Heap-Collisions und Fehlern aufgrund von nicht mehr verfügbarem Speicher besteht! Bitte die LSL-Brücke über die Menü-Option „Avatar“ > „Avatar-Befinden“ > „LSL-Brücke neu erstellen“ neu erstellen. Falls dieser Hinweis erneut angezeigt wurde, bitte die Brücke in einer anderen Region neu erstellen. + + + + [APP_NAME] Animation Overrider aktiviert. + + + [APP_NAME] Animation Overrider deaktiviert. + + + Pausiert durch geskripteten Anhang. + + + Fortgesetzt durch geskripteten Anhang. + + + Stand-Animationen pausiert durch geskripteten Anhang. + + + Stand-Animationen fortgesetzt durch geskripteten Anhang. @@ -7147,4 +7166,13 @@ Ihre aktuelle Position: [AVATAR_POS] Importiere Windlight... + + Keine Elemente + + + 1 Element + + + [NUM_ELEMENTS] Elemente + From 18e3791bb2faae559483fff7073b97787e59283f Mon Sep 17 00:00:00 2001 From: Beq Date: Mon, 8 Feb 2021 14:51:37 +0000 Subject: [PATCH 044/106] FIRE-30559 Preview texture priority handling to give better response --- indra/newview/llpreviewtexture.cpp | 10 +- indra/newview/llviewertexture.cpp | 2 + indra/newview/llviewertexturelist.cpp | 346 ++++++++++++++++++-------- indra/newview/llviewertexturelist.h | 16 +- 4 files changed, 264 insertions(+), 110 deletions(-) diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index b162afddf0..808d218e8e 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -1006,9 +1006,13 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) void LLPreviewTexture::loadAsset() { - mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - mImageOldBoostLevel = mImage->getBoostLevel(); - mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); + // FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) + // mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + // mImageOldBoostLevel = mImage->getBoostLevel(); + // mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); + mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_PREVIEW, LLViewerTexture::LOD_TEXTURE); + mImageOldBoostLevel = LLGLTexture::BOOST_NONE; + // mImage->forceToSaveRawImage(0) ; // texture comment decoder mImage->setLoadedCallback(LLPreviewTexture::onTextureLoaded, 0, TRUE, FALSE, this, &mCallbackTextureList); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 3cd7ccd3ee..16611734c2 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1696,6 +1696,8 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) mNeedsAux = FALSE; destroyRawImage(); } + // FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) + gTextureList.recalcImageDecodePriority(this); return res; } diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 88777fbc15..1718435225 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -710,6 +710,8 @@ void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image, ETexListTy addImageToList(new_image); mUUIDMap[key] = new_image; new_image->setTextureListType(tex_type); + // FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) + gTextureList.recalcImageDecodePriority(new_image); } @@ -721,6 +723,9 @@ void LLViewerTextureList::deleteImage(LLViewerFetchedTexture *image) { mCallbackList.erase(image); } + // FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) + mImagesWithChangedPriorities.erase(image); + LLTextureKey key(image->getID(), (ETexListType)image->getTextureListType()); llverify(mUUIDMap.erase(key) == 1); sNumImages--; @@ -855,121 +860,252 @@ void LLViewerTextureList::clearFetchingRequests() } } +// FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) +// NOTE: previous version retained as single block comment, changes extend to the end of updateOneImageDecodePriority +// void LLViewerTextureList::updateImagesDecodePriorities() +// { +// // Update the decode priority for N images each frame +// { +// F32 lazy_flush_timeout = 30.f; // stop decoding +// F32 max_inactive_time = 20.f; // actually delete +// S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference + +// //reset imagep->getLastReferencedTimer() when screen is showing the progress view to avoid removing pre-fetched textures too soon. +// bool reset_timer = gViewerWindow->getProgressView()->getVisible(); + +// static const S32 MAX_PRIO_UPDATES = gSavedSettings.getS32("TextureFetchUpdatePriorities"); // default: 32 +// const size_t max_update_count = llmin((S32) (MAX_PRIO_UPDATES*MAX_PRIO_UPDATES*gFrameIntervalSeconds.value()) + 1, MAX_PRIO_UPDATES); +// S32 update_counter = llmin(max_update_count, mUUIDMap.size()); +// uuid_map_t::iterator iter = mUUIDMap.upper_bound(mLastUpdateKey); +// while ((update_counter-- > 0) && !mUUIDMap.empty()) +// { +// if (iter == mUUIDMap.end()) +// { +// iter = mUUIDMap.begin(); +// } +// mLastUpdateKey = iter->first; +// LLPointer imagep = iter->second; +// ++iter; // safe to increment now + +// if(imagep->isInDebug() || imagep->isUnremovable()) +// { +// update_counter--; +// continue; //is in debug, ignore. +// } + +// // +// // Flush formatted images using a lazy flush +// // +// S32 num_refs = imagep->getNumRefs(); +// if (num_refs == min_refs) +// { +// if(reset_timer) +// { +// imagep->getLastReferencedTimer()->reset(); +// } +// else if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > lazy_flush_timeout) +// { +// // Remove the unused image from the image list +// deleteImage(imagep); +// imagep = NULL; // should destroy the image +// } +// continue; +// } +// else +// { +// if(imagep->hasSavedRawImage()) +// { +// if(imagep->getElapsedLastReferencedSavedRawImageTime() > max_inactive_time) +// { +// imagep->destroySavedRawImage() ; +// } +// } + +// if(imagep->isDeleted()) +// { +// continue ; +// } +// else if(imagep->isDeletionCandidate()) +// { +// imagep->destroyTexture() ; +// continue ; +// } +// else if(imagep->isInactive()) +// { +// if(reset_timer) +// { +// imagep->getLastReferencedTimer()->reset(); +// } +// else if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > max_inactive_time) +// { +// imagep->setDeletionCandidate() ; +// } +// continue ; +// } +// else +// { +// imagep->getLastReferencedTimer()->reset(); + +// //reset texture state. +// imagep->setInactive() ; +// } +// } + +// if (!imagep->isInImageList()) +// { +// continue; +// } +// if(imagep->isInFastCacheList()) +// { +// continue; //wait for loading from the fast cache. +// } + +// imagep->processTextureStats(); +// F32 old_priority = imagep->getDecodePriority(); +// F32 old_priority_test = llmax(old_priority, 0.0f); +// F32 decode_priority = imagep->calcDecodePriority(); +// F32 decode_priority_test = llmax(decode_priority, 0.0f); +// // Ignore < 20% difference +// if ((decode_priority_test < old_priority_test * .8f) || +// (decode_priority_test > old_priority_test * 1.25f)) +// { +// mImageList.erase(imagep) ; +// imagep->setDecodePriority(decode_priority); +// mImageList.insert(imagep); +// } +// } +// } +// } + +void LLViewerTextureList::recalcImageDecodePriority(LLPointer image) +{ + mImagesWithChangedPriorities.insert(image); +} + void LLViewerTextureList::updateImagesDecodePriorities() { // Update the decode priority for N images each frame + static const S32 MAX_PRIO_UPDATES = gSavedSettings.getS32("TextureFetchUpdatePriorities"); // default: 32 + const size_t max_update_count = llmin((S32)(MAX_PRIO_UPDATES*MAX_PRIO_UPDATES*gFrameIntervalSeconds.value()) + 1, MAX_PRIO_UPDATES); + S32 update_counter = llmin(max_update_count, (mImagesWithChangedPriorities.size() + mUUIDMap.size())); + + // First, process images whose decode priorities may have changed recently + image_list_t::iterator iter2 = mImagesWithChangedPriorities.begin(); + while ((update_counter-- > 0) && (iter2 != mImagesWithChangedPriorities.end())) { - F32 lazy_flush_timeout = 30.f; // stop decoding - F32 max_inactive_time = 20.f; // actually delete - S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference + LLPointer imagep = *iter2; + iter2 = mImagesWithChangedPriorities.erase(iter2); + updateOneImageDecodePriority(imagep); + } - //reset imagep->getLastReferencedTimer() when screen is showing the progress view to avoid removing pre-fetched textures too soon. - bool reset_timer = gViewerWindow->getProgressView()->getVisible(); - - static const S32 MAX_PRIO_UPDATES = gSavedSettings.getS32("TextureFetchUpdatePriorities"); // default: 32 - const size_t max_update_count = llmin((S32) (MAX_PRIO_UPDATES*MAX_PRIO_UPDATES*gFrameIntervalSeconds.value()) + 1, MAX_PRIO_UPDATES); - S32 update_counter = llmin(max_update_count, mUUIDMap.size()); - uuid_map_t::iterator iter = mUUIDMap.upper_bound(mLastUpdateKey); - while ((update_counter-- > 0) && !mUUIDMap.empty()) + // Second, process all of the images + uuid_map_t::iterator iter = mUUIDMap.upper_bound(mLastUpdateKey); + while ((update_counter-- > 0) && !mUUIDMap.empty()) + { + if (iter == mUUIDMap.end()) { - if (iter == mUUIDMap.end()) - { - iter = mUUIDMap.begin(); - } - mLastUpdateKey = iter->first; - LLPointer imagep = iter->second; - ++iter; // safe to increment now - - if(imagep->isInDebug() || imagep->isUnremovable()) - { - update_counter--; - continue; //is in debug, ignore. - } - - // - // Flush formatted images using a lazy flush - // - S32 num_refs = imagep->getNumRefs(); - if (num_refs == min_refs) - { - if(reset_timer) - { - imagep->getLastReferencedTimer()->reset(); - } - else if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > lazy_flush_timeout) - { - // Remove the unused image from the image list - deleteImage(imagep); - imagep = NULL; // should destroy the image - } - continue; - } - else - { - if(imagep->hasSavedRawImage()) - { - if(imagep->getElapsedLastReferencedSavedRawImageTime() > max_inactive_time) - { - imagep->destroySavedRawImage() ; - } - } - - if(imagep->isDeleted()) - { - continue ; - } - else if(imagep->isDeletionCandidate()) - { - imagep->destroyTexture() ; - continue ; - } - else if(imagep->isInactive()) - { - if(reset_timer) - { - imagep->getLastReferencedTimer()->reset(); - } - else if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > max_inactive_time) - { - imagep->setDeletionCandidate() ; - } - continue ; - } - else - { - imagep->getLastReferencedTimer()->reset(); - - //reset texture state. - imagep->setInactive() ; - } - } - - if (!imagep->isInImageList()) - { - continue; - } - if(imagep->isInFastCacheList()) - { - continue; //wait for loading from the fast cache. - } - - imagep->processTextureStats(); - F32 old_priority = imagep->getDecodePriority(); - F32 old_priority_test = llmax(old_priority, 0.0f); - F32 decode_priority = imagep->calcDecodePriority(); - F32 decode_priority_test = llmax(decode_priority, 0.0f); - // Ignore < 20% difference - if ((decode_priority_test < old_priority_test * .8f) || - (decode_priority_test > old_priority_test * 1.25f)) - { - mImageList.erase(imagep) ; - imagep->setDecodePriority(decode_priority); - mImageList.insert(imagep); - } + iter = mUUIDMap.begin(); } + mLastUpdateKey = iter->first; + LLPointer imagep = iter->second; + ++iter; // safe to increment now + updateOneImageDecodePriority(imagep); } } +void LLViewerTextureList::updateOneImageDecodePriority(LLPointer imagep) +{ + const F32 lazy_flush_timeout = 30.f; // stop decoding + const F32 max_inactive_time = 20.f; // actually delete + const S32 min_refs = 3; // 1 for mImageList, 1 for mUUIDMap, 1 for local reference + + bool reset_timer = gViewerWindow->getProgressView()->getVisible(); + + if(imagep->isInDebug() || imagep->isUnremovable()) + { + return; //is in debug, ignore. + } + // + // Flush formatted images using a lazy flush + // + S32 num_refs = imagep->getNumRefs(); + if (num_refs == min_refs) + { + if(reset_timer) + { + imagep->getLastReferencedTimer()->reset(); + } + else if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > lazy_flush_timeout) + { + // Remove the unused image from the image list + deleteImage(imagep); + imagep = NULL; // should destroy the image + } + return; + } + else + { + if(imagep->hasSavedRawImage()) + { + if(imagep->getElapsedLastReferencedSavedRawImageTime() > max_inactive_time) + { + imagep->destroySavedRawImage() ; + } + } + + if(imagep->isDeleted()) + { + return; + } + else if(imagep->isDeletionCandidate()) + { + imagep->destroyTexture() ; + return; + } + else if(imagep->isInactive()) + { + if(reset_timer) + { + imagep->getLastReferencedTimer()->reset(); + } + else if (imagep->getLastReferencedTimer()->getElapsedTimeF32() > max_inactive_time) + { + imagep->setDeletionCandidate() ; + } + return; + } + else + { + imagep->getLastReferencedTimer()->reset(); + //reset texture state. + imagep->setInactive() ; + } + } + if (!imagep->isInImageList()) + { + return; + } + if(imagep->isInFastCacheList()) + { + return; //wait for loading from the fast cache. + } + + imagep->processTextureStats(); + F32 old_priority = imagep->getDecodePriority(); + F32 old_priority_test = llmax(old_priority, 0.0f); + F32 decode_priority = imagep->calcDecodePriority(); + F32 decode_priority_test = llmax(decode_priority, 0.0f); + // Ignore < 20% difference + if ((decode_priority_test < old_priority_test * .8f) || + (decode_priority_test > old_priority_test * 1.25f)) + { + mImageList.erase(imagep) ; + imagep->setDecodePriority(decode_priority); + mImageList.insert(imagep); + } +} +// FIRE-30559 + void LLViewerTextureList::setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level) { if(!tex->setDebugFetching(debug_level)) diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 6feae4d897..ca26883763 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -34,6 +34,7 @@ #include "llui.h" #include #include +#include #include "lluiimage.h" const U32 LL_IMAGE_REZ_LOSSLESS_CUTOFF = 128; @@ -147,6 +148,8 @@ public: private: void updateImagesDecodePriorities(); + // FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) + void updateOneImageDecodePriority(LLPointer imagep); F32 updateImagesCreateTextures(F32 max_time); F32 updateImagesFetchTextures(F32 max_time); void updateImagesUpdateStats(); @@ -219,7 +222,12 @@ public: // Fast cache stats static U32 sNumFastCacheReads; - + // FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) + // Recalculate the image's Decode Priority. + // (We'll get to the image eventually even if this method isn't called, but this way it goes + // to the head(-ish) of the line.) + void recalcImageDecodePriority(LLPointer image); + // private: typedef std::map< LLTextureKey, LLPointer > uuid_map_t; uuid_map_t mUUIDMap; @@ -228,7 +236,11 @@ private: typedef std::set, LLViewerFetchedTexture::Compare> image_priority_list_t; image_priority_list_t mImageList; - + // FIRE-30559 texture fetch speedup for user previews (based on patches from Oren Hurvitz) + // Images that should be handled first in updateImagesDecodePriorities() + image_list_t mImagesWithChangedPriorities; + // + // simply holds on to LLViewerFetchedTexture references to stop them from being purged too soon std::set > mImagePreloads; From ee94b3f6dbc01622b3e5ad560461ec0c2853fc39 Mon Sep 17 00:00:00 2001 From: Beq Date: Mon, 8 Feb 2021 14:57:17 +0000 Subject: [PATCH 045/106] Update contributors to include Oren Hurvitz (kitely) (FIRE-30559) --- indra/newview/skins/default/xui/en/floater_about.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 9250b08b4e..7cb03ceb21 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by: top_pad="4" width="450" wrap="true"> -Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others. +Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others. Date: Mon, 8 Feb 2021 19:37:13 +0000 Subject: [PATCH 046/106] FIRE-30701 - Transition time for EEP 'apply to myself' from inventory --- indra/newview/llinventorybridge.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index aa37afe7eb..90c0c62079 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -7817,7 +7817,9 @@ void LLSettingsBridge::performAction(LLInventoryModel* model, std::string action if (!item) return; LLUUID asset_id = item->getAssetUUID(); - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, asset_id); + // FIRE-30701 - Allow crossfade time to apply when using EEP from inventory. + // LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, asset_id); + LLEnvironment::instance().setManualEnvironment(LLEnvironment::ENV_LOCAL, asset_id); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); } else if ("apply_settings_parcel" == action) From 1287f3afa16874fd430bb6fc45ea06e55607c4a3 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Tue, 9 Feb 2021 17:36:53 +0100 Subject: [PATCH 047/106] Updated Polish translation --- .../skins/default/xui/pl/notifications.xml | 4 ++ .../newview/skins/default/xui/pl/strings.xml | 41 +++++++++++++++---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index b123b3e595..569ceced89 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -5111,4 +5111,8 @@ Pamiętaj, że nie można wybrać "otoczenia współdzielonego" i "bazowanego na Zakończył się zbiorowy import Windlightów. + + Animator Firestorma: [AO_MESSAGE] + + diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index e292f15d3a..7995b5c62c 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -2625,16 +2625,16 @@ Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą technic Rezydent, do którego wysłałeś/aś wiadomość prywatną znajduje się w trybie zajętości i nie chce, aby mu przeszkadzano. Oznacza to, iż Twoja wiadomość zostanie zapisana do przejrzenia na później. - Rezydent, do którego wysłałeś/aś wiadomość prywatną aktywował w Firestormie tryb autoodpowiedzi i nie chce, aby mu przeszkadzano. Oznacza to, iż Twoja wiadomość zostanie zapisana do przejrzenia na później. + Rezydent, do którego wysłałeś/aś wiadomość prywatną aktywował w przeglądarce [APP_NAME] tryb autoodpowiedzi i nie chce, aby mu przeszkadzano. Oznacza to, iż Twoja wiadomość zostanie zapisana do przejrzenia na później. - Rezydent, do którego wysłałeś/aś wiadomość prywatną aktywował w Firestormie tryb autoodpowiedzi i nie chce, aby mu przeszkadzano. Oznacza to, iż Twoja wiadomość zostanie zapisana do przejrzenia na później. + Rezydent, do którego wysłałeś/aś wiadomość prywatną aktywował w przeglądarce [APP_NAME] tryb autoodpowiedzi i nie chce, aby mu przeszkadzano. Oznacza to, iż Twoja wiadomość zostanie zapisana do przejrzenia na później. - Rezydent, do którego wysłałeś/aś wiadomość aktywował w Firestormie tryb odrzucania próśb oraz propozycji teleportacji i nie chce, aby mu nimi przeszkadzano. Możesz w dalszym ciągu wysłać wiadomość prywatną ręcznie. + Rezydent, do którego wysłałeś/aś wiadomość aktywował w przeglądarce [APP_NAME] tryb odrzucania próśb oraz propozycji teleportacji i nie chce, aby mu nimi przeszkadzano. Możesz w dalszym ciągu wysłać wiadomość prywatną ręcznie. - Rezydent, do którego wysłałeś/aś wiadomość aktywował w Firestormie tryb odrzucania zaproszeń do znajomych i nie chce, aby mu nimi przeszkadzano. Możesz w dalszym ciągu wysłać wiadomość prywatną ręcznie. + Rezydent, do którego wysłałeś/aś wiadomość aktywował w przeglądarce [APP_NAME] tryb odrzucania zaproszeń do znajomych i nie chce, aby mu nimi przeszkadzano. Możesz w dalszym ciągu wysłać wiadomość prywatną ręcznie. Rezydent, do którego wysłałeś/aś wiadomość zablokował Cię. @@ -5980,10 +5980,10 @@ do sekcji wsparcia witryny SecondLife.com i zgłoś problem. Nieznana, poza normalnym zakresem, sprawdź ustawienie debugowania RenderQualityPerformance - Firestorm nie może utworzyć Mostu LSL, jeśli "Włącz Most w LScript Language" jest wyłączone w Ustawieniach. + [APP_NAME] nie może utworzyć Mostu LSL, jeśli "Włącz Most w LScript Language" jest wyłączone w Ustawieniach. - Firestorm nie mógł utworzyć Mostu LSL. Włącz swoją Bibliotekę i zaloguj się ponownie. + [APP_NAME] nie mógł utworzyć Mostu LSL. Włącz swoją Bibliotekę i zaloguj się ponownie. Tworzenie Mostu LSL już trwa, nie można rozpocząć procesu budowania kolejnego. Poczekaj kilka minut, zanim spróbujesz ponownie. @@ -6059,11 +6059,29 @@ Twoja aktualna pozycja: [AVATAR_POS] Info o skryptach: Otrzymano uszkodzoną odpowiedź od Mostu LSL. Spróbuj ponownie. - UWAGA: Jeden lub więcej skryptów zostało dodanych do Twojego Mostu LSL Firestorma! Jeśli ta wiadomość jest niespodziewana, to stwórz teraz Most LSL na nowo ('Kondycja awatara' w menu 'Awatar' na górze). + UWAGA: Jeden lub więcej skryptów został dodanych do Twojego Mostu LSL! Jeśli ta wiadomość jest niespodziewana, to stwórz teraz Most LSL na nowo ('Kondycja awatara' w menu 'Awatar' na górze). UWAGA: Skrypt Mostu LSL używa starej maszyny wirtualnej LSO (16 KB limitu pamięci) zamiast nowej Mono, co stwarza wysokie prawdopodobieństwo kolizji sterty i stosu oraz awarii Mostu poprzez wyczerpanie się pamięci. Spróbuj stworzyć go na nowo ('Kondycja awatara' w menu 'Awatar' na górze). Jeśli ten komunikat pojawi się ponownie spróbuj jeszcze raz w innym regionie. + + Animator przeglądarki [APP_NAME] włączony. + + + Animator przeglądarki [APP_NAME] wyłączony. + + + Wstrzymany przez oskryptowany dodatek. + + + Wznowiony przez oskryptowany dodatek. + + + Animacje stania w miejscu wstrzymane przez oskryptowany dodatek. + + + Animacje stania w miejscu wznowione przez oskryptowany dodatek. + Pole widzenia @@ -6419,4 +6437,13 @@ Twoja aktualna pozycja: [AVATAR_POS] Importowanie Windlightów... + + Brak elementów + + + 1 element + + + [NUM_ELEMENTS] elementów + From edc771b71af2467123df28fb204c8ff8bd933b38 Mon Sep 17 00:00:00 2001 From: Zi Ree Date: Wed, 10 Feb 2021 14:36:56 +0100 Subject: [PATCH 048/106] FIRE-30725 - Add more group functions to group URL context menu --- indra/llui/fsregistrarutils.h | 7 ++- indra/llui/llscrolllistctrl.cpp | 14 +++++ indra/llui/lltextbase.cpp | 12 ++++ indra/newview/fscommon.cpp | 58 +++++++++++++++++++ indra/newview/fscommon.h | 3 + indra/newview/fsslurlcommand.cpp | 19 ++++++ .../skins/default/xui/en/menu_url_group.xml | 52 +++++++++++++++++ 7 files changed, 164 insertions(+), 1 deletion(-) diff --git a/indra/llui/fsregistrarutils.h b/indra/llui/fsregistrarutils.h index 0b8d55f247..3c5d26fa98 100644 --- a/indra/llui/fsregistrarutils.h +++ b/indra/llui/fsregistrarutils.h @@ -44,7 +44,12 @@ enum EFSRegistrarFunctionActionType FS_RGSTR_ACT_REQUEST_TELEPORT, FS_RGSTR_CHK_AVATAR_BLOCKED, FS_RGSTR_CHK_IS_SELF, - FS_RGSTR_CHK_IS_NOT_SELF + FS_RGSTR_CHK_IS_NOT_SELF, + FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA, + FS_RGSTR_CHK_HAVE_GROUP_DATA, + FS_RGSTR_CHK_CAN_LEAVE_GROUP, + FS_RGSTR_CHK_CAN_JOIN_GROUP, + FS_RGSTR_CHK_GROUP_NOT_ACTIVE }; class FSRegistrarUtils diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index cb83eda373..9cec673674 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -2114,6 +2114,20 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask) enable_registrar.add("FS.EnableViewLog", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_ACT_VIEW_TRANSCRIPT)); // + // FIRE-30725 - Add more group functions to group URL context menu + std::string uuid_str = uuid.asString(); + + registrar.add("FS.JoinGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupjoin", true)); + registrar.add("FS.LeaveGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupleave", true)); + registrar.add("FS.ActivateGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupactivate", true)); + + enable_registrar.add("FS.WaitingForGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA)); + enable_registrar.add("FS.HaveGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_HAVE_GROUP_DATA)); + enable_registrar.add("FS.EnableJoinGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_CAN_JOIN_GROUP)); + enable_registrar.add("FS.EnableLeaveGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_CAN_LEAVE_GROUP)); + enable_registrar.add("FS.EnableActivateGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_GROUP_NOT_ACTIVE)); + // + // create the context menu from the XUI file and display it std::string menu_name = is_group ? "menu_url_group.xml" : "menu_url_agent.xml"; delete mPopupMenu; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index ab40ecc0c9..2eabf5eb54 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2144,6 +2144,18 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url) enable_registrar.add("FS.EnableViewLog", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_ACT_VIEW_TRANSCRIPT)); // + // FIRE-30725 - Add more group functions to group URL context menu + registrar.add("FS.JoinGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupjoin", true)); + registrar.add("FS.LeaveGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupleave", true)); + registrar.add("FS.ActivateGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupactivate", true)); + + enable_registrar.add("FS.WaitingForGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA)); + enable_registrar.add("FS.HaveGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_HAVE_GROUP_DATA)); + enable_registrar.add("FS.EnableJoinGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_CAN_JOIN_GROUP)); + enable_registrar.add("FS.EnableLeaveGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_CAN_LEAVE_GROUP)); + enable_registrar.add("FS.EnableActivateGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_GROUP_NOT_ACTIVE)); + // + // create and return the context menu from the XUI file LLContextMenu* menu = static_cast(mPopupMenuHandle.get()); diff --git a/indra/newview/fscommon.cpp b/indra/newview/fscommon.cpp index a1bba035e0..b87fd79ef6 100644 --- a/indra/newview/fscommon.cpp +++ b/indra/newview/fscommon.cpp @@ -34,6 +34,8 @@ #include "llavataractions.h" #include "llavatarnamecache.h" #include "llfloaterperms.h" +#include "llgroupactions.h" +#include "llgroupmgr.h" #include "llinventorymodel.h" #include "lllogchat.h" #include "llmutelist.h" @@ -316,6 +318,16 @@ bool FSCommon::isLinden(const LLUUID& av_id) last_name == LL_TESTER); } +// request group data from the server if it's not already cached +bool FSCommon::requestGroupData(const LLUUID& groupID) +{ + if (LLGroupMgr::getInstance()->getGroupData(groupID) == nullptr) + { + LLGroupMgr::getInstance()->sendGroupPropertiesRequest(groupID); + return false; + } + return true; +} bool FSCommon::checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionActionType action) { @@ -373,6 +385,52 @@ bool FSCommon::checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionAct { return !isSelf; } + else if (action == FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA) + { + return !requestGroupData(av_id); + } + else if (action == FS_RGSTR_CHK_HAVE_GROUP_DATA) + { + return requestGroupData(av_id); + } + else if (action == FS_RGSTR_CHK_CAN_LEAVE_GROUP) + { + if (gAgent.getGroupID() == av_id && !RlvActions::canChangeActiveGroup()) + { + return false; + } + + return gAgent.isInGroup(av_id); + } + else if (action == FS_RGSTR_CHK_CAN_JOIN_GROUP) + { + if (!gAgent.canJoinGroups()) + { + return false; + } + + if (!RlvActions::canChangeActiveGroup()) + { + return false; + } + + LLGroupMgrGroupData* groupData = LLGroupMgr::getInstance()->getGroupData(av_id); + if (!groupData || !groupData->mOpenEnrollment) + { + return false; + } + + return !gAgent.isInGroup(av_id); + } + else if (action == FS_RGSTR_CHK_GROUP_NOT_ACTIVE) + { + if (!RlvActions::canChangeActiveGroup()) + { + return false; + } + + return (gAgent.isInGroup(av_id) && gAgent.getGroupID() != av_id); + } return false; } diff --git a/indra/newview/fscommon.h b/indra/newview/fscommon.h index be33ef6790..a7d8d350d6 100644 --- a/indra/newview/fscommon.h +++ b/indra/newview/fscommon.h @@ -78,6 +78,9 @@ namespace FSCommon */ extern S32 sObjectAddMsg; + // request group data from the server if it's not already cached + bool requestGroupData(const LLUUID& groupID); + bool checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionActionType); LLSD populateGroupCount(); diff --git a/indra/newview/fsslurlcommand.cpp b/indra/newview/fsslurlcommand.cpp index d0307b98d8..b53041d829 100644 --- a/indra/newview/fsslurlcommand.cpp +++ b/indra/newview/fsslurlcommand.cpp @@ -31,6 +31,7 @@ #include "llavataractions.h" #include "llcommandhandler.h" #include "llfloatersettingsdebug.h" +#include "llgroupactions.h" #include "lllogchat.h" #include "llnotificationsutil.h" @@ -135,6 +136,24 @@ public: return true; } + if (verb == "groupjoin") + { + LLGroupActions::join(LLUUID(target_id)); + return true; + } + + if (verb == "groupleave") + { + LLGroupActions::leave(LLUUID(target_id)); + return true; + } + + if (verb == "groupactivate") + { + LLGroupActions::activate(LLUUID(target_id)); + return true; + } + return false; } }; diff --git a/indra/newview/skins/default/xui/en/menu_url_group.xml b/indra/newview/skins/default/xui/en/menu_url_group.xml index 2cb125ce09..24da0313e5 100644 --- a/indra/newview/skins/default/xui/en/menu_url_group.xml +++ b/indra/newview/skins/default/xui/en/menu_url_group.xml @@ -11,6 +11,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + Date: Wed, 10 Feb 2021 17:07:53 +0100 Subject: [PATCH 049/106] Update German translation --- indra/newview/skins/default/xui/de/menu_url_group.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/skins/default/xui/de/menu_url_group.xml b/indra/newview/skins/default/xui/de/menu_url_group.xml index 6bd86414bc..e9a0129be1 100644 --- a/indra/newview/skins/default/xui/de/menu_url_group.xml +++ b/indra/newview/skins/default/xui/de/menu_url_group.xml @@ -1,6 +1,10 @@ + + + + From 60b55d9ee13e91c2200f19460cd3cf5d1dc95d01 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Wed, 10 Feb 2021 17:56:17 +0100 Subject: [PATCH 050/106] Updated Polish translation --- indra/newview/skins/default/xui/pl/menu_url_group.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/newview/skins/default/xui/pl/menu_url_group.xml b/indra/newview/skins/default/xui/pl/menu_url_group.xml index 61ddd37bd5..32f7bd86a3 100644 --- a/indra/newview/skins/default/xui/pl/menu_url_group.xml +++ b/indra/newview/skins/default/xui/pl/menu_url_group.xml @@ -1,6 +1,10 @@ + + + + From f531b9e51bf35a20fd7b809123a55335f00ed4e8 Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Wed, 10 Feb 2021 19:29:01 +0100 Subject: [PATCH 051/106] Updated Russian translation, by Romka Swallowtail --- .../skins/default/xui/ru/floater_joystick.xml | 27 +++++++------- .../skins/default/xui/ru/notifications.xml | 7 ++++ .../newview/skins/default/xui/ru/strings.xml | 36 +++++++++++++------ 3 files changed, 45 insertions(+), 25 deletions(-) diff --git a/indra/newview/skins/default/xui/ru/floater_joystick.xml b/indra/newview/skins/default/xui/ru/floater_joystick.xml index bf0bbf8cba..0f50433064 100644 --- a/indra/newview/skins/default/xui/ru/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ru/floater_joystick.xml @@ -1,16 +1,15 @@ - - устройство не выбрано + + никто - - - - - - - - + + + + + + + @@ -38,10 +37,10 @@ Масштаб по Z - Масштаб уклона + Масштаб наклона - Масштаб сгиба + Масштаб рыскания Масштаб вращения @@ -56,10 +55,10 @@ Невидимая зона по Z - Невид. зона уклона + Невид. зона наклона - Невид. зона сгиба + Невид. зона рыскания Невид. зона вращения diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index f6d0963f85..c9f92b0a72 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -3937,6 +3937,9 @@ URL: [AUDIOURL] - Системная память вашего компьютера не удовлетворяет минимальным требованиям. + + Не удалось запустить службу обновления [UPDATER_APP]. Убедитесь, что программа просмотра установлена правильно и имеет необходимые разрешения для запуска. Если у вас по-прежнему возникают проблемы, посетите [SUPPORT_SITE]. + Если у вас есть участок земли, вы можете сделать его своим домом (домашним местоположением). Если нет, посмотрите на карту и найдите места, подписанные "Инфохаб". @@ -5224,4 +5227,8 @@ URL: [AUDIOURL] Массовый импорт Окружающей среды завершен. + + Firestorm Animation Overrider: [AO_MESSAGE] + + diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 80df0a6de9..c1b14f96ec 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1841,7 +1841,7 @@ http://www.firestormviewer.org/support за помощь в решении эт Плата зависит от вашего уровня подписки. С подписок более высокого уровня взимаются более низкие сборы. [https://secondlife.com/my/account/membership.php? Узнать больше] - Открыть сохраненные локации + Открыть сохраненные локации Несвязанные @@ -6592,10 +6592,10 @@ http://www.firestormviewer.org/support за помощь в решении эт Неизвестное, за пределами нормального диапазона, проверьте настройки отладки RenderQualityPerformance - Firestorm не может создать мост LSL если "Активировать мост LSL" отключено в настройках. + [APP_NAME] не может создать мост LSL если "Активировать мост LSL" отключено в настройках. - Firestorm не может создать мост LSL. Пожалуйста включите библиотеку и перезайдите. + [APP_NAME] не может создать мост LSL. Пожалуйста включите библиотеку и перезайдите. Создание моста в процессе. Пожалуйста, подождите несколько минут, прежде чем пытаться снова. @@ -6607,19 +6607,19 @@ http://www.firestormviewer.org/support за помощь в решении эт Мост не создан. Скрипт моста не может быть создан. - Мост не создан. Мост назван неправильно. Используйте меню Firestorm 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. + Мост не создан. Мост назван неправильно. Используйте меню [APP_NAME] 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. - Мост не создается. Мост не найден в инвентаре. Используйте меню Firestorm 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. + Мост не создается. Мост не найден в инвентаре. Используйте меню [APP_NAME] 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. - Мост не удалось присоединить. Это не текущая версия моста. Используйте меню Firestorm 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. + Мост не удалось присоединить. Это не текущая версия моста. Используйте меню [APP_NAME] 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. - Мост не удалось присоединить. Мост не был найден в нужном месте инвентаря. Используйте меню Firestorm 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. + Мост не удалось присоединить. Мост не был найден в нужном месте инвентаря. Используйте меню [APP_NAME] 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. - Мост не удалось присоединить. Что-то еще использует место крепления моста. Используйте меню Firestorm 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. + Мост не удалось присоединить. Что-то еще использует место крепления моста. Используйте меню [APP_NAME] 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. Объект моста не найден. Невозможно приступить к его созданию. @@ -6628,7 +6628,7 @@ http://www.firestormviewer.org/support за помощь в решении эт Инвентарь моста содержит непредвиденные предметы. - Мост не закончил создание, используйте меню Firestorm 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. + Мост не закончил создание, используйте меню [APP_NAME] 'Аватар/Исправление аватара/Пересоздать LSL мост', чтобы пересоздать мост. Мост отсоединен @@ -6671,11 +6671,20 @@ ID объекта: [INSPECTING_KEY] Информация скрипта: Поступил неправильный ответ от моста. Попробуйте еще раз. - ВНИМАНИЕ: Один или несколько скриптов были добавлены в ваш мост Firestorm! Если вы не ожидали этого сообщения, воспользуйтесь параметром меню Firestorm «Аватар/ Исправление аватара/Пересоздать LSL мост», чтобы заново создать мост. + ВНИМАНИЕ: Один или несколько скриптов были добавлены в ваш мост [APP_NAME]! Если вы не ожидали этого сообщения, воспользуйтесь параметром меню [APP_NAME] «Аватар/ Исправление аватара/Пересоздать LSL мост», чтобы заново создать мост. - ВНИМАНИЕ: В скрипт моста использует старый LSO (ограничение памяти 16 КБ) вместо новой виртуальной машины Mono (ограничение памяти 64 КБ), что создает высокую вероятность коллизии стека и сбоя моста из-за нехватки памяти. Пожалуйста, используйте пункт меню Firestorm «Аватар/Исправление аватара/Пересоздать LSL мост» для воссоздания моста. Если вы снова увидите это сообщение - попробуйте еще раз в другом регионе. + ВНИМАНИЕ: В скрипт моста использует старый LSO (ограничение памяти 16 КБ) вместо новой виртуальной машины Mono (ограничение памяти 64 КБ), что создает высокую вероятность коллизии стека и сбоя моста из-за нехватки памяти. Пожалуйста, используйте пункт меню [APP_NAME] «Аватар/Исправление аватара/Пересоздать LSL мост» для воссоздания моста. Если вы снова увидите это сообщение - попробуйте еще раз в другом регионе. + + + Диспетчер анимаций [APP_NAME] включен. + Диспетчер анимаций [APP_NAME] выключен. + Приостановлено прикрепленным скриптом. + Возобновлено прикрепленным скриптом. + Стоячие анимации приостановлены прикрепленным скриптом. + Стоячие анимации возобновлены прикрепленным скриптом. + Дальность прорисовки @@ -7028,4 +7037,9 @@ ID объекта: [INSPECTING_KEY] Импорт окружающей среды ... + + + Нет элементов + 1 элемент + [NUM_ELEMENTS] элементов From 367416f9d5e1616a3040ce9715afc805e2f0dc89 Mon Sep 17 00:00:00 2001 From: Zi Ree Date: Wed, 10 Feb 2021 19:33:59 +0100 Subject: [PATCH 052/106] FIRE-30424 - Incoming Group message sound plays for muted posters --- indra/newview/llimview.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index e786192df6..c1ac3e755d 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -3177,6 +3177,14 @@ void LLIMMgr::addMessage( LL_WARNS() << "Failed to create IM session " << fixed_session_name << LL_ENDL; } } + // FIRE-30424 - Incoming Group message sound plays for muted posters + else if(LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !from_linden) + { + // if this message was from a muted resident, there is no point in playing any sounds or + // doing anything else in this function, so return right here + return; + } + // else if(!do_not_disturb && PlayModeUISndNewIncomingIMSession == 2 && dialog == IM_NOTHING_SPECIAL) { make_ui_sound("UISndNewIncomingIMSession"); From e275de5a82f8afd3b7e68e0f9e5f4764bddaddde Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Wed, 10 Feb 2021 13:39:10 +0200 Subject: [PATCH 053/106] SL-13497 Fixed error in logic --- indra/llplugin/llpluginprocessparent.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index f56a74237c..6c6f819415 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -156,9 +156,9 @@ void LLPluginProcessParent::shutdown() { EState state = (*it).second->mState; if (state != STATE_CLEANUP - || state != STATE_EXITING - || state != STATE_DONE - || state != STATE_ERROR) + && state != STATE_EXITING + && state != STATE_DONE + && state != STATE_ERROR) { (*it).second->setState(STATE_GOODBYE); } From ef95e105444f0ac90f151ea9ae83f866ef4216ab Mon Sep 17 00:00:00 2001 From: Ansariel Date: Thu, 11 Feb 2021 13:10:10 +0100 Subject: [PATCH 054/106] FIRE-30746: Fix incorrect chat toast width calculation if UI scaling is != 100%; Thank you Chorazin Allen --- indra/newview/llfloaterimnearbychathandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp index 77f0710d00..3136f96fe4 100644 --- a/indra/newview/llfloaterimnearbychathandler.cpp +++ b/indra/newview/llfloaterimnearbychathandler.cpp @@ -207,7 +207,7 @@ private: void LLFloaterIMNearbyChatScreenChannel::reshapePanel(LLFloaterIMNearbyChatToastPanel* panel) { S32 percentage = gSavedSettings.getS32("NearbyToastWidth"); - panel->reshape(gViewerWindow->getWindowWidthRaw() * percentage / 100, panel->getRect().getHeight(), TRUE); + panel->reshape(gViewerWindow->getWindowWidthScaled() * percentage / 100, panel->getRect().getHeight(), TRUE); } void LLFloaterIMNearbyChatScreenChannel::updateSize(LLRect old_world_rect, LLRect new_world_rect) From b51fb62970732181ac36a13827b6383ab5f1e8bf Mon Sep 17 00:00:00 2001 From: PanteraPolnocy Date: Thu, 11 Feb 2021 18:23:18 +0100 Subject: [PATCH 055/106] FIRE-30750 French translation update, by Laurent Bechir --- .../default/xui/fr/panel_experiences.xml | 6 +- .../default/xui/fr/panel_group_general.xml | 92 ++++++++++--------- 2 files changed, 56 insertions(+), 42 deletions(-) diff --git a/indra/newview/skins/default/xui/fr/panel_experiences.xml b/indra/newview/skins/default/xui/fr/panel_experiences.xml index b0aceb00d5..a702fd6a86 100644 --- a/indra/newview/skins/default/xui/fr/panel_experiences.xml +++ b/indra/newview/skins/default/xui/fr/panel_experiences.xml @@ -1,2 +1,6 @@ - + + + + + diff --git a/indra/newview/skins/default/xui/fr/panel_group_general.xml b/indra/newview/skins/default/xui/fr/panel_group_general.xml index 5953e210e5..e83e46ab98 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_general.xml @@ -1,7 +1,7 @@ - L'onglet Général contient les informations générales et les préférences du groupe ainsi que la liste et les options des membres. + L'onglet Général contient les informations générales et les préférences du groupe ainsi que la liste et les options des membres. Faites glisser le pointeur de la souris sur les options pour en savoir plus. @@ -11,48 +11,58 @@ Faites glisser le pointeur de la souris sur les options pour en savoir plus. Extraction des données du résident en cours - - - - Fondateur : + + + UUID du groupe : - - + +