From b582d1a9b804f47b65bca09dc320808338d7e302 Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Tue, 9 Jun 2009 01:34:48 -0700 Subject: Backported LL's version of VWR-2681 from 1.23 --- linden/indra/newview/app_settings/settings.xml | 13 +- linden/indra/newview/llfloateravatarpicker.cpp | 386 +++++++++++++-------- linden/indra/newview/llfloateravatarpicker.h | 44 +-- linden/indra/newview/llfloatergodtools.cpp | 8 +- linden/indra/newview/llglsandbox.cpp | 2 +- linden/indra/newview/llnetmap.cpp | 8 +- linden/indra/newview/llviewerobjectlist.cpp | 2 +- linden/indra/newview/llworld.cpp | 66 +++- linden/indra/newview/llworld.h | 19 +- linden/indra/newview/pipeline.cpp | 20 +- .../default/xui/en-us/floater_avatar_picker.xml | 128 +++++-- 11 files changed, 457 insertions(+), 239 deletions(-) (limited to 'linden') diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index 9a6749b..cce09e2 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -4982,7 +4982,18 @@ Boolean Value 1 - + + NearMeRange + + Comment + Search radius for nearby avatars + Persist + 1 + Type + F32 + Value + 20 + NewCacheLocation Comment diff --git a/linden/indra/newview/llfloateravatarpicker.cpp b/linden/indra/newview/llfloateravatarpicker.cpp index 97d2de9..0bdabdd 100644 --- a/linden/indra/newview/llfloateravatarpicker.cpp +++ b/linden/indra/newview/llfloateravatarpicker.cpp @@ -34,6 +34,7 @@ #include "message.h" +#include "llagent.h" #include "llbutton.h" #include "llfocusmgr.h" #include "llinventoryview.h" @@ -42,7 +43,8 @@ #include "llscrolllistctrl.h" #include "lltextbox.h" #include "lluictrlfactory.h" -#include "llagent.h" +#include "llviewercontrol.h" +#include "llworld.h" const S32 MIN_WIDTH = 200; const S32 MIN_HEIGHT = 340; @@ -58,6 +60,8 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback, BOOL allow_multiple, BOOL closeOnSelect) { + // TODO: This class should not be a singleton as it's used in multiple places + // and therefore can't be used simultaneously. -MG if (!sInstance) { sInstance = new LLFloaterAvatarPicker(); @@ -77,6 +81,7 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback, sInstance->setAllowMultiple(allow_multiple); } + sInstance->mNearMeListComplete = FALSE; sInstance->mCloseOnSelect = closeOnSelect; return sInstance; } @@ -97,39 +102,58 @@ BOOL LLFloaterAvatarPicker::postBuild() childSetAction("Find", onBtnFind, this); childDisable("Find"); + childSetAction("Refresh", onBtnRefresh, this); + childSetCommitCallback("near_me_range", onRangeAdjust, this); - mListNames = getChild("Names"); - childSetDoubleClickCallback("Names",onBtnAdd); - childSetCommitCallback("Names", onList, this); - childDisable("Names"); + childSetDoubleClickCallback("SearchResults", onBtnSelect); + childSetDoubleClickCallback("NearMe", onBtnSelect); + childSetCommitCallback("SearchResults", onList, this); + childSetCommitCallback("NearMe", onList, this); + childDisable("SearchResults"); - childSetAction("Select", onBtnAdd, this); + childSetAction("Select", onBtnSelect, this); childDisable("Select"); - childSetAction("Close", onBtnClose, this); + childSetAction("Cancel", onBtnClose, this); childSetFocus("Edit"); - if (mListNames) + LLPanel* search_panel = getChild("SearchPanel"); + if (search_panel) { - mListNames->addCommentText(std::string("No results")); // *TODO: Translate + // Start searching when Return is pressed in the line editor. + search_panel->setDefaultBtn("Find"); } - mInventoryPanel = getChild("Inventory Panel"); - if(mInventoryPanel) - { - mInventoryPanel->setFilterTypes(LLInventoryType::NIT_CALLCARD); - mInventoryPanel->setFollowsAll(); - mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_CALLINGCARD); - mInventoryPanel->setSelectCallback(LLFloaterAvatarPicker::onSelectionChange, this); - } - + getChild("SearchResults")->addCommentText(getString("no_results")); + + LLInventoryPanel* inventory_panel = getChild("InventoryPanel"); + inventory_panel->setFilterTypes(0x1 << LLInventoryType::IT_CALLINGCARD); + inventory_panel->setFollowsAll(); + inventory_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + inventory_panel->openDefaultFolderForType(LLAssetType::AT_CALLINGCARD); + inventory_panel->setSelectCallback(LLFloaterAvatarPicker::onCallingCardSelectionChange, this); + + childSetTabChangeCallback("ResidentChooserTabs", "SearchPanel", onTabChanged, this); + childSetTabChangeCallback("ResidentChooserTabs", "CallingCardsPanel", onTabChanged, this); + childSetTabChangeCallback("ResidentChooserTabs", "NearMePanel", onTabChanged, this); + setAllowMultiple(FALSE); return TRUE; } +void LLFloaterAvatarPicker::onTabChanged(void* userdata, bool from_click) +{ + LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; + if (!self) + { + return; + } + + self->childSetEnabled("Select", self->visibleItemsSelected()); +} + // Destroys the object LLFloaterAvatarPicker::~LLFloaterAvatarPicker() { @@ -144,22 +168,50 @@ void LLFloaterAvatarPicker::onBtnFind(void* userdata) if(self) self->find(); } -void LLFloaterAvatarPicker::onBtnAdd(void* userdata) +static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector& avatar_names, std::vector& avatar_ids) +{ + std::vector items = from->getAllSelected(); + for (std::vector::iterator iter = items.begin(); iter != items.end(); ++iter) + { + LLScrollListItem* item = *iter; + if (item->getUUID().notNull()) + { + avatar_names.push_back(item->getColumn(0)->getValue().asString()); + avatar_ids.push_back(item->getUUID()); + } + } +} + +void LLFloaterAvatarPicker::onBtnSelect(void* userdata) { LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; if(self->mCallback) { - self->mCallback(self->mAvatarNames, self->mAvatarIDs, self->mCallbackUserdata); - } - if (self->mInventoryPanel) - { - self->mInventoryPanel->setSelection(LLUUID::null, FALSE); - } - if (self->mListNames) - { - self->mListNames->deselectAllItems(TRUE); + LLPanel* active_panel = self->childGetVisibleTab("ResidentChooserTabs"); + + if(active_panel == self->getChild("CallingCardsPanel")) + { + self->mCallback(self->mSelectedInventoryAvatarNames, self->mSelectedInventoryAvatarIDs, self->mCallbackUserdata); + } + else if(active_panel == self->getChild("SearchPanel")) + { + std::vector avatar_names; + std::vector avatar_ids; + getSelectedAvatarData(self->getChild("SearchResults"), avatar_names, avatar_ids); + self->mCallback(avatar_names, avatar_ids, self->mCallbackUserdata); + } + else if(active_panel == self->getChild("NearMePanel")) + { + std::vector avatar_names; + std::vector avatar_ids; + getSelectedAvatarData(self->getChild("NearMe"), avatar_names, avatar_ids); + self->mCallback(avatar_names, avatar_ids, self->mCallbackUserdata); + } } + self->getChild("InventoryPanel")->setSelection(LLUUID::null, FALSE); + self->getChild("SearchResults")->deselectAllItems(TRUE); + self->getChild("NearMe")->deselectAllItems(TRUE); if(self->mCloseOnSelect) { self->mCloseOnSelect = FALSE; @@ -167,68 +219,61 @@ void LLFloaterAvatarPicker::onBtnAdd(void* userdata) } } +void LLFloaterAvatarPicker::onBtnRefresh(void* userdata) +{ + LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; + if (!self) + { + return; + } + + self->getChild("NearMe")->deleteAllItems(); + self->getChild("NearMe")->addCommentText(self->getString("searching")); + self->mNearMeListComplete = FALSE; +} + void LLFloaterAvatarPicker::onBtnClose(void* userdata) { LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; if(self) self->close(); } +void LLFloaterAvatarPicker::onRangeAdjust(LLUICtrl* source, void* data) +{ + LLFloaterAvatarPicker::onBtnRefresh(data); +} + void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata) { LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; - if (!self) - { - return; - } - - self->mAvatarIDs.clear(); - self->mAvatarNames.clear(); - - if (!self->mListNames) - { - return; - } - - std::vector items = - self->mListNames->getAllSelected(); - for ( - std::vector::iterator iter = items.begin(); - iter != items.end(); - ++iter) + if (self) { - LLScrollListItem* item = *iter; - self->mAvatarNames.push_back(item->getColumn(0)->getValue().asString()); - self->mAvatarIDs.push_back(item->getUUID()); - self->childSetEnabled("Select", TRUE); + self->childSetEnabled("Select", self->visibleItemsSelected()); } } // static callback for inventory picker (select from calling cards) -void LLFloaterAvatarPicker::onSelectionChange(const std::deque &items, BOOL user_action, void* data) +void LLFloaterAvatarPicker::onCallingCardSelectionChange(const std::deque &items, BOOL user_action, void* data) { LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)data; if (self) { - self->doSelectionChange( items, user_action, data ); + self->doCallingCardSelectionChange( items, user_action, data ); } } // Callback for inventory picker (select from calling cards) -void LLFloaterAvatarPicker::doSelectionChange(const std::deque &items, BOOL user_action, void* data) +void LLFloaterAvatarPicker::doCallingCardSelectionChange(const std::deque &items, BOOL user_action, void* data) { - if (!mListNames) + bool panel_active = (childGetVisibleTab("ResidentChooserTabs") == getChild("CallingCardsPanel")); + + mSelectedInventoryAvatarIDs.clear(); + mSelectedInventoryAvatarNames.clear(); + + if (panel_active) { - return; - } - - std::vector search_items = mListNames->getAllSelected(); - if ( search_items.size() == 0 ) - { // Nothing selected in the search results - mAvatarIDs.clear(); - mAvatarNames.clear(); childSetEnabled("Select", FALSE); } - BOOL first_calling_card = TRUE; std::deque::const_iterator item_it; for (item_it = items.begin(); item_it != items.end(); ++item_it) @@ -237,26 +282,97 @@ void LLFloaterAvatarPicker::doSelectionChange(const std::dequegetInventoryType() == LLInventoryType::IT_CALLINGCARD) { LLInventoryItem* item = gInventory.getItem(listenerp->getUUID()); - if (item) { - if ( first_calling_card ) - { // Have a calling card selected, so clear anything from the search panel - first_calling_card = FALSE; - mAvatarIDs.clear(); - mAvatarNames.clear(); - mListNames->deselectAllItems(); - } - - // Add calling card info to the selected avatars - mAvatarIDs.push_back(item->getCreatorUUID()); - mAvatarNames.push_back(listenerp->getName()); - childSetEnabled("Select", TRUE); + mSelectedInventoryAvatarIDs.push_back(item->getCreatorUUID()); + mSelectedInventoryAvatarNames.push_back(listenerp->getName()); } } } + + if (panel_active) + { + childSetEnabled("Select", visibleItemsSelected()); + } } +void LLFloaterAvatarPicker::populateNearMe() +{ + BOOL all_loaded = TRUE; + BOOL empty = TRUE; + LLScrollListCtrl* near_me_scroller = getChild("NearMe"); + near_me_scroller->deleteAllItems(); + + std::vector avatar_ids; + LLWorld::getInstance()->getAvatars(&avatar_ids, NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange")); + for(U32 i=0; igetFullName(av, fullname)) + { + element["columns"][0]["value"] = LLCacheName::getDefaultName(); + all_loaded = FALSE; + } + else + { + element["columns"][0]["value"] = fullname; + } + near_me_scroller->addElement(element); + empty = FALSE; + } + + if (empty) + { + childDisable("NearMe"); + childDisable("Select"); + near_me_scroller->addCommentText(getString("no_one_near")); + } + else + { + childEnable("NearMe"); + childEnable("Select"); + near_me_scroller->selectFirstItem(); + onList(near_me_scroller, this); + near_me_scroller->setFocus(TRUE); + } + + if (all_loaded) + { + mNearMeListComplete = TRUE; + } +} + +void LLFloaterAvatarPicker::draw() +{ + LLFloater::draw(); + if (!mNearMeListComplete && childGetVisibleTab("ResidentChooserTabs") == getChild("NearMePanel")) + { + populateNearMe(); + } +} + +BOOL LLFloaterAvatarPicker::visibleItemsSelected() const +{ + LLPanel* active_panel = childGetVisibleTab("ResidentChooserTabs"); + + if(active_panel == getChild("SearchPanel")) + { + return getChild("SearchResults")->getFirstSelectedIndex() >= 0; + } + else if(active_panel == getChild("CallingCardsPanel")) + { + return mSelectedInventoryAvatarIDs.size() > 0; + } + else if(active_panel == getChild("NearMePanel")) + { + return getChild("NearMe")->getFirstSelectedIndex() >= 0; + } + return FALSE; +} void LLFloaterAvatarPicker::find() { @@ -276,11 +392,8 @@ void LLFloaterAvatarPicker::find() gAgent.sendReliableMessage(); - if (mListNames) - { - mListNames->deleteAllItems(); - mListNames->addCommentText(std::string("Searching...")); // *TODO: Translate - } + getChild("SearchResults")->deleteAllItems(); + getChild("SearchResults")->addCommentText(getString("searching")); childSetEnabled("Select", FALSE); mResultsReturned = FALSE; @@ -288,15 +401,9 @@ void LLFloaterAvatarPicker::find() void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple) { - mAllowMultiple = allow_multiple; - if (mInventoryPanel) - { - mInventoryPanel->setAllowMultiSelect(mAllowMultiple); - } - if (mListNames) - { - mListNames->setAllowMultipleSelection(mAllowMultiple); - } + getChild("SearchResults")->setAllowMultipleSelection(allow_multiple); + getChild("InventoryPanel")->setAllowMultiSelect(allow_multiple); + getChild("NearMe")->setAllowMultipleSelection(allow_multiple); } // static @@ -324,52 +431,48 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* return; } - if (!self->mResultsReturned) - { - // clear "Searching" label on first results - if (self->mListNames) - { - self->mListNames->deleteAllItems(); - } - } + LLScrollListCtrl* search_results = self->getChild("SearchResults"); + + // clear "Searching" label on first results + search_results->deleteAllItems(); + self->mResultsReturned = TRUE; - if (self->mListNames) - { - BOOL found_one = FALSE; - S32 num_new_rows = msg->getNumberOfBlocks("Data"); - for (S32 i = 0; i < num_new_rows; i++) - { - msg->getUUIDFast( _PREHASH_Data,_PREHASH_AvatarID, avatar_id, i); - msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, first_name, i); - msg->getStringFast(_PREHASH_Data,_PREHASH_LastName, last_name, i); - - std::string avatar_name; - if (avatar_id.isNull()) - { - LLStringUtil::format_map_t map; - map["[TEXT]"] = self->childGetText("Edit"); - avatar_name = self->getString("NotFound", map); - self->mListNames->setEnabled(FALSE); - } - else - { - avatar_name = first_name + " " + last_name; - self->mListNames->setEnabled(TRUE); - found_one = TRUE; - } - LLSD element; - element["id"] = avatar_id; // value - element["columns"][0]["value"] = avatar_name; - self->mListNames->addElement(element); - } + BOOL found_one = FALSE; + S32 num_new_rows = msg->getNumberOfBlocks("Data"); + for (S32 i = 0; i < num_new_rows; i++) + { + msg->getUUIDFast( _PREHASH_Data,_PREHASH_AvatarID, avatar_id, i); + msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, first_name, i); + msg->getStringFast(_PREHASH_Data,_PREHASH_LastName, last_name, i); - if (found_one) + std::string avatar_name; + if (avatar_id.isNull()) { - self->mListNames->selectFirstItem(); - self->onList(self->mListNames, self); - self->mListNames->setFocus(TRUE); + LLStringUtil::format_map_t map; + map["[TEXT]"] = self->childGetText("Edit"); + avatar_name = self->getString("not_found", map); + search_results->setEnabled(FALSE); + self->childDisable("Select"); } + else + { + avatar_name = first_name + " " + last_name; + search_results->setEnabled(TRUE); + found_one = TRUE; + } + LLSD element; + element["id"] = avatar_id; // value + element["columns"][0]["value"] = avatar_name; + search_results->addElement(element); + } + + if (found_one) + { + self->childEnable("Select"); + search_results->selectFirstItem(); + self->onList(search_results, self); + search_results->setFocus(TRUE); } } @@ -377,32 +480,23 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* void LLFloaterAvatarPicker::editKeystroke(LLLineEditor* caller, void* user_data) { LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)user_data; - if (caller->getText().size() >= 3) - { - self->childSetEnabled("Find",TRUE); - } - else - { - self->childSetEnabled("Find",FALSE); - } + self->childSetEnabled("Find", caller->getText().size() >= 3); } // virtual BOOL LLFloaterAvatarPicker::handleKeyHere(KEY key, MASK mask) { - if (key == KEY_RETURN - && mask == MASK_NONE) + if (key == KEY_RETURN && mask == MASK_NONE) { if (childHasFocus("Edit")) { onBtnFind(this); - return TRUE; } else { - onBtnAdd(this); - return TRUE; + onBtnSelect(this); } + return TRUE; } else if (key == KEY_ESCAPE && mask == MASK_NONE) { diff --git a/linden/indra/newview/llfloateravatarpicker.h b/linden/indra/newview/llfloateravatarpicker.h index 005eff0..1ab0f7c 100644 --- a/linden/indra/newview/llfloateravatarpicker.h +++ b/linden/indra/newview/llfloateravatarpicker.h @@ -36,14 +36,6 @@ #include -class LLUICtrl; -class LLTextBox; -class LLLineEditor; -class LLButton; -class LLScrollListCtrl; -class LLMessageSystem; -class LLInventoryPanel; -class LLFolderViewItem; class LLFloaterAvatarPicker : public LLFloater { @@ -57,47 +49,47 @@ public: BOOL closeOnSelect = FALSE); virtual BOOL postBuild(); - static void processAvatarPickerReply(LLMessageSystem* msg, void**); - static void editKeystroke(LLLineEditor* caller, void* user_data); + static void processAvatarPickerReply(class LLMessageSystem* msg, void**); -protected: - static void* createInventoryPanel(void* userdata); +private: + + static void editKeystroke(class LLLineEditor* caller, void* user_data); static void onBtnFind(void* userdata); - static void onBtnAdd(void* userdata); + static void onBtnSelect(void* userdata); + static void onBtnRefresh(void* userdata); + static void onRangeAdjust(LLUICtrl* source, void* data); static void onBtnClose(void* userdata); - static void onList(LLUICtrl* ctrl, void* userdata); + static void onList(class LLUICtrl* ctrl, void* userdata); + static void onTabChanged(void* userdata, bool from_click); - void doSelectionChange(const std::deque &items, BOOL user_action, void* data); - static void onSelectionChange(const std::deque &items, BOOL user_action, void* data); + void doCallingCardSelectionChange(const std::deque &items, BOOL user_action, void* data); + static void onCallingCardSelectionChange(const std::deque &items, BOOL user_action, void* data); + + void populateNearMe(); + BOOL visibleItemsSelected() const; // Returns true if any items in the current tab are selected. void find(); void setAllowMultiple(BOOL allow_multiple); + virtual void draw(); virtual BOOL handleKeyHere(KEY key, MASK mask); -protected: - LLScrollListCtrl* mListNames; - LLInventoryPanel* mInventoryPanel; - - std::vector mAvatarIDs; - std::vector mAvatarNames; - BOOL mAllowMultiple; + std::vector mSelectedInventoryAvatarIDs; + std::vector mSelectedInventoryAvatarNames; LLUUID mQueryID; BOOL mResultsReturned; + BOOL mNearMeListComplete; BOOL mCloseOnSelect; void (*mCallback)(const std::vector& name, const std::vector& id, void* userdata); void* mCallbackUserdata; -protected: static LLFloaterAvatarPicker* sInstance; -protected: // do not call these directly LLFloaterAvatarPicker(); virtual ~LLFloaterAvatarPicker(); }; - #endif diff --git a/linden/indra/newview/llfloatergodtools.cpp b/linden/indra/newview/llfloatergodtools.cpp index 7d54ecf..4b44793 100644 --- a/linden/indra/newview/llfloatergodtools.cpp +++ b/linden/indra/newview/llfloatergodtools.cpp @@ -1344,8 +1344,8 @@ void LLPanelRequestTools::refresh() list->operateOnAll(LLCtrlListInterface::OP_DELETE); list->addSimpleElement(SELECTION); list->addSimpleElement(AGENT_REGION); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); - iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* regionp = *iter; std::string name = regionp->getName(); @@ -1405,8 +1405,8 @@ void LLPanelRequestTools::onClickRequest(void* data) else { // find region by name - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); - iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* regionp = *iter; if(dest == regionp->getName()) diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp index 7506004..2b51948 100644 --- a/linden/indra/newview/llglsandbox.cpp +++ b/linden/indra/newview/llglsandbox.cpp @@ -271,7 +271,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) { std::vector potentials; - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index 9d92576..cedabf7 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp @@ -257,8 +257,8 @@ void LLNetMap::draw() // figure out where agent is S32 region_width = llround(LLWorld::getInstance()->getRegionWidthInMeters()); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); - iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* regionp = *iter; // Find x and y position relative to camera's center. @@ -374,8 +374,8 @@ void LLNetMap::draw() LLVector3 pos_map; // Draw avatars - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); - iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* regionp = *iter; const LLVector3d& origin_global = regionp->getOriginGlobal(); diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp index 9b85fec..78398bb 100644 --- a/linden/indra/newview/llviewerobjectlist.cpp +++ b/linden/indra/newview/llviewerobjectlist.cpp @@ -1115,7 +1115,7 @@ void LLViewerObjectList::generatePickList(LLCamera &camera) std::vector pick_drawables; - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp index 04f9e25..9ee789a 100644 --- a/linden/indra/newview/llworld.cpp +++ b/linden/indra/newview/llworld.cpp @@ -951,7 +951,7 @@ void LLWorld::updateWaterObjects() void LLWorld::shiftRegions(const LLVector3& offset) { - for (region_list_t::iterator i = getRegionList().begin(); i != getRegionList().end(); ++i) + for (region_list_t::const_iterator i = getRegionList().begin(); i != getRegionList().end(); ++i) { LLViewerRegion* region = *i; region->updateRenderMatrix(); @@ -1137,8 +1137,8 @@ void send_agent_pause() gAgentPauseSerialNum++; gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); - iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* regionp = *iter; gMessageSystem->sendReliable(regionp->getHost()); @@ -1167,8 +1167,8 @@ void send_agent_resume() gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); - iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* regionp = *iter; gMessageSystem->sendReliable(regionp->getHost()); @@ -1180,6 +1180,62 @@ void send_agent_resume() LLAppViewer::instance()->resumeMainloopTimeout(); } +static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin) +{ + LLVector3d pos_global; + LLVector3 pos_local; + U8 bits; + + bits = compact_local & 0xFF; + pos_local.mV[VZ] = F32(bits) * 4.f; + compact_local >>= 8; + + bits = compact_local & 0xFF; + pos_local.mV[VY] = (F32)bits; + compact_local >>= 8; + + bits = compact_local & 0xFF; + pos_local.mV[VX] = (F32)bits; + + pos_global.setVec( pos_local ); + pos_global += region_origin; + return pos_global; +} + +void LLWorld::getAvatars(std::vector* avatar_ids, std::vector* positions, const LLVector3d& relative_to, F32 radius) const +{ + if(avatar_ids != NULL) + { + avatar_ids->clear(); + } + if(positions != NULL) + { + positions->clear(); + } + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) + { + LLViewerRegion* regionp = *iter; + const LLVector3d& origin_global = regionp->getOriginGlobal(); + S32 count = regionp->mMapAvatars.count(); + for (S32 i = 0; i < count; i++) + { + LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); + if(dist_vec(pos_global, relative_to) <= radius) + { + if(positions != NULL) + { + positions->push_back(pos_global); + } + if(avatar_ids != NULL) + { + avatar_ids->push_back(regionp->mMapAvatarIDs.get(i)); + } + } + } + } +} + LLHTTPRegistration gHTTPRegistrationEstablishAgentCommunication( diff --git a/linden/indra/newview/llworld.h b/linden/indra/newview/llworld.h index 7e50bc4..460809a 100644 --- a/linden/indra/newview/llworld.h +++ b/linden/indra/newview/llworld.h @@ -1,6 +1,11 @@ /** * @file llworld.h - * @brief Initial test structure to organize viewer regions + * @brief Collection of viewer regions in the vacinity of the user. + * + * Represents the whole world, so far as 3D functionality is conserned. + * Always contains the region that the user's avatar is in along with + * neighboring regions. As the user crosses region boundaries, new + * regions are added to the world and distant ones are rolled up. * * $LicenseInfo:firstyear=2001&license=viewergpl$ * @@ -146,12 +151,18 @@ public: public: typedef std::list region_list_t; - - region_list_t mActiveRegionList; + const region_list_t& getRegionList() const { return mActiveRegionList; } - region_list_t& getRegionList() { return mActiveRegionList; } + // Returns lists of avatar IDs and their world-space positions within a given distance of a point. + // All arguments are optional. Given containers will be emptied and then filled. + // Not supplying origin or radius input returns data on all avatars in the known regions. + void getAvatars( + std::vector* avatar_ids = NULL, + std::vector* positions = NULL, + const LLVector3d& relative_to = LLVector3d(), F32 radius = FLT_MAX) const; private: + region_list_t mActiveRegionList; region_list_t mRegionList; region_list_t mVisibleRegionList; region_list_t mCulledRegionList; diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp index 0406520..87b810c 100644 --- a/linden/indra/newview/pipeline.cpp +++ b/linden/indra/newview/pipeline.cpp @@ -608,7 +608,7 @@ void LLPipeline::restoreGL() LLViewerShaderMgr::instance()->setShaders(); } - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -758,7 +758,7 @@ void LLPipeline::dirtyPoolObjectTextures(const std::set& texture } LLOctreeDirtyTexture dirty(textures); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -1149,7 +1149,7 @@ void LLPipeline::updateMove() { LLFastTimer ot(LLFastTimer::FTM_OCTREE_BALANCE); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -1226,7 +1226,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl gGL.setColorMask(false, false); LLGLDepthTest depth(GL_TRUE, GL_FALSE); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -1609,7 +1609,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset) } mShiftList.resize(0); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -2591,7 +2591,7 @@ void LLPipeline::renderDebug() gGL.setColorMask(true, false); // Debug stuff. - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -4037,7 +4037,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, sPickAvatar = FALSE; //LLToolMgr::getInstance()->inBuildMode() ? FALSE : TRUE; - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -4094,7 +4094,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, //check against avatars sPickAvatar = TRUE; - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -4171,7 +4171,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector3& start, co { LLDrawable* drawable = NULL; - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; @@ -4234,7 +4234,7 @@ void LLPipeline::resetVertexBuffers() { sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); - for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); iter != LLWorld::getInstance()->getRegionList().end(); ++iter) { LLViewerRegion* region = *iter; diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml b/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml index 8e3f822..49b7cb5 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml @@ -1,42 +1,96 @@ - - Type part of the resident's name: - - -