From 9e662e50d10ea5546d46b6f4fb5fd25c0f5d65b5 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Tue, 14 Jun 2011 04:59:25 -0500 Subject: [PATCH] Added acessors/setters to LLItemInfo, LLSimInfo, and LLWorldMap. Privatized most member variables. Incl. misc closely related v2 cleanup. --- indra/newview/llfloaterworldmap.cpp | 34 +++--- indra/newview/llmapresponders.cpp | 26 ++-- indra/newview/llworldmap.cpp | 176 ++++++++++++++++------------ indra/newview/llworldmap.h | 68 +++++++++-- indra/newview/llworldmapview.cpp | 118 +++++++++---------- 5 files changed, 245 insertions(+), 177 deletions(-) diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index e7bb0f502..716573d12 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -603,14 +603,14 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id ) void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info) { mTrackedStatus = LLTracker::TRACKING_LOCATION; - LLTracker::trackLocation(event_info.mPosGlobal, event_info.mName, event_info.mToolTip, LLTracker::LOCATION_EVENT); + LLTracker::trackLocation(event_info.getGlobalPosition(), event_info.getName(), event_info.getToolTip(), LLTracker::LOCATION_EVENT); setDefaultBtn("Teleport"); } void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item) { mTrackedStatus = LLTracker::TRACKING_LOCATION; - LLTracker::trackLocation(item.mPosGlobal, item.mName, item.mToolTip, LLTracker::LOCATION_ITEM); + LLTracker::trackLocation(item.getGlobalPosition(), item.getName(), item.getToolTip(), LLTracker::LOCATION_ITEM); setDefaultBtn("Teleport"); } @@ -629,7 +629,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) setDefaultBtn(""); return; } - if (sim_info->mAccess == SIM_ACCESS_DOWN) + if (sim_info->isDown()) { // Down sim. Show the blue circle of death! LLWorldMap::getInstance()->mIsTrackingUnknownLocation = TRUE; @@ -840,8 +840,11 @@ void LLFloaterWorldMap::friendsChanged() if(avatar_id.notNull()) { LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo"); - if(!iface || !iface->setCurrentByID(avatar_id) || - !t.getBuddyInfo(avatar_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION) || gAgent.isGodlike()) + const LLRelationship* buddy_info = t.getBuddyInfo(avatar_id); + if(!iface || + !iface->setCurrentByID(avatar_id) || + (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) || + gAgent.isGodlike()) { LLTracker::stopTracking(NULL); } @@ -856,11 +859,10 @@ void LLFloaterWorldMap::buildAvatarIDList() // Delete all but the "None" entry S32 list_size = list->getItemCount(); - while (list_size > 1) + if (list_size > 1) { - list->selectNthItem(1); + list->selectItemRange(1, -1); list->operateOnSelection(LLCtrlListInterface::OP_DELETE); - --list_size; } LLSD default_column; @@ -1565,10 +1567,10 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim) BOOL match_found = FALSE; S32 num_results = 0; std::map::const_iterator it; - for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { LLSimInfo* info = (*it).second; - std::string sim_name = info->mName; + std::string sim_name = info->getName(); std::string sim_name_lower = sim_name; LLStringUtil::toLower(sim_name_lower); @@ -1653,15 +1655,13 @@ void LLFloaterWorldMap::onCommitSearchResult(LLUICtrl*, void* userdata) LLStringUtil::toLower(sim_name); std::map::const_iterator it; - for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { - LLSimInfo* info = (*it).second; - std::string info_sim_name = info->mName; - LLStringUtil::toLower(info_sim_name); - - if (sim_name == info_sim_name) + LLSimInfo* info = it->second; + + if (info->isName(sim_name)) { - LLVector3d pos_global = from_region_handle( info->mHandle ); + LLVector3d pos_global = info->getGlobalOrigin(); F64 local_x = self->childGetValue("spin x"); F64 local_y = self->childGetValue("spin y"); F64 local_z = self->childGetValue("spin z"); diff --git a/indra/newview/llmapresponders.cpp b/indra/newview/llmapresponders.cpp index 60758a396..ae0090e42 100644 --- a/indra/newview/llmapresponders.cpp +++ b/indra/newview/llmapresponders.cpp @@ -154,25 +154,17 @@ void LLMapLayerResponder::result(const LLSD& result) // llinfos << "Map sim " << name << " image layer " << agent_flags << " ID " << image_id.getString() << llendl; - LLSimInfo* siminfo = new LLSimInfo(); - LLWorldMap::sim_info_map_t::iterator iter = LLWorldMap::getInstance()->mSimInfoMap.find(handle); - if (iter != LLWorldMap::getInstance()->mSimInfoMap.end()) + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if (siminfo == NULL) { - LLSimInfo* oldinfo = iter->second; - for (S32 image=0; imagemMapImageID[image] = oldinfo->mMapImageID[image]; - } - delete oldinfo; + siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); } - LLWorldMap::getInstance()->mSimInfoMap[handle] = siminfo; - siminfo->mHandle = handle; - siminfo->mName.assign( name ); - siminfo->mAccess = access; /*Flawfinder: ignore*/ - siminfo->mRegionFlags = region_flags; - siminfo->mWaterHeight = (F32) water_height; - siminfo->mMapImageID[agent_flags] = image_id; + siminfo->setName( name ); + siminfo->setAccess( access ); /*Flawfinder: ignore*/ + siminfo->setRegionFlags( region_flags ); + siminfo->setWaterHeight( (F32) water_height ); + siminfo->setMapImageID( image_id, agent_flags ); if (use_web_map_tiles) { siminfo->mCurrentImage = LLWorldMap::loadObjectsTile((U32)x_regions, (U32)y_regions); @@ -199,7 +191,7 @@ void LLMapLayerResponder::result(const LLSD& result) LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters && LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256) { - if (siminfo->mAccess == SIM_ACCESS_DOWN) + if (siminfo->isDown()) { // We were tracking this location, but it doesn't exist LLWorldMap::getInstance()->mInvalidLocation = true; diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index cec853e8b..c6ec2047a 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -49,6 +49,7 @@ #include "llregionflags.h" #include "hippogridmanager.h" bool LLWorldMap::sGotMapURL = false; +const F32 AGENTS_UPDATE_TIMER = 60.0; // Seconds between 2 agent requests for a region const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // 10 minutes // For DEV-17507, do lazy image loading in llworldmapview.cpp instead, @@ -73,8 +74,8 @@ LLItemInfo::LLItemInfo(F32 global_x, F32 global_y, mRegionHandle = to_region_handle(mPosGlobal); } -LLSimInfo::LLSimInfo() -: mHandle(0), +LLSimInfo::LLSimInfo(U64 handle) +: mHandle(handle), mName(), mAgentsUpdateTime(0), mShowAgentLocations(FALSE), @@ -86,12 +87,8 @@ LLSimInfo::LLSimInfo() } -LLVector3d LLSimInfo::getGlobalOrigin() const -{ - return from_region_handle(mHandle); -} -LLVector3d LLSimInfo::getGlobalPos(LLVector3 local_pos) const +LLVector3d LLSimInfo::getGlobalPos(const LLVector3& local_pos) const { LLVector3d pos = from_region_handle(mHandle); pos.mdV[VX] += local_pos.mV[VX]; @@ -100,6 +97,47 @@ LLVector3d LLSimInfo::getGlobalPos(LLVector3 local_pos) const return pos; } +LLVector3d LLSimInfo::getGlobalOrigin() const +{ + return from_region_handle(mHandle); +} +LLVector3 LLSimInfo::getLocalPos(LLVector3d global_pos) const +{ + LLVector3d sim_origin = from_region_handle(mHandle); + return LLVector3(global_pos - sim_origin); +} + +void LLSimInfo::clearImage() +{ + if (!mOverlayImage.isNull()) + { + mOverlayImage->setBoostLevel(0); + mOverlayImage = NULL; + } +} + +void LLSimInfo::dropImagePriority() +{ + if (!mOverlayImage.isNull()) + { + mOverlayImage->setBoostLevel(0); + } +} + +// Update the agent count for that region +void LLSimInfo::updateAgentCount(F64 time) +{ + if ((time - mAgentsUpdateTime > AGENTS_UPDATE_TIMER) || mFirstAgentRequest) + { + LLWorldMap::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, mHandle); + mAgentsUpdateTime = time; + mFirstAgentRequest = false; + } +} +bool LLSimInfo::isName(const std::string& name) const +{ + return (LLStringUtil::compareInsensitive(name, mName) == 0); +} //--------------------------------------------------------------------------- // World Map @@ -203,20 +241,23 @@ void LLWorldMap::eraseItems() void LLWorldMap::clearImageRefs() { + // We clear the reference to the images we're holding. + // Images hold by the world mipmap first mWorldMipmap.reset(); + // Images hold by the region map + LLSimInfo* sim_info = NULL; for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { - LLSimInfo* info = (*it).second; - if (info->mCurrentImage) + sim_info = it->second; + if(sim_info) { - info->mCurrentImage->setBoostLevel(0); - info->mCurrentImage = NULL; - } - if (info->mOverlayImage) - { - info->mOverlayImage->setBoostLevel(0); - info->mOverlayImage = NULL; + if (sim_info->mCurrentImage) + { + sim_info->mCurrentImage->setBoostLevel(0); + sim_info->mCurrentImage = NULL; + } + sim_info->clearImage(); } } } @@ -233,6 +274,13 @@ void LLWorldMap::clearSimFlags() } } +LLSimInfo* LLWorldMap::createSimInfoFromHandle(const U64 handle) +{ + LLSimInfo* sim_info = new LLSimInfo(handle); + mSimInfoMap[handle] = sim_info; + return sim_info; +} + void LLWorldMap::equalizeBoostLevels() { mWorldMipmap.equalizeBoostLevels(); @@ -250,11 +298,7 @@ LLSimInfo* LLWorldMap::simInfoFromHandle(const U64 handle) sim_info_map_t::iterator it = mSimInfoMap.find(handle); if (it != mSimInfoMap.end()) { - LLSimInfo* sim_info = (*it).second; - if (sim_info) - { - return sim_info; - } + return it->second; } return NULL; } @@ -265,39 +309,38 @@ LLSimInfo* LLWorldMap::simInfoFromName(const std::string& sim_name) LLSimInfo* sim_info = NULL; if (!sim_name.empty()) { - for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + // Iterate through the entire sim info map and compare the name + sim_info_map_t::iterator it; + for (it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { - sim_info = (*it).second; - if (sim_info - && (0 == LLStringUtil::compareInsensitive(sim_name, sim_info->mName)) ) + sim_info = it->second; + if (sim_info && sim_info->isName(sim_name) ) { + // break out of loop if success break; } - sim_info = NULL; } + // If we got to the end, we haven't found the sim. Reset the ouput value to NULL. + if (it == mSimInfoMap.end()) + sim_info = NULL; } return sim_info; } bool LLWorldMap::simNameFromPosGlobal(const LLVector3d& pos_global, std::string & outSimName ) { - bool gotSimName = true; + LLSimInfo* sim_info = simInfoFromPosGlobal(pos_global); - U64 handle = to_region_handle(pos_global); - - sim_info_map_t::iterator it = mSimInfoMap.find(handle); - if (it != mSimInfoMap.end()) + if (sim_info) { - LLSimInfo* info = (*it).second; - outSimName = info->mName; + outSimName = sim_info->getName(); } else { - gotSimName = false; outSimName = "(unknown region)"; } - return gotSimName; + return (sim_info != NULL); } void LLWorldMap::setCurrentLayer(S32 layer, bool request_layer) @@ -657,28 +700,20 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) y_meters, x_meters+REGION_WIDTH_UNITS, y_meters+REGION_WIDTH_UNITS) || adjust; - -// llinfos << "Map sim " << name << " image layer " << agent_flags << " ID " << image_id.getString() << llendl; - - LLSimInfo* siminfo = new LLSimInfo(); - sim_info_map_t::iterator iter = LLWorldMap::getInstance()->mSimInfoMap.find(handle); - if (iter != LLWorldMap::getInstance()->mSimInfoMap.end()) + //LL_INFOS("World Map") << "Map sim : " << name << ", ID : " << image_id.getString() << LL_ENDL; + // Insert the region in the region map of the world map + // Loading the LLSimInfo object with what we got and insert it in the map + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if (siminfo == NULL) { - LLSimInfo* oldinfo = iter->second; - for (S32 image=0; imagemMapImageID[image] = oldinfo->mMapImageID[image]; - } - delete oldinfo; + siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); } - LLWorldMap::getInstance()->mSimInfoMap[handle] = siminfo; - siminfo->mHandle = handle; - siminfo->mName.assign( name ); - siminfo->mAccess = accesscode; - siminfo->mRegionFlags = region_flags; - siminfo->mWaterHeight = (F32) water_height; - siminfo->mMapImageID[agent_flags] = image_id; + siminfo->setName( name ); + siminfo->setAccess( accesscode ); + siminfo->setRegionFlags( region_flags ); + siminfo->setWaterHeight((F32) water_height); + siminfo->setMapImageID( image_id, agent_flags ); #ifdef IMMEDIATE_IMAGE_LOAD if (use_web_map_tiles) @@ -710,7 +745,7 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**) LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters && LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256) { - if (siminfo->mAccess == SIM_ACCESS_DOWN) + if (siminfo->isDown()) { // We were tracking this location, but it doesn't exist LLWorldMap::getInstance()->mInvalidLocation = true; @@ -783,7 +818,7 @@ void LLWorldMap::processMapItemReply(LLMessageSystem* msg, void**) Y /= REGION_WIDTH_UNITS; LLItemInfo new_item(world_x, world_y, name, uuid, extra, extra2); - LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(new_item.mRegionHandle); + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(new_item.getRegionHandle()); switch (type) { @@ -826,13 +861,13 @@ void LLWorldMap::processMapItemReply(LLMessageSystem* msg, void**) S32 display_hour = timep->tm_hour % 12; if (display_hour == 0) display_hour = 12; - new_item.mToolTip = llformat( "%d:%02d %s", + new_item.setTooltip( llformat( "%d:%02d %s", display_hour, timep->tm_min, - (timep->tm_hour < 12 ? "AM" : "PM") ); + (timep->tm_hour < 12 ? "AM" : "PM") ) ); // HACK: store Z in extra2 - new_item.mPosGlobal.mdV[VZ] = (F64)extra2; + new_item.setElevation((F64)extra2); if (type == MAP_ITEM_PG_EVENT) { LLWorldMap::getInstance()->mPGEvents.push_back(new_item); @@ -851,9 +886,9 @@ void LLWorldMap::processMapItemReply(LLMessageSystem* msg, void**) case MAP_ITEM_LAND_FOR_SALE: // land for sale case MAP_ITEM_LAND_FOR_SALE_ADULT: // adult land for sale { - new_item.mToolTip = llformat("%d sq. m. %s%d", new_item.mExtra, + new_item.setTooltip(llformat("%d sq. m. %s%d", new_item.mExtra, gHippoGridManager->getConnectedGrid()->getCurrencySymbol().c_str(), - new_item.mExtra2); + new_item.mExtra2)); if (type == MAP_ITEM_LAND_FOR_SALE) { LLWorldMap::getInstance()->mLandForSale.push_back(new_item); @@ -873,19 +908,19 @@ void LLWorldMap::processMapItemReply(LLMessageSystem* msg, void**) { if (!siminfo) { - llinfos << "siminfo missing for " << new_item.mPosGlobal.mdV[0] << ", " << new_item.mPosGlobal.mdV[1] << llendl; + llinfos << "siminfo missing for " << new_item.getGlobalPosition().mdV[0] << ", " << new_item.getGlobalPosition().mdV[1] << llendl; break; } // llinfos << "New Location " << new_item.mName << llendl; - item_info_list_t& agentcounts = LLWorldMap::getInstance()->mAgentLocationsMap[new_item.mRegionHandle]; + item_info_list_t& agentcounts = LLWorldMap::getInstance()->mAgentLocationsMap[new_item.getRegionHandle()]; // Find the last item in the list with a different name and erase them item_info_list_t::iterator lastiter; for (lastiter = agentcounts.begin(); lastiter!=agentcounts.end(); ++lastiter) { const LLItemInfo& info = *lastiter; - if (info.mName == new_item.mName) + if (info.isName(new_item.getName())) { break; } @@ -918,10 +953,10 @@ void LLWorldMap::dump() from_region_handle(handle, &x_pos, &y_pos); llinfos << x_pos << "," << y_pos - << " " << info->mName - << " " << (S32)info->mAccess - << " " << std::hex << info->mRegionFlags << std::dec - << " " << info->mWaterHeight + << " " << info->getName() + << " " << (S32)info->getAccess() + << " " << std::hex << info->getRegionFlags() << std::dec + << " " << info->getWaterHeight() //<< " " << info->mTelehubName //<< " " << info->mTelehubPosition << llendl; @@ -1088,9 +1123,6 @@ void LLWorldMap::dropImagePriorities() for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) { LLSimInfo* info = it->second; - if (!info->mOverlayImage.isNull()) - { - info->mOverlayImage->setBoostLevel(0); - } + info->dropImagePriority(); } } diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index a8d9c748e..c87b514ad 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -44,6 +44,7 @@ #include "llworldmipmap.h" #include "lluuid.h" #include "llmemory.h" +#include "llviewerregion.h" #include "llviewertexture.h" #include "lleventinfo.h" #include "v3color.h" @@ -56,14 +57,26 @@ class LLItemInfo public: LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id, S32 extra = 0, S32 extra2 = 0); + // Setters + void setTooltip(const std::string& tooltip) { mToolTip = tooltip; } + void setElevation(F64 z) { mPosGlobal.mdV[VZ] = z; } + // Accessors + const LLVector3d& getGlobalPosition() const { return mPosGlobal; } + const std::string& getName() const { return mName; } + const std::string& getToolTip() const { return mToolTip; } + const LLUUID& getUUID() const { return mID; } + U64 getRegionHandle() const { return mRegionHandle; } + bool isName(const std::string& name) const { return (mName == name); } // True if name same as item's name +private: std::string mName; std::string mToolTip; LLVector3d mPosGlobal; LLUUID mID; + U64 mRegionHandle; +public: //public for now.. non-standard. BOOL mSelected; S32 mExtra; S32 mExtra2; - U64 mRegionHandle; }; #define MAP_SIM_IMAGE_TYPES 3 @@ -74,25 +87,55 @@ public: class LLSimInfo { public: - LLSimInfo(); + LLSimInfo(U64 handle); - LLVector3d getGlobalPos(LLVector3 local_pos) const; + // Convert local region coordinates into world coordinates + LLVector3d getGlobalPos(const LLVector3& local_pos) const; // Get the world coordinates of the SW corner of that region LLVector3d getGlobalOrigin() const; + LLVector3 getLocalPos(LLVector3d global_pos) const; -public: + void clearImage(); // Clears the reference to the Land for sale image for that region + void dropImagePriority(); // Drops the boost level of the Land for sale image for that region + void updateAgentCount(F64 time); // Send an item request for agent count on that region if time's up + // Setters + void setName(std::string& name) { mName = name; } + void setAccess (U8 accesscode) { mAccess = accesscode; } + void setRegionFlags (U32 region_flags) { mRegionFlags = region_flags; } + void setWaterHeight (F32 water_height) { mWaterHeight = water_height; } + void setAlpha(F32 alpha) { mAlpha = alpha; } + + void setMapImageID (const LLUUID& id, const U8 &layer) { mMapImageID[layer] = id; } + + // Accessors + std::string getName() const { return mName; } + const std::string getFlagsString() const { return LLViewerRegion::regionFlagsToString(mRegionFlags); } + const U32 getRegionFlags() const { return mRegionFlags; } + const std::string getAccessString() const { return LLViewerRegion::accessToString((U8)mAccess); } + const U8 getAccess() const { return mAccess; } + + const F32 getWaterHeight() const { return mWaterHeight; } + const F32 getAlpha() const { return mAlpha; } + const U64 getHandle() const { return mHandle; } + bool isName(const std::string& name) const; + bool isDown() { return (mAccess == SIM_ACCESS_DOWN); } + bool isPG() { return (mAccess <= SIM_ACCESS_PG); } + bool isAdult() { return (mAccess == SIM_ACCESS_ADULT); } +private: U64 mHandle; std::string mName; - F64 mAgentsUpdateTime; - BOOL mShowAgentLocations; // are agents visible? - + F64 mAgentsUpdateTime; // Time stamp giving the last time the agents information was requested for that region + bool mFirstAgentRequest; // Init agent request flag U8 mAccess; U32 mRegionFlags; F32 mWaterHeight; F32 mAlpha; +public: + BOOL mShowAgentLocations; // are agents visible? + // Image ID for the current overlay mode. LLUUID mMapImageID[MAP_SIM_IMAGE_TYPES]; @@ -116,6 +159,7 @@ struct LLWorldMapLayer class LLWorldMap : public LLSingleton { + friend class LLMapLayerResponder; public: typedef void(*url_callback_t)(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport); @@ -138,6 +182,9 @@ public: // Drops the priority of the images being fetched void dropImagePriorities(); + // Region Map access + typedef std::map sim_info_map_t; + const LLWorldMap::sim_info_map_t& getRegionMap() const { return mSimInfoMap; } // Returns simulator information, or NULL if out of range LLSimInfo* simInfoFromHandle(const U64 handle); @@ -195,11 +242,14 @@ public: private: bool clearItems(bool force = false); // Clears the item lists -public: + // Create a region record corresponding to the handle, insert it in the region map and returns a pointer + LLSimInfo* createSimInfoFromHandle(const U64 handle); + // Map from region-handle to simulator info - typedef std::map sim_info_map_t; sim_info_map_t mSimInfoMap; +public: + BOOL mIsTrackingUnknownLocation, mInvalidLocation, mIsTrackingDoubleClick, mIsTrackingCommit; LLVector3d mUnknownLocation; diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 4cff8c1e8..d4c9c7f66 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -127,10 +127,6 @@ std::map LLWorldMapView::sStringsMap; #define SIM_MAP_AGENT_SCALE 8 // width in pixels, where we start drawing agents #define SIM_MAP_SCALE 4 // width in pixels, where we start drawing sim tiles -// Updates for agent locations. -#define AGENTS_UPDATE_TIME 60.0 // in seconds - - void LLWorldMapView::initClass() { @@ -261,7 +257,7 @@ void LLWorldMapView::setScale( F32 scale ) F32 old_scale = sMapScale; sMapScale = scale; - if (sMapScale == 0.f) + if (sMapScale <= 0.f) { sMapScale = 0.1f; } @@ -308,7 +304,7 @@ void LLWorldMapView::setPan( S32 x, S32 y, BOOL snap ) BOOL is_agent_in_region(LLViewerRegion* region, LLSimInfo* info) { - return ((region && info) && (info->mName == region->getName())); + return ((region && info) && (info->isName(region->getName()))); } @@ -328,6 +324,8 @@ void LLWorldMapView::draw() const S32 width = getRect().getWidth(); const S32 height = getRect().getHeight(); + const F32 half_width = F32(width) / 2.0f; + const F32 half_height = F32(height) / 2.0f; LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal(); LLLocalClipRect clip(getLocalRect()); @@ -346,6 +344,7 @@ void LLWorldMapView::draw() } gGL.flush(); + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); gGL.setColorMask(true, true); gGL.setSceneBlendType(LLRender::BT_ALPHA); @@ -354,17 +353,15 @@ void LLWorldMapView::draw() drawMipmap(width, height); else drawTiles(width, height); - + gGL.flush(); LLFontGL* font = LLFontGL::getFontSansSerifSmall(); - const F32 half_width = F32(width) / 2.0f; - const F32 half_height = F32(height) / 2.0f; // Draw the region name in the lower left corner - for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin(); - it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); + it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { U64 handle = it->first; - LLSimInfo* info = (*it).second; + LLSimInfo* info = it->second; LLVector3d origin_global = from_region_handle(handle); @@ -372,29 +369,26 @@ void LLWorldMapView::draw() LLVector3d rel_region_pos = origin_global - camera_global; F32 relative_x = (rel_region_pos.mdV[0] / REGION_WIDTH_METERS) * sMapScale; F32 relative_y = (rel_region_pos.mdV[1] / REGION_WIDTH_METERS) * sMapScale; - - F32 bottom = sPanY + half_height + relative_y; - F32 left = sPanX + half_width + relative_x; - F32 top = bottom + sMapScale ; - F32 right = left + sMapScale ; - - // disregard regions that are outside the rectangle - if (top < 0.f || - bottom > height || - right < 0.f || - left > width ) + + // Coordinates of the sim in pixels in the UI panel + // When the view isn't panned, 0,0 = center of rectangle + F32 bottom = sPanY + half_height + relative_y; + F32 left = sPanX + half_width + relative_x; + F32 top = bottom + sMapScale ; + F32 right = left + sMapScale ; + + // Discard if region is outside the screen rectangle (not visible on screen) + if ((top < 0.f) || (bottom > height) || + (right < 0.f) || (left > width) ) { + // Drop the "land for sale" fetching priority since it's outside the view rectangle + info->dropImagePriority(); continue; } info->mShowAgentLocations = (sMapScale >= SIM_MAP_AGENT_SCALE); mVisibleRegions.push_back(handle); - // See if the agents need updating - if (current_time - info->mAgentsUpdateTime > AGENTS_UPDATE_TIME) - { - LLWorldMap::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, info->mHandle); - info->mAgentsUpdateTime = current_time; - } + info->updateAgentCount(current_time); std::string mesg; if (sMapScale < sThresholdA) @@ -416,14 +410,14 @@ void LLWorldMapView::draw() mesg = RlvStrings::getString(RLV_STRING_HIDDEN); } // [/RLVa:KB] - else if (info->mAccess == SIM_ACCESS_DOWN) + else if (info->isDown()) { - mesg = llformat( "%s (%s)", info->mName.c_str(), sStringsMap["offline"].c_str()); + mesg = llformat( "%s (%s)", info->getName().c_str(), sStringsMap["offline"].c_str()); } else { - mesg = info->mName; - U8 access = info->mAccess; + mesg = info->getName(); + U8 access = info->getAccess(); switch(access) { case SIM_ACCESS_MIN: @@ -615,8 +609,8 @@ void LLWorldMapView::setVisible(BOOL visible) } } } - for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin(); - it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); + it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { LLSimInfo* info = (*it).second; if (info->mCurrentImage.notNull()) @@ -742,8 +736,8 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { bool use_web_map_tiles = LLWorldMap::useWebMapTiles(); - for (LLWorldMap::sim_info_map_t::iterator it = LLWorldMap::getInstance()->mSimInfoMap.begin(); - it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it) + for (LLWorldMap::sim_info_map_t::const_iterator it = LLWorldMap::getInstance()->getRegionMap().begin(); + it != LLWorldMap::getInstance()->getRegionMap().end(); ++it) { U64 handle = (*it).first; LLSimInfo* info = (*it).second; @@ -776,7 +770,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { // 1. Tiles are zoomed out small enough, or // 2. Sim's texture has not been loaded yet F32 map_scale_cutoff = SIM_MAP_SCALE; - if ((info->mRegionFlags & REGION_FLAGS_NULL_LAYER) > 0) + if ((info->getRegionFlags() & REGION_FLAGS_NULL_LAYER) > 0) { map_scale_cutoff = SIM_NULL_MAP_SCALE; } @@ -789,18 +783,18 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { if (sim_visible) { // Fade in - if (info->mAlpha < 0.0f) - info->mAlpha = 1.f; // don't fade initially + if (info->getAlpha() < 0.0f) + info->setAlpha( 1.f ); // don't fade initially else - info->mAlpha = lerp(info->mAlpha, 1.f, LLCriticalDamp::getInterpolant(0.15f)); + info->setAlpha(lerp(info->getAlpha(), 1.f, LLCriticalDamp::getInterpolant(0.15f))); } else { // Fade out - if (info->mAlpha < 0.0f) - info->mAlpha = 0.f; // don't fade initially + if (info->getAlpha() < 0.0f) + info->setAlpha( 0.f ); // don't fade initially else - info->mAlpha = lerp(info->mAlpha, 0.f, LLCriticalDamp::getInterpolant(0.15f)); + info->setAlpha(lerp(info->getAlpha(), 0.f, LLCriticalDamp::getInterpolant(0.15f))); } // discard regions that are outside the rectangle @@ -870,7 +864,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { // LLTextureView::addDebugImage(simimage); - if (sim_visible && info->mAlpha > 0.001f) + if (sim_visible && info->getAlpha() > 0.001f) { // Draw using the texture. If we don't clamp we get artifact at // the edge. @@ -879,7 +873,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { gGL.getTexUnit(0)->bind(simimage); gGL.setSceneBlendType(LLRender::BT_ALPHA); - F32 alpha = sim_alpha * info->mAlpha; + F32 alpha = sim_alpha * info->getAlpha(); gGL.color4f(1.f, 1.0f, 1.0f, alpha); gGL.begin(LLRender::QUADS); @@ -909,7 +903,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { gGL.end(); } - if ((info->mRegionFlags & REGION_FLAGS_NULL_LAYER) == 0) + if ((info->getRegionFlags() & REGION_FLAGS_NULL_LAYER) == 0) { // draw an alpha of 1 where the sims are visible (except NULL sims) gGL.flush(); @@ -930,7 +924,7 @@ void LLWorldMapView::drawTiles(S32 width, S32 height) { } } - if (info->mAccess == SIM_ACCESS_DOWN) + if (info->isDown()) { // Draw a transparent red square over down sims gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_SOURCE_ALPHA); @@ -980,7 +974,7 @@ void LLWorldMapView::drawGenericItems(const LLWorldMap::item_info_list_t& items, void LLWorldMapView::drawGenericItem(const LLItemInfo& item, LLUIImagePtr image) { - drawImage(item.mPosGlobal, image); + drawImage(item.getGlobalPosition(), image); } @@ -1018,7 +1012,7 @@ void LLWorldMapView::drawAgents() { U64 handle = *iter; LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); - if (siminfo && (siminfo->mAccess == SIM_ACCESS_DOWN)) + if (siminfo && (siminfo->isDown())) { continue; } @@ -1036,7 +1030,7 @@ void LLWorldMapView::drawAgents() sim_agent_count += info.mExtra; // Here's how we'd choose the color if info.mID were available but it's not being sent: //LLColor4 color = (agent_count == 1 && is_agent_friend(info.mID)) ? friend_color : avatar_color; - drawImageStack(info.mPosGlobal, sAvatarSmallImage, agent_count, 3.f, avatar_color); + drawImageStack(info.getGlobalPosition(), sAvatarSmallImage, agent_count, 3.f, avatar_color); } LLWorldMap::getInstance()->mNumAgents[handle] = sim_agent_count; // override mNumAgents for this sim } @@ -1427,14 +1421,14 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic // std::string message = llformat("%s (%s)", info->getName().c_str(), info->getAccessString().c_str()); // [RLVa:KB] - Alternate: Snowglobe-1.2.4 | Checked: 2009-07-04 (RLVa-1.0.0a) std::string message = llformat("%s (%s)", - (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? info->mName.c_str() : RlvStrings::getString(RLV_STRING_HIDDEN).c_str(), - LLViewerRegion::accessToString(info->mAccess).c_str()); + (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ? info->getName().c_str() : RlvStrings::getString(RLV_STRING_HIDDEN).c_str(), + info->getAccessString().c_str()); // [/RLVa:KB] - if (info->mAccess != SIM_ACCESS_DOWN) + if (!info->isDown()) { - S32 agent_count = LLWorldMap::getInstance()->mNumAgents[info->mHandle]; - if (region && region->getHandle() == info->mHandle) + S32 agent_count = LLWorldMap::getInstance()->mNumAgents[info->getHandle()]; + if (region && region->getHandle() == info->getHandle()) { ++agent_count; // Bump by 1 if we're here } @@ -1458,7 +1452,7 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* stic msg.assign( message ); // Optionally show region flags - std::string region_flags = LLViewerRegion::regionFlagsToString(info->mRegionFlags); + std::string region_flags = info->getFlagsString(); if (!region_flags.empty()) { @@ -1808,7 +1802,7 @@ void LLWorldMapView::reshape( S32 width, S32 height, BOOL called_from_parent ) bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bool track) { - LLVector3 pos_view = globalPosToView(item.mPosGlobal); + LLVector3 pos_view = globalPosToView(item.getGlobalPosition()); S32 item_x = llround(pos_view.mV[VX]); S32 item_y = llround(pos_view.mV[VY]); @@ -1817,12 +1811,12 @@ bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bo if (y < item_y - BIG_DOT_RADIUS) return false; if (y > item_y + BIG_DOT_RADIUS) return false; - LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(item.mRegionHandle); + LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(item.getRegionHandle()); if (sim_info) { if (track) { - gFloaterWorldMap->trackLocation(item.mPosGlobal); + gFloaterWorldMap->trackLocation(item.getGlobalPosition()); } } @@ -1832,7 +1826,7 @@ bool LLWorldMapView::checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bo } item.mSelected = TRUE; - *id = item.mID; + *id = item.getUUID(); return true; } @@ -2167,7 +2161,7 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) // Teleport if we got a valid location LLVector3d pos_global = viewPosToGlobal(x,y); LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); - if (sim_info && sim_info->mAccess != SIM_ACCESS_DOWN) + if (sim_info && !sim_info->isDown()) { gAgent.teleportViaLocation( pos_global ); }