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
master
Brad Linden 2024-11-25 16:32:56 -08:00 committed by GitHub
commit 7ef6e8fce7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 42 additions and 3 deletions

View File

@ -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());
}
}