aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/llviewerobjectlist.cpp
diff options
context:
space:
mode:
authorJacek Antonelli2008-08-15 23:45:07 -0500
committerJacek Antonelli2008-08-15 23:45:07 -0500
commit8465910c79b8e746e04fd581cca2d60399e569b9 (patch)
treef43fec3e83c46e0d6190dca923d6fb268b52ffdd /linden/indra/newview/llviewerobjectlist.cpp
parentSecond Life viewer sources 1.18.2.1 (diff)
downloadmeta-impy-8465910c79b8e746e04fd581cca2d60399e569b9.zip
meta-impy-8465910c79b8e746e04fd581cca2d60399e569b9.tar.gz
meta-impy-8465910c79b8e746e04fd581cca2d60399e569b9.tar.bz2
meta-impy-8465910c79b8e746e04fd581cca2d60399e569b9.tar.xz
Second Life viewer sources 1.18.3.2-RC
Diffstat (limited to 'linden/indra/newview/llviewerobjectlist.cpp')
-rw-r--r--linden/indra/newview/llviewerobjectlist.cpp40
1 files changed, 31 insertions, 9 deletions
diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp
index 9f008a4..f8c20a3 100644
--- a/linden/indra/newview/llviewerobjectlist.cpp
+++ b/linden/indra/newview/llviewerobjectlist.cpp
@@ -654,13 +654,33 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
654 654
655 std::vector<LLViewerObject*> kill_list; 655 std::vector<LLViewerObject*> kill_list;
656 S32 num_active_objects = 0; 656 S32 num_active_objects = 0;
657 LLViewerObject *objectp = NULL;
657 658
659 // Make a copy of the list in case something in idleUpdate() messes with it
660 std::vector<LLViewerObject*> idle_list;
661 idle_list.reserve( mActiveObjects.size() );
662
663 for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
664 active_iter != mActiveObjects.end(); active_iter++)
665 {
666 objectp = *active_iter;
667 if (objectp)
668 {
669 idle_list.push_back( objectp );
670 }
671 else
672 { // There shouldn't be any NULL pointers in the list, but they have caused
673 // crashes before. This may be idleUpdate() messing with the list.
674 llwarns << "LLViewerObjectList::update has a NULL objectp" << llendl;
675 }
676 }
677
658 if (gSavedSettings.getBOOL("FreezeTime")) 678 if (gSavedSettings.getBOOL("FreezeTime"))
659 { 679 {
660 for (std::set<LLPointer<LLViewerObject> >::iterator iter = mActiveObjects.begin(); 680 for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin();
661 iter != mActiveObjects.end(); iter++) 681 iter != idle_list.end(); iter++)
662 { 682 {
663 LLViewerObject *objectp = *iter; 683 objectp = *iter;
664 if (objectp->getPCode() == LLViewerObject::LL_VO_CLOUDS || 684 if (objectp->getPCode() == LLViewerObject::LL_VO_CLOUDS ||
665 objectp->isAvatar()) 685 objectp->isAvatar())
666 { 686 {
@@ -670,10 +690,10 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
670 } 690 }
671 else 691 else
672 { 692 {
673 for (std::set<LLPointer<LLViewerObject> >::iterator iter = mActiveObjects.begin(); 693 for (std::vector<LLViewerObject*>::iterator idle_iter = idle_list.begin();
674 iter != mActiveObjects.end(); iter++) 694 idle_iter != idle_list.end(); idle_iter++)
675 { 695 {
676 LLViewerObject *objectp = *iter; 696 objectp = *idle_iter;
677 if (!objectp->idleUpdate(agent, world, frame_time)) 697 if (!objectp->idleUpdate(agent, world, frame_time))
678 { 698 {
679 // If Idle Update returns false, kill object! 699 // If Idle Update returns false, kill object!
@@ -684,10 +704,10 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
684 num_active_objects++; 704 num_active_objects++;
685 } 705 }
686 } 706 }
687 for (std::vector<LLViewerObject*>::iterator iter = kill_list.begin(); 707 for (std::vector<LLViewerObject*>::iterator kill_iter = kill_list.begin();
688 iter != kill_list.end(); iter++) 708 kill_iter != kill_list.end(); kill_iter++)
689 { 709 {
690 LLViewerObject *objectp = *iter; 710 objectp = *kill_iter;
691 killObject(objectp); 711 killObject(objectp);
692 } 712 }
693 } 713 }
@@ -1099,6 +1119,8 @@ U32 LLViewerObjectList::renderObjectsForSelect(LLCamera &camera, BOOL pick_parce
1099 iter != pick_drawables.end(); iter++) 1119 iter != pick_drawables.end(); iter++)
1100 { 1120 {
1101 LLDrawable* drawablep = *iter; 1121 LLDrawable* drawablep = *iter;
1122 if( !drawablep )
1123 continue;
1102 1124
1103 LLViewerObject* last_objectp = NULL; 1125 LLViewerObject* last_objectp = NULL;
1104 for (S32 face_num = 0; face_num < drawablep->getNumFaces(); face_num++) 1126 for (S32 face_num = 0; face_num < drawablep->getNumFaces(); face_num++)