summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gavriliuk <alexandrgproductengine@lindenlab.com>2023-09-25 12:29:51 +0200
committerAlexander Gavriliuk <alexandrgproductengine@lindenlab.com>2023-09-29 16:34:41 +0200
commit78f5dbd95f1295af14093807ca125b92e6f5a9d3 (patch)
treecf2b1adea0b439adebe96cad62a58e4fc1d1c743
parent72fbd0898cc8c541ffefacda2ec3465e89ba0bc4 (diff)
SL-20244 On-screen animesh characters that start pelvis offset animations disappear when root goes off-screen
-rw-r--r--indra/newview/lldrawable.cpp13
-rw-r--r--indra/newview/llspatialpartition.cpp37
-rw-r--r--indra/newview/llspatialpartition.h5
-rw-r--r--indra/newview/llvovolume.cpp22
4 files changed, 41 insertions, 36 deletions
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index bb4174d3b6..d8be4c3bd5 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -763,19 +763,6 @@ void LLDrawable::movePartition()
if (part)
{
part->move(this, getSpatialGroup());
-
- // SL-18251 "On-screen animesh characters using pelvis offset animations
- // disappear when root goes off-screen"
- //
- // Update extents of the root node when Control Avatar changes it's bounds
- if (mRenderType == LLPipeline::RENDER_TYPE_CONTROL_AV && isRoot())
- {
- LLControlAvatar* controlAvatar = dynamic_cast<LLControlAvatar*>(getVObj().get());
- if (controlAvatar && controlAvatar->mControlAVBridge)
- {
- ((LLSpatialGroup*)controlAvatar->mControlAVBridge->mOctree->getListener(0))->setState(LLViewerOctreeGroup::DIRTY);
- }
- }
}
}
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 532da98e86..a3d8986c20 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -847,6 +847,43 @@ void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* c
assert_states_valid(this);
}
+//virtual
+void LLSpatialGroup::rebound()
+{
+ if (!isDirty())
+ return;
+
+ super::rebound();
+
+ if (mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_CONTROL_AV)
+ {
+ llassert(mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_CONTROL_AV);
+
+ LLSpatialBridge* bridge = getSpatialPartition()->asBridge();
+ if (bridge &&
+ bridge->mDrawable &&
+ bridge->mDrawable->getVObj() &&
+ bridge->mDrawable->getVObj()->isRoot())
+ {
+ LLControlAvatar* controlAvatar = bridge->mDrawable->getVObj()->getControlAvatar();
+ if (controlAvatar &&
+ controlAvatar->mDrawable &&
+ controlAvatar->mControlAVBridge)
+ {
+ llassert(controlAvatar->mControlAVBridge->mOctree);
+
+ LLSpatialGroup* root = (LLSpatialGroup*)controlAvatar->mControlAVBridge->mOctree->getListener(0);
+ if (this == root)
+ {
+ const LLVector4a* addingExtents = controlAvatar->mDrawable->getSpatialExtents();
+ const LLXformMatrix* currentTransform = bridge->mDrawable->getXform();
+ expandExtents(addingExtents, *currentTransform);
+ }
+ }
+ }
+ }
+}
+
void LLSpatialGroup::destroyGL(bool keep_occlusion)
{
setState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::IMAGE_DIRTY);
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index cdb591083c..b5ac867b3e 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -205,6 +205,7 @@ public:
LL_ALIGN_PREFIX(64)
class LLSpatialGroup : public LLOcclusionCullingGroup
{
+ using super = LLOcclusionCullingGroup;
friend class LLSpatialPartition;
friend class LLOctreeStateCheck;
public:
@@ -322,6 +323,9 @@ public:
virtual void handleDestruction(const TreeNode* node);
virtual void handleChildAddition(const OctreeNode* parent, OctreeNode* child);
+ // LLViewerOctreeGroup
+ virtual void rebound();
+
public:
LL_ALIGN_16(LLVector4a mViewAngle);
LL_ALIGN_16(LLVector4a mLastUpdateViewAngle);
@@ -703,7 +707,6 @@ class LLControlAVBridge : public LLVolumeBridge
using super = LLVolumeBridge;
public:
LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regionp);
- virtual void updateSpatialExtents();
};
class LLHUDBridge : public LLVolumeBridge
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 4ddba872f1..c7054102fd 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -5110,28 +5110,6 @@ LLControlAVBridge::LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regi
mPartitionType = LLViewerRegion::PARTITION_CONTROL_AV;
}
-void LLControlAVBridge::updateSpatialExtents()
-{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
-
- LLControlAvatar* controlAvatar = getVObj()->getControlAvatar();
-
- LLSpatialGroup* root = (LLSpatialGroup*)mOctree->getListener(0);
-
- bool rootWasDirty = root->isDirty();
-
- super::updateSpatialExtents(); // root becomes non-dirty here
-
- // SL-18251 "On-screen animesh characters using pelvis offset animations
- // disappear when root goes off-screen"
- //
- // Expand extents to include Control Avatar placed outside of the bounds
- if (controlAvatar && (rootWasDirty || controlAvatar->mPlaying))
- {
- root->expandExtents(controlAvatar->mDrawable->getSpatialExtents(), *mDrawable->getXform());
- }
-}
-
bool can_batch_texture(LLFace* facep)
{
if (facep->getTextureEntry()->getBumpmap())