diff options
| author | Erik Kundiman <erik@megapahit.org> | 2026-09-01 18:35:23 +0800 |
|---|---|---|
| committer | Erik Kundiman <erik@megapahit.org> | 2026-09-04 21:58:53 +0800 |
| commit | 00bb3bb6f07660bd914d29a1389342bb3060d254 (patch) | |
| tree | 431f574922494d2201718f13085f17bc6bd7fb42 /indra/newview/lltoolmorph.cpp | |
| parent | a8636720129952c10cf49ab80da21bf8b340b96c (diff) | |
| parent | 4ef9f8f14b35ed388c294d53767a0dca0e890924 (diff) | |
Merge remote-tracking branch 'secondlife/release/26.4' into 26.4
Diffstat (limited to 'indra/newview/lltoolmorph.cpp')
| -rw-r--r-- | indra/newview/lltoolmorph.cpp | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index 8ce9a8b632..11dd26309e 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -93,6 +93,20 @@ LLVisualParamHint::LLVisualParamHint( { LLVisualParamHint::sInstances.insert( this ); mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.png"); + if (mBackgroundp) + { + LLViewerFetchedTexture* tex = dynamic_cast<LLViewerFetchedTexture*>(mBackgroundp->getImage().get()); + if (tex) + { + tex->setKnownDrawSize(width, height); + } + + mBackgroundLoadedConnection = mBackgroundp->addLoadedCallback([this]() + { + mNeedsUpdate = true; + mDelayFrames = 0; + }); + } llassert(width != 0); llassert(height != 0); @@ -104,6 +118,7 @@ LLVisualParamHint::LLVisualParamHint( LLVisualParamHint::~LLVisualParamHint() { LLVisualParamHint::sInstances.erase( this ); + mBackgroundLoadedConnection.disconnect(); } //virtual @@ -143,12 +158,21 @@ void LLVisualParamHint::requestHintUpdates( LLVisualParamHint* exception1, LLVis bool LLVisualParamHint::needsRender() { + // needsRender gets called once per frame from + // LLViewerDynamicTexture::updateAllInstances() return mNeedsUpdate && mDelayFrames-- <= 0 && !gAgentAvatarp->getIsAppearanceAnimating() && mAllowsUpdates; } void LLVisualParamHint::preRender(bool clear_depth) { - LLViewerWearable* wearable = (LLViewerWearable*)mWearablePtr; + LL_DEBUGS("ParamHint") << "preRender: param=" << mVisualParam->getName() + << " id=" << mVisualParam->getID() + << " weight=" << mVisualParamWeight + << " dirtyMesh=" << gAgentAvatarp->mDirtyMesh + << " pixelArea=" << gAgentAvatarp->mAdjustedPixelArea + << " appearanceAnimating=" << gAgentAvatarp->getIsAppearanceAnimating() + << LL_ENDL; + LLViewerWearable* wearable = dynamic_cast<LLViewerWearable*>(mWearablePtr); if (wearable) { wearable->setVolatile(true); @@ -167,6 +191,22 @@ void LLVisualParamHint::preRender(bool clear_depth) { gAgentAvatarp->updateGeometry(gAgentAvatarp->mDrawable); gAgentAvatarp->updateLOD(); + + if (gAgentAvatarp->mDrawable->isState(LLDrawable::REBUILD_GEOMETRY) + || gAgentAvatarp->mDirtyMesh > 0) + { + // updateLOD marks meshes for an update. + LL_DEBUGS("ParamHint") << "preRender: updateMeshData" + << " param=" << mVisualParam->getName() + << " dirtyMesh=" << gAgentAvatarp->mDirtyMesh + << " rebuildGeom=" << gAgentAvatarp->mDrawable->isState(LLDrawable::REBUILD_GEOMETRY) + << LL_ENDL; + // Clear states and force update so that renderSkinned inside generateImpostor + // does not re-run updateMeshData() with a partially consistent mesh state, + // which would reassign mFace pointers on some meshes while others are + // mid-draw with stale vertex offsets. + gAgentAvatarp->updateMeshData(); + } } else { @@ -246,8 +286,15 @@ bool LLVisualParamHint::render() LLViewerCamera::getInstance()->setPerspective(false, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, false); - if (gAgentAvatarp->mDrawable.notNull()) + llassert(!LLPipeline::sImpostorRender); // We are rendering this from UI, shouldn't be set + if (gAgentAvatarp->mDrawable.notNull() && !LLPipeline::sImpostorRender) { + LL_DEBUGS("ParamHint") << "render: generating impostor" + << " param=" << mVisualParam->getName() + << " drawableState=0x" << std::hex << gAgentAvatarp->mDrawable->getState() << std::dec + << " dirtyMesh=" << gAgentAvatarp->mDirtyMesh + << " mMeshValid=" << gAgentAvatarp->mMeshValid + << LL_ENDL; LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE); gGL.flush(); gGL.setSceneBlendType(LLRender::BT_REPLACE); @@ -258,7 +305,7 @@ bool LLVisualParamHint::render() gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight); - LLViewerWearable* wearable = (LLViewerWearable*)mWearablePtr; + LLViewerWearable* wearable = dynamic_cast<LLViewerWearable*>(mWearablePtr); if (wearable) { wearable->setVolatile(false); |
