diff options
author | Jacek Antonelli | 2008-08-15 23:45:07 -0500 |
---|---|---|
committer | Jacek Antonelli | 2008-08-15 23:45:07 -0500 |
commit | 8465910c79b8e746e04fd581cca2d60399e569b9 (patch) | |
tree | f43fec3e83c46e0d6190dca923d6fb268b52ffdd /linden/indra/newview/llviewerobjectlist.cpp | |
parent | Second Life viewer sources 1.18.2.1 (diff) | |
download | meta-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.cpp | 40 |
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++) |