LLSpatialBridge::~LLSpatialBridge() { LLSpatialGroup* group = getSpatialGroup(); if (group) { group->mSpatialPartition->remove(this, group); } }
void LLDrawable::movePartition() { LLSpatialPartition* part = getSpatialPartition(); if (part) { part->move(this, getSpatialGroup()); } }
void LLDrawable::updateDistance(LLCamera& camera, bool force_update) { if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD) { llwarns << "Attempted to update distance for non-world camera." << llendl; return; } //switch LOD with the spatial group to avoid artifacts //LLSpatialGroup* sg = getSpatialGroup(); LLVector3 pos; //if (!sg || sg->changeLOD()) { LLVOVolume* volume = getVOVolume(); if (volume) { if (getSpatialGroup()) { pos.set(getPositionGroup().getF32ptr()); } else { pos = getPositionAgent(); } if (isState(LLDrawable::HAS_ALPHA)) { for (S32 i = 0; i < getNumFaces(); i++) { LLFace* facep = getFace(i); if (force_update || facep->getPoolType() == LLDrawPool::POOL_ALPHA) { LLVector4a box; box.setSub(facep->mExtents[1], facep->mExtents[0]); box.mul(0.25f); LLVector3 v = (facep->mCenterLocal-camera.getOrigin()); const LLVector3& at = camera.getAtAxis(); for (U32 j = 0; j < 3; j++) { v.mV[j] -= box[j] * at.mV[j]; } facep->mDistance = v * camera.getAtAxis(); } } } } else { pos = LLVector3(getPositionGroup().getF32ptr()); } pos -= camera.getOrigin(); mDistanceWRTCamera = llround(pos.magVec(), 0.01f); mVObjp->updateLOD(); } }
BOOL LLDrawable::isVisible() const { if (mVisible == sCurVisible) { return TRUE; } #if 0 //disabling this code fixes DEV-20105. Leaving in place in case some other bug pops up as a a result. //should be safe to just always ask the spatial group for visibility. if (isActive()) { if (isRoot()) { LLSpatialGroup* group = mSpatialBridge.notNull() ? mSpatialBridge->getSpatialGroup() : getSpatialGroup(); if (group && group->isVisible()) { mVisible = sCurVisible; return TRUE; } } else { if (getParent()->isVisible()) { mVisible = sCurVisible; return TRUE; } } } else #endif { LLSpatialGroup* group = getSpatialGroup(); if (group && group->isVisible()) { mVisible = sCurVisible; return TRUE; } } return FALSE; }
LLSpatialBridge::~LLSpatialBridge() { LLSpatialGroup* group = getSpatialGroup(); if (group) { group->mSpatialPartition->remove(this, group); } //delete octree here so listeners will still be able to access bridge specific state destroyTree(); }
BOOL LLSpatialBridge::updateMove() { llassert_always(mDrawable); llassert_always(mDrawable->mVObjp); llassert_always(mDrawable->getRegion()); LLSpatialPartition* part = mDrawable->getRegion()->getSpatialPartition(mPartitionType); llassert_always(part); mOctree->balance(); if (part) { part->move(this, getSpatialGroup(), TRUE); } return TRUE; }
BOOL LLDrawable::isRecentlyVisible() const { //currently visible or visible in the previous frame. BOOL vis = isVisible() || (sCurVisible - mVisible < MIN_VIS_FRAME_RANGE) ; if(!vis) { LLSpatialGroup* group = getSpatialGroup(); if (group && group->isRecentlyVisible()) { mVisible = sCurVisible; vis = TRUE ; } } return vis ; }
BOOL LLSpatialBridge::updateMove() { mOctree->balance(); mDrawable->getRegion()->getSpatialPartition(mPartitionType)->move(this, getSpatialGroup(), TRUE); return TRUE; }