From b3b2da142894a8bd67557db22ab71efddeaa6584 Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Thu, 25 Jun 2015 02:57:48 -0400 Subject: [PATCH] [Radar] Reroute some code, optimize silly stuff away. No more dead state, death is instant when you disappear No more dependency on frame or life time, updates come from the sims. No need to rate control anymore, ui removed. RIP: My headphones, you were shortlived, but you served my ears well. --- indra/newview/app_settings/settings.xml | 11 -- indra/newview/chatbar_as_cmdline.cpp | 5 +- indra/newview/llfloateravatarlist.cpp | 116 +++++------------- indra/newview/llfloateravatarlist.h | 40 +----- indra/newview/llviewerregion.cpp | 9 ++ indra/newview/llworld.cpp | 2 +- .../skins/default/xui/de/floater_radar.xml | 6 - .../skins/default/xui/en-us/floater_radar.xml | 23 +--- .../skins/default/xui/es/floater_radar.xml | 14 --- 9 files changed, 44 insertions(+), 182 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f611cb14c..a264b810c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -7768,17 +7768,6 @@ This should be as low as possible, but too low may break functionality Value 1 - RadarUpdateRate - - Comment - Radar update rate (0 = high, 1 = medium, 2 = low) - Persist - 1 - Type - U32 - Value - 1 - RadarAlertShowDist Comment diff --git a/indra/newview/chatbar_as_cmdline.cpp b/indra/newview/chatbar_as_cmdline.cpp index 549a010c0..025f4fa1f 100644 --- a/indra/newview/chatbar_as_cmdline.cpp +++ b/indra/newview/chatbar_as_cmdline.cpp @@ -559,12 +559,9 @@ LLUUID cmdline_partial_name2key(std::string partial_name) std::string av_name; LLStringUtil::toLower(partial_name); LLWorld::getInstance()->getAvatars(&avatars); - bool has_avatarlist = LLFloaterAvatarList::instanceExists(); - if (has_avatarlist) - LLFloaterAvatarList::getInstance()->updateAvatarList(); for(std::vector::const_iterator i = avatars.begin(); i != avatars.end(); ++i) { - if (LLAvatarListEntry* entry = has_avatarlist ? LLFloaterAvatarList::instance().getAvatarEntry(*i) : NULL) + if (LLAvatarListEntry* entry = LLFloaterAvatarList::instanceExists() ? LLFloaterAvatarList::instance().getAvatarEntry(*i) : NULL) av_name = entry->getName(); else if (gCacheName->getFullName(*i, av_name)); else if (LLVOAvatar* avatarp = gObjectList.findAvatar(*i)) diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index 7a6adbee9..738a260de 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -35,7 +35,6 @@ #include "llagent.h" #include "llagentcamera.h" #include "llavataractions.h" -#include "llcallbacklist.h" #include "llfloaterchat.h" #include "llfloaterregioninfo.h" #include "llfloaterreporter.h" @@ -59,10 +58,7 @@ #include "rlvhandler.h" // [/RLVa:KB] -/** - * @brief How long to keep people who are gone in the list and in memory. - */ -const F32 DEAD_KEEP_TIME = 0.5f; +LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& origin); extern U32 gFrameCount; @@ -138,7 +134,7 @@ namespace LLAvatarListEntry::LLAvatarListEntry(const LLUUID& id, const std::string& name, const LLVector3d& position) : mID(id), mName(name), mPosition(position), mMarked(false), mFocused(false), - mUpdateTimer(), mFrame(gFrameCount), mStats(), + mStats(), mActivityType(ACTIVITY_NEW), mActivityTimer(), mIsInList(false), mAge(-1), mTime(time(NULL)) { @@ -190,7 +186,6 @@ void LLAvatarListEntry::processProperties(void* data, EAvatarProcessorType type) void LLAvatarListEntry::setPosition(const LLVector3d& position, const F32& dist, bool drawn) { mPosition = position; - mFrame = gFrameCount; bool here(dist != F32_MIN); // F32_MIN only if dead bool this_sim(here && (gAgent.getRegion()->pointInRegionGlobal(position) || !(LLWorld::getInstance()->positionRegionValidGlobal(position)))); if (this_sim != mStats[STAT_TYPE_SIM]) chat_avatar_status(mName, mID, STAT_TYPE_SIM, mStats[STAT_TYPE_SIM] = this_sim, dist); @@ -199,22 +194,6 @@ void LLAvatarListEntry::setPosition(const LLVector3d& position, const F32& dist, if (shoutrange != mStats[STAT_TYPE_SHOUTRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_SHOUTRANGE, mStats[STAT_TYPE_SHOUTRANGE] = shoutrange, dist); bool chatrange(here && dist < LFSimFeatureHandler::getInstance()->sayRange()); if (chatrange != mStats[STAT_TYPE_CHATRANGE]) chat_avatar_status(mName, mID, STAT_TYPE_CHATRANGE, mStats[STAT_TYPE_CHATRANGE] = chatrange, dist); - mUpdateTimer.start(); -} - -bool LLAvatarListEntry::getAlive() const -{ - return ((gFrameCount - mFrame) <= 2); -} - -F32 LLAvatarListEntry::getEntryAgeSeconds() const -{ - return mUpdateTimer.getElapsedTimeF32(); -} - -bool LLAvatarListEntry::isDead() const -{ - return getEntryAgeSeconds() > DEAD_KEEP_TIME; } void LLAvatarListEntry::resetName(const bool& hide_tags, const bool& anon_names, const std::string& hidden) @@ -244,7 +223,6 @@ const LLAvatarListEntry::ACTIVITY_TYPE LLAvatarListEntry::getActivity() { mActivityType = ACTIVITY_NONE; } - if (isDead()) return ACTIVITY_DEAD; return mActivityType; } @@ -253,7 +231,6 @@ LLFloaterAvatarList::LLFloaterAvatarList() : LLFloater(std::string("radar")), mTracking(false), mUpdate("RadarUpdateEnabled"), mDirtyAvatarSorting(false), - mUpdateRate(gSavedSettings.getU32("RadarUpdateRate") * 3 + 3), mAvatarList(NULL) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_radar.xml"); @@ -261,7 +238,6 @@ LLFloaterAvatarList::LLFloaterAvatarList() : LLFloater(std::string("radar")), LLFloaterAvatarList::~LLFloaterAvatarList() { - gIdleCallbacks.deleteFunction(LLFloaterAvatarList::callbackIdle); } //static @@ -423,9 +399,6 @@ BOOL LLFloaterAvatarList::postBuild() childSetAction("send_keys_btn", boost::bind(&LLFloaterAvatarList::sendKeys, this)); - getChild("update_rate")->setSelectedIndex(gSavedSettings.getU32("RadarUpdateRate")); - getChild("update_rate")->setCommitCallback(boost::bind(&LLFloaterAvatarList::onCommitUpdateRate, this)); - gSavedSettings.getControl("RadarColumnMarkHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this)); gSavedSettings.getControl("RadarColumnPositionHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this)); gSavedSettings.getControl("RadarColumnAltitudeHidden")->getSignal()->connect(boost::bind(&LLFloaterAvatarList::assessColumns, this)); @@ -443,8 +416,6 @@ BOOL LLFloaterAvatarList::postBuild() mAvatarList->setSortChangedCallback(boost::bind(&LLFloaterAvatarList::onAvatarSortingChanged,this)); refreshAvatarList(); - gIdleCallbacks.addFunction(LLFloaterAvatarList::callbackIdle); - assessColumns(); if(gHippoGridManager->getConnectedGrid()->isSecondLife()) @@ -538,10 +509,8 @@ void updateParticleActivity(LLDrawable *drawablep) } } -void LLFloaterAvatarList::updateAvatarList() +void LLFloaterAvatarList::updateAvatarList(const LLViewerRegion* region) { - //LL_INFOS() << "radar refresh: updating map" << LL_ENDL; - // Check whether updates are enabled if (!mUpdate) { @@ -550,10 +519,12 @@ void LLFloaterAvatarList::updateAvatarList() } { - LLWorld::pos_map_t avs; - LLVector3d mypos = gAgent.getPositionGlobal(); + const std::vector& map_avs(region->mMapAvatars); + const std::vector& map_avids(region->mMapAvatarIDs); + const LLVector3d& mypos(gAgent.getPositionGlobal()); + const LLVector3d& origin(region->getOriginGlobal()); static const LLCachedControl radar_range_radius("RadarRangeRadius", 0); - LLWorld::instance().getAvatars(&avs, mypos, radar_range_radius ? radar_range_radius : F32_MAX); + const F32 max_range(radar_range_radius * radar_range_radius); static LLCachedControl announce(gSavedSettings, "RadarChatKeys"); std::queue announce_keys; @@ -561,19 +532,21 @@ void LLFloaterAvatarList::updateAvatarList() bool no_names(gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMETAGS)); bool anon_names(!no_names && gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); const std::string& rlv_hidden(RlvStrings::getString(RLV_STRING_HIDDEN)); - for (LLWorld::pos_map_t::const_iterator i = avs.cbegin(), end = avs.cend(); i != end; ++i) + for (size_t i = 0, size = map_avs.size(); i < size; ++i) { - const LLUUID& avid = i->first; + const LLUUID& avid = map_avids[i]; + LLVector3d position(unpackLocalToGlobalPosition(map_avs[i], origin)); + + LLVOAvatar* avatarp = gObjectList.findAvatar(avid); + if (avatarp) position = gAgent.getPosGlobalFromAgent(avatarp->getCharacterPosition()); + + if (max_range && dist_vec_squared(position, mypos) > max_range) continue; // Out of desired range + std::string name; if (no_names) name = rlv_hidden; else if (!LLAvatarNameCache::getNSName(avid, name, radar_namesystem())) continue; //prevent (Loading...) else if (anon_names) name = RlvStrings::getAnonym(name); - LLVector3d position = i->second; - - LLVOAvatar* avatarp = gObjectList.findAvatar(avid); - if (avatarp) position = gAgent.getPosGlobalFromAgent(avatarp->getCharacterPosition()); - LLAvatarListEntry* entry = getAvatarEntry(avid); if (!entry) { @@ -617,10 +590,20 @@ void LLFloaterAvatarList::updateAvatarList() if (num_ids) send_keys_message(transact_num, num_ids, ids.str()); } } +} -// LL_INFOS() << "radar refresh: done" << LL_ENDL; - - expireAvatarList(); +void LLFloaterAvatarList::expireAvatarList(const std::list& ids) +{ + BOOST_FOREACH(const LLUUID& id, ids) + { + av_list_t::iterator it(std::find_if(mAvatars.begin(), mAvatars.end(), LLAvatarListEntry::uuidMatch(id))); + if (it != mAvatars.end()) + { + LLAvatarListEntry* entry = it->get(); + entry->setPosition(entry->getPosition(), F32_MIN, false); // Dead and gone + mAvatars.erase(it); + } + } if (mAvatars.empty()) setTitle(getString("Title")); @@ -637,24 +620,6 @@ void LLFloaterAvatarList::updateAvatarList() refreshTracker(); } -void LLFloaterAvatarList::expireAvatarList() -{ -// LL_INFOS() << "radar: expiring" << LL_ENDL; - for(av_list_t::iterator it = mAvatars.begin(); it != mAvatars.end();) - { - LLAvatarListEntry* entry = it->get(); - if (entry->getAlive() && !entry->isDead()) - { - ++it; - } - else - { - entry->setPosition(entry->getPosition(), F32_MIN, false); // Dead and gone - it = mAvatars.erase(it); - } - } -} - void LLFloaterAvatarList::updateAvatarSorting() { if (mDirtyAvatarSorting) @@ -707,9 +672,6 @@ void LLFloaterAvatarList::refreshAvatarList() bool name_restricted(gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMETAGS) || gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)); BOOST_FOREACH(av_list_t::value_type& entry, mAvatars) { - // Skip if avatar hasn't been around - if (entry->isDead()) continue; - LLVector3d position = entry->getPosition(); LLVector3d delta = position - mypos; bool UnknownAltitude = position.mdV[VZ] == (gHippoGridManager->getConnectedGrid()->isSecondLife() ? 1020.f : 0.f); @@ -1510,19 +1472,6 @@ void LLFloaterAvatarList::callbackBanFromEstate(const LLSD& notification, const } } -//static -void LLFloaterAvatarList::callbackIdle(void*) -{ - if (instanceExists()) - { - LLFloaterAvatarList& inst(instance()); - const U32& rate = inst.mUpdateRate; - // Do not update at every frame: this would be insane! - if (rate == 0 || (gFrameCount % rate == 0)) - inst.updateAvatarList(); - } -} - void LLFloaterAvatarList::onClickFreeze() { LLSD args; @@ -1580,8 +1529,3 @@ void LLFloaterAvatarList::onSelectName() } } } - -void LLFloaterAvatarList::onCommitUpdateRate() -{ - mUpdateRate = gSavedSettings.getU32("RadarUpdateRate") * 3 + 3; -} diff --git a/indra/newview/llfloateravatarlist.h b/indra/newview/llfloateravatarlist.h index c77d87c53..93230f9a5 100644 --- a/indra/newview/llfloateravatarlist.h +++ b/indra/newview/llfloateravatarlist.h @@ -62,7 +62,6 @@ enum ACTIVITY_TYPE ACTIVITY_TYPING, /** Typing */ ACTIVITY_NEW, /** Avatar just appeared */ ACTIVITY_SOUND, /** Playing a sound */ - ACTIVITY_DEAD /** Avatar isn't around anymore, and will be removed soon from the list */ }; /** * @brief Initializes a list entry @@ -84,19 +83,6 @@ enum ACTIVITY_TYPE const LLVector3d& getPosition() const { return mPosition; } - /** - * @brief Returns the age of this entry in frames - * - * This is only used for determining whether the avatar is still around. - * @see getEntryAgeSeconds - */ - bool getAlive() const; - - /** - * @brief Returns the age of this entry in seconds - */ - F32 getEntryAgeSeconds() const; - /* * @brief resets the name accordance with RLVa */ @@ -137,11 +123,6 @@ enum ACTIVITY_TYPE void setInList() { mIsInList = true; } bool isInList() const { return mIsInList; } - /** - * @brief Returns whether the item is dead and shouldn't appear in the list - * @returns true if dead - */ - bool isDead() const; void toggleMark() { mMarked = !mMarked; } @@ -169,20 +150,9 @@ private: */ std::bitset mStats; - /** - * @brief Timer to keep track of whether avatars are still there - */ - - LLTimer mUpdateTimer; - ACTIVITY_TYPE mActivityType; LLTimer mActivityTimer; - - /** - * @brief Last frame when this avatar was updated - */ - U32 mFrame; }; @@ -232,7 +202,7 @@ public: /** * @brief Updates the internal avatar list with the currently present avatars. */ - void updateAvatarList(); + void updateAvatarList(const class LLViewerRegion* region); /** * @brief Refresh avatar list (display) @@ -327,7 +297,6 @@ public: void onClickGetKey(); void onSelectName(); - void onCommitUpdateRate(); /** * @brief These callbacks fire off notifications, which THEN fire the related callback* functions. @@ -359,7 +328,7 @@ public: * to keep people passing by in the list long enough that it's possible * to do something to them. */ - void expireAvatarList(); + void expireAvatarList(const std::list& ids); void updateAvatarSorting(); private: @@ -375,11 +344,6 @@ private: */ const LLCachedControl mUpdate; - /** - * @brief Update rate (if min frames per update) - */ - U32 mUpdateRate; - // tracking data bool mTracking; // Tracking ? LLUUID mTrackedAvatar; // Who we are tracking diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 257433332..fe478f309 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -57,6 +57,7 @@ #include "llcommandhandler.h" #include "lldir.h" #include "lleventpoll.h" +#include "llfloateravatarlist.h" #include "llfloatergodtools.h" #include "llfloaterperms.h" #include "llfloaterreporter.h" @@ -1250,6 +1251,7 @@ LLHTTPRegistration void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg) { //LL_INFOS() << "CoarseLocationUpdate" << LL_ENDL; + std::list map_avids(mMapAvatarIDs.begin(), mMapAvatarIDs.end()); mMapAvatars.reset(); mMapAvatarIDs.reset(); // only matters in a rare case but it's good to be safe. @@ -1304,9 +1306,16 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg) if(has_agent_data) { mMapAvatarIDs.put(agent_id); + map_avids.remove(agent_id); } } } + if (LLFloaterAvatarList::instanceExists()) + { + LLFloaterAvatarList& inst(LLFloaterAvatarList::instance()); + inst.updateAvatarList(this); + inst.expireAvatarList(map_avids); + } } void LLViewerRegion::getInfo(LLSD& info) diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 5d0d0757f..020c6a53e 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1530,7 +1530,7 @@ void send_agent_resume() LLAppViewer::instance()->resumeMainloopTimeout(); } -static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin) +LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin) { LLVector3d pos_local; diff --git a/indra/newview/skins/default/xui/de/floater_radar.xml b/indra/newview/skins/default/xui/de/floater_radar.xml index 6aca43c8a..25493ba0c 100644 --- a/indra/newview/skins/default/xui/de/floater_radar.xml +++ b/indra/newview/skins/default/xui/de/floater_radar.xml @@ -65,12 +65,6 @@ - Intervall: - - Hoch - Mittel - Niedrig -