diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 3e22474a7..0622b579c 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -405,7 +405,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, } // Collect all of the objects - LLDynamicArray objects; + std::vector objects; root->addThisAndNonJointChildren(objects); addAsFamily(objects, add_to_end); @@ -451,7 +451,7 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const std::vector objects; + std::vector objects; //clear primary object (no primary object) mSelectedObjects->mPrimaryObject = NULL; @@ -575,7 +575,7 @@ void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_s if(!object->isSelected()) return; // Collect all of the objects, and remove them - LLDynamicArray objects; + std::vector objects; if (include_entire_object) { @@ -821,7 +821,7 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32 { // Collect all of the objects - LLDynamicArray objects; + std::vector objects; objectp = objectp->getRootEdit(); objectp->addThisAndNonJointChildren(objects); @@ -1310,7 +1310,7 @@ void LLSelectMgr::promoteSelectionToRoot() //----------------------------------------------------------------------------- void LLSelectMgr::demoteSelectionToIndividuals() { - LLDynamicArray objects; + std::vector objects; for (LLObjectSelection::root_iterator iter = getSelection()->root_begin(); iter != getSelection()->root_end(); iter++) @@ -1319,7 +1319,7 @@ void LLSelectMgr::demoteSelectionToIndividuals() object->addThisAndNonJointChildren(objects); } - if (objects.getLength()) + if (!objects.empty()) { deselectAll(); for (std::vector::iterator iter = objects.begin(); @@ -3602,7 +3602,7 @@ void LLSelectMgr::sendAttach(U8 attachment_point) { LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject(); - if (!attach_object || !gAgent.getAvatarObject() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) + if (!attach_object || !isAgentAvatarValid() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD) { return; } @@ -4886,7 +4886,7 @@ void LLSelectMgr::updateSelectionSilhouette(LLObjectSelectionHandle object_handl generateSilhouette(node, LLViewerCamera::getInstance()->getOrigin()); changed_objects.push_back(objectp); } - else if (objectp->isAttachment()) + else if (objectp->isAttachment() && objectp->getRootEdit() && objectp->getRootEdit()->mDrawable.notNull()) { //RN: hack for orthogonal projection of HUD attachments LLViewerJointAttachment* attachment_pt = (LLViewerJointAttachment*)objectp->getRootEdit()->mDrawable->getParent(); @@ -4914,9 +4914,9 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) LLGLEnable blend(GL_BLEND); LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if (for_hud && avatar) + if (isAgentAvatarValid() && for_hud) { + LLVOAvatar* avatar = gAgent.getAvatarObject(); LLBBox hud_bbox = avatar->getHUDBBox(); F32 cur_zoom = gAgent.mHUDCurZoom; @@ -5010,7 +5010,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) } } - if (for_hud && avatar) + if (isAgentAvatarValid() && for_hud) { glMatrixMode(GL_PROJECTION); glPopMatrix(); @@ -5372,7 +5372,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) if (volume) { F32 silhouette_thickness; - if (is_hud_object && gAgent.getAvatarObject()) + if (isAgentAvatarValid() && is_hud_object) { silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgent.mHUDCurZoom; } @@ -5567,7 +5567,7 @@ void LLSelectMgr::updateSelectionCenter() { mSelectedObjects->mSelectType = getSelectTypeForObject(object); - if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) + if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) { mPauseRequest = gAgent.getAvatarObject()->requestPause(); } @@ -5576,7 +5576,7 @@ void LLSelectMgr::updateSelectionCenter() mPauseRequest = NULL; } - if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject()) + if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid()) { // reset hud ZOOM gAgent.mHUDTargetZoom = 1.f; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 64e4f8cce..0aabf8269 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -578,11 +578,11 @@ void LLViewerObject::removeChild(LLViewerObject *childp) } } -void LLViewerObject::addThisAndAllChildren(LLDynamicArray& objects) +void LLViewerObject::addThisAndAllChildren(std::vector& objects) { - objects.put(this); + objects.push_back(this); for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) + iter != mChildList.end(); ++iter) { LLViewerObject* child = *iter; if (!child->isAvatar()) @@ -592,16 +592,16 @@ void LLViewerObject::addThisAndAllChildren(LLDynamicArray& obje } } -void LLViewerObject::addThisAndNonJointChildren(LLDynamicArray& objects) +void LLViewerObject::addThisAndNonJointChildren(std::vector& objects) { - objects.put(this); + objects.push_back(this); // don't add any attachments when temporarily selecting avatar if (isAvatar()) { return; } for (child_list_t::iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) + iter != mChildList.end(); ++iter) { LLViewerObject* child = *iter; if ( (!child->isAvatar()) && (!child->isJointChild())) @@ -614,7 +614,7 @@ void LLViewerObject::addThisAndNonJointChildren(LLDynamicArray& BOOL LLViewerObject::isChild(LLViewerObject *childp) const { for (child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) + iter != mChildList.end(); ++iter) { LLViewerObject* testchild = *iter; if (testchild == childp) @@ -628,7 +628,7 @@ BOOL LLViewerObject::isChild(LLViewerObject *childp) const BOOL LLViewerObject::isSeat() const { for (child_list_t::const_iterator iter = mChildList.begin(); - iter != mChildList.end(); iter++) + iter != mChildList.end(); ++iter) { LLViewerObject* child = *iter; if (child->isAvatar()) @@ -2914,7 +2914,8 @@ void LLViewerObject::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax) LLVector3 size = getScale(); newMin.setVec(center-size); newMax.setVec(center+size); - mDrawable->setPositionGroup((newMin + newMax) * 0.5f); + if(mDrawable.notNull()) + mDrawable->setPositionGroup((newMin + newMax) * 0.5f); } F32 LLViewerObject::getBinRadius() diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 1341367d0..0dc36c6c2 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -36,7 +36,6 @@ #include #include "llassetstorage.h" -#include "lldarrayptr.h" #include "llhudtext.h" #include "llhudicon.h" #include "llinventory.h" @@ -243,8 +242,8 @@ public: virtual void removeChild(LLViewerObject *childp); const_child_list_t& getChildren() const { return mChildList; } S32 numChildren() const { return mChildList.size(); } - void addThisAndAllChildren(LLDynamicArray& objects); - void addThisAndNonJointChildren(LLDynamicArray& objects); + void addThisAndAllChildren(std::vector& objects); + void addThisAndNonJointChildren(std::vector& objects); BOOL isChild(LLViewerObject *childp) const; BOOL isSeat() const; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 8965cc08f..bf819e186 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1585,7 +1585,7 @@ const LLVector3 LLVOAvatar::getRenderPosition() const { return getPositionAgent(); } - else if (isRoot()) + else if (isRoot() || !mDrawable->getParent()) { return mDrawable->getPositionAgent(); } @@ -3029,7 +3029,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) mDrawable->movePartition(); //force a move if sitting on an active object - if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive()) + if (getParent() && ((LLViewerObject*)getParent())->mDrawable.notNull() && ((LLViewerObject*) getParent())->mDrawable->isActive()) { gPipeline.markMoved(mDrawable, TRUE); } @@ -7358,7 +7358,7 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) //----------------------------------------------------------------------------- void LLVOAvatar::sitOnObject(LLViewerObject *sit_object) { - if (!mDrawable || mDrawable.isNull()) + if (!mDrawable || mDrawable.isNull() || sit_object->mDrawable.isNull()) { return; } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index bfe218d4c..ade4a343b 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -471,7 +471,7 @@ void LLVOVolume::updateTextureVirtualSize() { // Update the pixel area of all faces - if(!isVisible()) + if(!isVisible() || mDrawable.isNull()) { return; } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 21ab8e598..13a4e1cef 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1037,13 +1037,14 @@ void LLPipeline::unlinkDrawable(LLDrawable *drawable) U32 LLPipeline::addObject(LLViewerObject *vobj) { + llassert_always(vobj); if (gNoRender) { return 0; } static const LLCachedControl render_delay_creation("RenderDelayCreation",false); - if (render_delay_creation) + if (!vobj->isAvatar() && render_delay_creation) { mCreateQ.push_back(vobj); }