diff options
| author | Brad Linden <46733234+brad-linden@users.noreply.github.com> | 2024-11-25 16:32:56 -0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-25 16:32:56 -0800 | 
| commit | 7ef6e8fce763eb529ed160ea4ff11e6125e32ed5 (patch) | |
| tree | 418cb2ee2f1ab54c50d2725c97eb19a9935ca38e /indra | |
| parent | feb6b39060fc88d53fe79527b6348d0448f6cfe9 (diff) | |
| parent | ff856af36c3278666ef1ad217129ea7ee2028cd8 (diff) | |
Merge pull request #3143 from secondlife/v-2768_extrafps
secondlife/viewer#2768, secondlife/viewer#2848: Partial cherry pick of "Animated pbr textures don't animate" from develop
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llvovolume.cpp | 45 | 
1 files changed, 42 insertions, 3 deletions
| diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index b234b5a9af..3ea91447cc 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -639,6 +639,15 @@ void LLVOVolume::animateTextures()                  if (!facep->mTextureMatrix)                  {                      facep->mTextureMatrix = new LLMatrix4(); +                    if (facep->getVirtualSize() > MIN_TEX_ANIM_SIZE) +                    { +                        // Fix the one edge case missed in +                        // LLVOVolume::updateTextureVirtualSize when the +                        // mTextureMatrix is not yet present +                        gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); +                        mDrawable->getSpatialGroup()->dirtyGeom(); +                        gPipeline.markRebuild(mDrawable->getSpatialGroup()); +                    }                  }                  LLMatrix4& tex_mat = *facep->mTextureMatrix; @@ -784,7 +793,24 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)          LLFace* face = mDrawable->getFace(i);          if (!face) continue;          const LLTextureEntry *te = face->getTextureEntry(); -        LLViewerTexture *imagep = face->getTexture(); +        LLViewerTexture *imagep = nullptr; +        U32 ch_min; +        U32 ch_max; +        if (!te->getGLTFRenderMaterial()) +        { +            ch_min = LLRender::DIFFUSE_MAP; +            ch_max = LLRender::SPECULAR_MAP; +        } +        else +        { +            ch_min = LLRender::BASECOLOR_MAP; +            ch_max = LLRender::EMISSIVE_MAP; +        } +        for (U32 ch = ch_min; (!imagep && ch <= ch_max); ++ch) +        { +            // Get _a_ non-null texture if possible (usually diffuse/basecolor, but could be something else) +            imagep = face->getTexture(ch); +        }          if (!imagep || !te ||              face->mExtents[0].equals3(face->mExtents[1]))          { @@ -812,12 +838,25 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)          // if the face has gotten small enough to turn off texture animation and texture          // animation is running, rebuild the render batch for this face to turn off          // texture animation +        // Do the opposite when the face gets big enough. +        // If a face is animatable, it will always have non-null mTextureMatrix +        // pointer defined after the first call to LLVOVolume::animateTextures, +        // although the animation is not always turned on.          if (face->mTextureMatrix != NULL)          { -            if ((vsize < MIN_TEX_ANIM_SIZE && old_size > MIN_TEX_ANIM_SIZE) || -                (vsize > MIN_TEX_ANIM_SIZE && old_size < MIN_TEX_ANIM_SIZE)) +            if ((vsize > MIN_TEX_ANIM_SIZE) != (old_size > MIN_TEX_ANIM_SIZE))              {                  gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD); +                // dirtyGeom+markRebuild tells the engine to call +                // LLVolumeGeometryManager::rebuildGeom, which rebuilds the +                // LLDrawInfo for the spatial group containing this LLFace, +                // safely copying the mTextureMatrix from the LLFace the the +                // LLDrawInfo. While it's not ideal to call it here, prims with +                // animated faces get moved to a smaller partition to reduce +                // side-effects of their updates (see shrinkWrap in +                // LLVOVolume::animateTextures). +                mDrawable->getSpatialGroup()->dirtyGeom(); +                gPipeline.markRebuild(mDrawable->getSpatialGroup());              }          } | 
