diff options
| author | Erik Kundiman <erik@megapahit.org> | 2025-03-29 05:50:44 +0800 | 
|---|---|---|
| committer | Erik Kundiman <erik@megapahit.org> | 2025-03-29 05:50:44 +0800 | 
| commit | 7bb1791be2a2f41a381736e3f2ca2a5ccde37063 (patch) | |
| tree | 69dc6f1edb2d37aec937c9fcb354f0bafcef26ed | |
| parent | 834b75506e78a42fcef8e4586cef9b957a1fecba (diff) | |
| parent | b7f21024384416f2491ab980ea711fa5d24b7c91 (diff) | |
Merge branch 'main' into 2025.03
| -rw-r--r-- | indra/newview/llpanelprimmediacontrols.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 60 | 
2 files changed, 61 insertions, 1 deletions
| diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index b00b9d1ad1..7b562337a3 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -777,7 +777,7 @@ void LLPanelPrimMediaControls::draw()      else if(mFadeTimer.getStarted())      {          F32 time = mFadeTimer.getElapsedTimeF32(); -        alpha *= llmax(lerp(1.0, 0.0, time / mControlFadeTime), 0.0f); +        alpha *= llmax(lerp(1.0f, 0.0f, time / mControlFadeTime), 0.0f);          if(time >= mControlFadeTime)          { diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index a4b77f031e..b40c9fa6db 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -431,6 +431,7 @@ void LLPipeline::init()      stop_glerror();      //create render pass pools +    getPool(LLDrawPool::POOL_WATEREXCLUSION);      getPool(LLDrawPool::POOL_ALPHA_PRE_WATER);      getPool(LLDrawPool::POOL_ALPHA_POST_WATER);      getPool(LLDrawPool::POOL_SIMPLE); @@ -673,6 +674,8 @@ void LLPipeline::cleanup()      // don't delete wl sky pool it was handled above in the for loop      //delete mWLSkyPool;      mWLSkyPool = NULL; +    delete mWaterExclusionPool; +    mWaterExclusionPool = nullptr;      releaseGLBuffers(); @@ -907,6 +910,15 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)          mPostMap.allocate(resX, resY, screenFormat); +        // The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes. +        // Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask. +        // Why do we do this? Because it saves us some janky logic in the exclusion shader when we generate the mask. +        // Regardless, this should always only be an R8 texture unless we choose to start having multiple kinds of exclusion that 8 bits can't handle. +        // - Geenz 2025-02-06 +        bool success = mWaterExclusionMask.allocate(resX, resY, GL_R8, true); + +        assert(success); +          // used to scale down textures          // See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown          mDownResMap.allocate(1024, 1024, GL_RGBA); @@ -1166,6 +1178,8 @@ void LLPipeline::releaseGLBuffers()      mSceneMap.release(); +    mWaterExclusionMask.release(); +      mPostMap.release();      mFXAAMap.release(); @@ -1687,6 +1701,10 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0)          poolp = mPBRAlphaMaskPool;          break; +    case LLDrawPool::POOL_WATEREXCLUSION: +        poolp = mWaterExclusionPool; +        break; +      default:          llassert(0);          LL_ERRS() << "Invalid Pool Type in  LLPipeline::findPool() type=" << type << LL_ENDL; @@ -4083,6 +4101,8 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)  #endif  } +// Render all of our geometry that's required after our deferred pass. +// This is gonna be stuff like alpha, water, etc.  void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; @@ -4101,6 +4121,10 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)      bool done_atmospherics = LLPipeline::sRenderingHUDs; //skip atmospherics on huds      bool done_water_haze = done_atmospherics; +    bool done_water_exclusion = false; + +    // do water exclusion just before water pass. +    U32 water_exclusion_pass = LLDrawPool::POOL_WATEREXCLUSION;      // do atmospheric haze just before post water alpha      U32 atmospherics_pass = LLDrawPool::POOL_ALPHA_POST_WATER; @@ -4139,6 +4163,12 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)          cur_type = poolp->getType(); +        if (cur_type >= water_exclusion_pass && !done_water_exclusion) +        { // do water exclusion against depth buffer before rendering alpha +            doWaterExclusionMask(); +            done_water_exclusion = true; +        } +          if (cur_type >= atmospherics_pass && !done_atmospherics)          { // do atmospherics against depth buffer before rendering alpha              doAtmospherics(); @@ -5254,6 +5284,17 @@ void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp )          }          break; +    case LLDrawPool::POOL_WATEREXCLUSION: +        if (mWaterExclusionPool) +        { +            llassert(0); +            LL_WARNS() << "LLPipeline::addPool(): Ignoring duplicate Water Exclusion Pool" << LL_ENDL; +        } +        else +        { +            mWaterExclusionPool = new_poolp; +        } +        break;      default:          llassert(0); @@ -5376,6 +5417,11 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )          mPBRAlphaMaskPool = NULL;          break; +    case LLDrawPool::POOL_WATEREXCLUSION: +        llassert(poolp == mWaterExclusionPool); +        mWaterExclusionPool = nullptr; +        break; +      default:          llassert(0);          LL_WARNS() << "Invalid Pool Type in  LLPipeline::removeFromQuickLookup() type=" << poolp->getType() << LL_ENDL; @@ -8877,6 +8923,7 @@ void LLPipeline::renderDeferredLighting()                            LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,                            LLPipeline::RENDER_TYPE_TERRAIN,                            LLPipeline::RENDER_TYPE_WATER, +                          LLPipeline::RENDER_TYPE_WATEREXCLUSION,                            END_RENDER_TYPES);          renderGeomPostDeferred(*LLViewerCamera::getInstance()); @@ -9015,6 +9062,8 @@ void LLPipeline::doWaterHaze()          static LLStaticHashedString above_water_str("above_water");          haze_shader.uniform1i(above_water_str, sUnderWaterRender ? -1 : 1); +        haze_shader.bindTexture(LLShaderMgr::WATER_EXCLUSIONTEX, &mWaterExclusionMask); +          if (LLPipeline::sUnderWaterRender)          {              LLGLDepthTest depth(GL_FALSE); @@ -9045,6 +9094,17 @@ void LLPipeline::doWaterHaze()      }  } +void LLPipeline::doWaterExclusionMask() +{ +    mWaterExclusionMask.bindTarget(); +    glClearColor(1, 1, 1, 1); +    mWaterExclusionMask.clear(); +    mWaterExclusionPool->render(); + +    mWaterExclusionMask.flush(); +    glClearColor(0, 0, 0, 0); +} +  void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)  {      //construct frustum | 
