diff options
Diffstat (limited to 'indra/newview/llworldmap.cpp')
-rw-r--r-- | indra/newview/llworldmap.cpp | 846 |
1 files changed, 423 insertions, 423 deletions
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index cbb6e85b96..7962c28e6d 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llworldmap.cpp * @brief Underlying data representation for map of the world * * $LicenseInfo:firstyear=2003&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -37,23 +37,23 @@ #include "llgltexture.h" // Timers to temporise database requests -const F32 AGENTS_UPDATE_TIMER = 60.0; // Seconds between 2 agent requests for a region -const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // Seconds before we consider re-requesting item data for the grid +const F32 AGENTS_UPDATE_TIMER = 60.0; // Seconds between 2 agent requests for a region +const F32 REQUEST_ITEMS_TIMER = 10.f * 60.f; // Seconds before we consider re-requesting item data for the grid //--------------------------------------------------------------------------- // LLItemInfo //--------------------------------------------------------------------------- LLItemInfo::LLItemInfo(F32 global_x, F32 global_y, - const std::string& name, - LLUUID id) -: mName(name), - mToolTip(""), - mPosGlobal(global_x, global_y, 40.0), - mID(id), - mCount(1) -// mSelected(false) -// mColor() + const std::string& name, + LLUUID id) +: mName(name), + mToolTip(""), + mPosGlobal(global_x, global_y, 40.0), + mID(id), + mCount(1) +// mSelected(false) +// mColor() { } @@ -62,158 +62,158 @@ LLItemInfo::LLItemInfo(F32 global_x, F32 global_y, //--------------------------------------------------------------------------- LLSimInfo::LLSimInfo(U64 handle) -: mHandle(handle), - mName(), - mAgentsUpdateTime(0), - mAccess(0x0), - mRegionFlags(0x0), - mFirstAgentRequest(true) -// mWaterHeight(0.f) +: mHandle(handle), + mName(), + mAgentsUpdateTime(0), + mAccess(0x0), + mRegionFlags(0x0), + mFirstAgentRequest(true) +// mWaterHeight(0.f) { } -void LLSimInfo::setLandForSaleImage (LLUUID image_id) +void LLSimInfo::setLandForSaleImage (LLUUID image_id) { - mMapImageID = image_id; + mMapImageID = image_id; - // Fetch the image - if (mMapImageID.notNull()) - { - mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); - mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); - } - else - { - mOverlayImage = NULL; - } + // Fetch the image + if (mMapImageID.notNull()) + { + mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); + mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); + } + else + { + mOverlayImage = NULL; + } } -LLPointer<LLViewerFetchedTexture> LLSimInfo::getLandForSaleImage () +LLPointer<LLViewerFetchedTexture> LLSimInfo::getLandForSaleImage () { - if (mOverlayImage.isNull() && mMapImageID.notNull()) - { - // Fetch the image if it hasn't been done yet (unlikely but...) - mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); - mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); - } - if (!mOverlayImage.isNull()) - { - // Boost the fetch level when we try to access that image - mOverlayImage->setBoostLevel(LLGLTexture::BOOST_MAP); - } - return mOverlayImage; + if (mOverlayImage.isNull() && mMapImageID.notNull()) + { + // Fetch the image if it hasn't been done yet (unlikely but...) + mOverlayImage = LLViewerTextureManager::getFetchedTexture(mMapImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_MAP, LLViewerTexture::LOD_TEXTURE); + mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP); + } + if (!mOverlayImage.isNull()) + { + // Boost the fetch level when we try to access that image + mOverlayImage->setBoostLevel(LLGLTexture::BOOST_MAP); + } + return mOverlayImage; } LLVector3d LLSimInfo::getGlobalPos(const LLVector3& local_pos) const { - LLVector3d pos = from_region_handle(mHandle); - pos.mdV[VX] += local_pos.mV[VX]; - pos.mdV[VY] += local_pos.mV[VY]; - pos.mdV[VZ] += local_pos.mV[VZ]; - return pos; + LLVector3d pos = from_region_handle(mHandle); + pos.mdV[VX] += local_pos.mV[VX]; + pos.mdV[VY] += local_pos.mV[VY]; + pos.mdV[VZ] += local_pos.mV[VZ]; + return pos; } LLVector3d LLSimInfo::getGlobalOrigin() const { - return from_region_handle(mHandle); + 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); + LLVector3d sim_origin = from_region_handle(mHandle); + return LLVector3(global_pos - sim_origin); } void LLSimInfo::clearImage() { - if (!mOverlayImage.isNull()) - { - mOverlayImage->setBoostLevel(0); - mOverlayImage = NULL; - } + if (!mOverlayImage.isNull()) + { + mOverlayImage->setBoostLevel(0); + mOverlayImage = NULL; + } } void LLSimInfo::dropImagePriority() { - if (!mOverlayImage.isNull()) - { - mOverlayImage->setBoostLevel(0); - } + 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) - { - LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, mHandle); - mAgentsUpdateTime = time; - mFirstAgentRequest = false; - } + if ((time - mAgentsUpdateTime > AGENTS_UPDATE_TIMER) || mFirstAgentRequest) + { + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_AGENT_LOCATIONS, mHandle); + mAgentsUpdateTime = time; + mFirstAgentRequest = false; + } } // Get the total agents count const S32 LLSimInfo::getAgentCount() const { - S32 total_agent_count = 0; - for (LLSimInfo::item_info_list_t::const_iterator it = mAgentLocations.begin(); it != mAgentLocations.end(); ++it) - { - total_agent_count += it->getCount(); - } - return total_agent_count; + S32 total_agent_count = 0; + for (LLSimInfo::item_info_list_t::const_iterator it = mAgentLocations.begin(); it != mAgentLocations.end(); ++it) + { + total_agent_count += it->getCount(); + } + return total_agent_count; } bool LLSimInfo::isName(const std::string& name) const { - return (LLStringUtil::compareInsensitive(name, mName) == 0); + return (LLStringUtil::compareInsensitive(name, mName) == 0); } void LLSimInfo::dump() const { - U32 x_pos, y_pos; - from_region_handle(mHandle, &x_pos, &y_pos); + U32 x_pos, y_pos; + from_region_handle(mHandle, &x_pos, &y_pos); - LL_INFOS("WorldMap") << x_pos << "," << y_pos - << " " << mName - << " " << (S32)mAccess - << " " << std::hex << mRegionFlags << std::dec -// << " " << mWaterHeight - << LL_ENDL; + LL_INFOS("WorldMap") << x_pos << "," << y_pos + << " " << mName + << " " << (S32)mAccess + << " " << std::hex << mRegionFlags << std::dec +// << " " << mWaterHeight + << LL_ENDL; } void LLSimInfo::clearItems() { - mTelehubs.clear(); - mInfohubs.clear(); - mPGEvents.clear(); - mMatureEvents.clear(); - mAdultEvents.clear(); - mLandForSale.clear(); - mLandForSaleAdult.clear(); + mTelehubs.clear(); + mInfohubs.clear(); + mPGEvents.clear(); + mMatureEvents.clear(); + mAdultEvents.clear(); + mLandForSale.clear(); + mLandForSaleAdult.clear(); // We persist the agent count though as it is updated on a frequent basis -// mAgentLocations.clear(); +// mAgentLocations.clear(); } -void LLSimInfo::insertAgentLocation(const LLItemInfo& item) +void LLSimInfo::insertAgentLocation(const LLItemInfo& item) { - std::string name = item.getName(); + std::string name = item.getName(); - // Find the last item in the list with a different name and erase them - item_info_list_t::iterator lastiter; - for (lastiter = mAgentLocations.begin(); lastiter != mAgentLocations.end(); ++lastiter) - { - LLItemInfo& info = *lastiter; - if (info.isName(name)) - { - break; - } - } - if (lastiter != mAgentLocations.begin()) - { - mAgentLocations.erase(mAgentLocations.begin(), lastiter); - } + // Find the last item in the list with a different name and erase them + item_info_list_t::iterator lastiter; + for (lastiter = mAgentLocations.begin(); lastiter != mAgentLocations.end(); ++lastiter) + { + LLItemInfo& info = *lastiter; + if (info.isName(name)) + { + break; + } + } + if (lastiter != mAgentLocations.begin()) + { + mAgentLocations.erase(mAgentLocations.begin(), lastiter); + } - // Now append the new location - mAgentLocations.push_back(item); + // Now append the new location + mAgentLocations.push_back(item); } //--------------------------------------------------------------------------- @@ -221,170 +221,170 @@ void LLSimInfo::insertAgentLocation(const LLItemInfo& item) //--------------------------------------------------------------------------- LLWorldMap::LLWorldMap() : - mIsTrackingLocation( false ), - mIsTrackingFound( false ), - mIsInvalidLocation( false ), - mIsTrackingDoubleClick( false ), - mIsTrackingCommit( false ), - mTrackingLocation( 0, 0, 0 ), - mFirstRequest(true) + mIsTrackingLocation( false ), + mIsTrackingFound( false ), + mIsInvalidLocation( false ), + mIsTrackingDoubleClick( false ), + mIsTrackingCommit( false ), + mTrackingLocation( 0, 0, 0 ), + mFirstRequest(true) { - //LL_INFOS("WorldMap") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL; - mMapBlockLoaded = new bool[MAP_BLOCK_RES*MAP_BLOCK_RES]; - clearSimFlags(); + //LL_INFOS("WorldMap") << "Creating the World Map -> LLWorldMap::LLWorldMap()" << LL_ENDL; + mMapBlockLoaded = new bool[MAP_BLOCK_RES*MAP_BLOCK_RES]; + clearSimFlags(); } LLWorldMap::~LLWorldMap() { - //LL_INFOS("WorldMap") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL; - reset(); - delete[] mMapBlockLoaded; + //LL_INFOS("WorldMap") << "Destroying the World Map -> LLWorldMap::~LLWorldMap()" << LL_ENDL; + reset(); + delete[] mMapBlockLoaded; } void LLWorldMap::reset() { - clearItems(true); // Clear the items lists - clearImageRefs(); // Clear the world mipmap and the land for sale tiles - clearSimFlags(); // Clear the block info flags array + clearItems(true); // Clear the items lists + clearImageRefs(); // Clear the world mipmap and the land for sale tiles + clearSimFlags(); // Clear the block info flags array - // Finally, clear the region map itself - for_each(mSimInfoMap.begin(), mSimInfoMap.end(), DeletePairedPointer()); - mSimInfoMap.clear(); + // Finally, clear the region map itself + for_each(mSimInfoMap.begin(), mSimInfoMap.end(), DeletePairedPointer()); + mSimInfoMap.clear(); } // Returns true if the items have been cleared bool LLWorldMap::clearItems(bool force) { - bool clear = false; - if ((mRequestTimer.getElapsedTimeF32() > REQUEST_ITEMS_TIMER) || mFirstRequest || force) - { - mRequestTimer.reset(); - - LLSimInfo* sim_info = NULL; - for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) - { - sim_info = it->second; - if (sim_info) - { - sim_info->clearItems(); - } - } - clear = true; - mFirstRequest = false; - } - return clear; + bool clear = false; + if ((mRequestTimer.getElapsedTimeF32() > REQUEST_ITEMS_TIMER) || mFirstRequest || force) + { + mRequestTimer.reset(); + + LLSimInfo* sim_info = NULL; + for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + { + sim_info = it->second; + if (sim_info) + { + sim_info->clearItems(); + } + } + clear = true; + mFirstRequest = false; + } + return clear; } void LLWorldMap::clearImageRefs() { - // We clear the reference to the images we're holding. - // Images hold by the world mipmap first - mWorldMipmap.reset(); + // 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) - { - sim_info = it->second; - if (sim_info) - { - sim_info->clearImage(); - } - } + // Images hold by the region map + LLSimInfo* sim_info = NULL; + for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + { + sim_info = it->second; + if (sim_info) + { + sim_info->clearImage(); + } + } } // Doesn't clear the already-loaded sim infos, just re-requests them void LLWorldMap::clearSimFlags() { - for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx) - { - mMapBlockLoaded[idx] = false; - } + for (S32 idx=0; idx<MAP_BLOCK_RES*MAP_BLOCK_RES; ++idx) + { + mMapBlockLoaded[idx] = false; + } } LLSimInfo* LLWorldMap::createSimInfoFromHandle(const U64 handle) { - LLSimInfo* sim_info = new LLSimInfo(handle); - mSimInfoMap[handle] = sim_info; - return sim_info; + LLSimInfo* sim_info = new LLSimInfo(handle); + mSimInfoMap[handle] = sim_info; + return sim_info; } void LLWorldMap::equalizeBoostLevels() { - mWorldMipmap.equalizeBoostLevels(); - return; + mWorldMipmap.equalizeBoostLevels(); + return; } LLSimInfo* LLWorldMap::simInfoFromPosGlobal(const LLVector3d& pos_global) { - U64 handle = to_region_handle(pos_global); - return simInfoFromHandle(handle); + U64 handle = to_region_handle(pos_global); + return simInfoFromHandle(handle); } LLSimInfo* LLWorldMap::simInfoFromHandle(const U64 handle) { - sim_info_map_t::iterator it = mSimInfoMap.find(handle); - if (it != mSimInfoMap.end()) - { - return it->second; - } - return NULL; + sim_info_map_t::iterator it = mSimInfoMap.find(handle); + if (it != mSimInfoMap.end()) + { + return it->second; + } + return NULL; } LLSimInfo* LLWorldMap::simInfoFromName(const std::string& sim_name) { - LLSimInfo* sim_info = NULL; - if (!sim_name.empty()) - { - // 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 && sim_info->isName(sim_name) ) - { - // break out of loop if success - break; - } - } - // 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; + LLSimInfo* sim_info = NULL; + if (!sim_name.empty()) + { + // 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 && sim_info->isName(sim_name) ) + { + // break out of loop if success + break; + } + } + // 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 ) { - LLSimInfo* sim_info = simInfoFromPosGlobal(pos_global); + LLSimInfo* sim_info = simInfoFromPosGlobal(pos_global); - if (sim_info) - { - outSimName = sim_info->getName(); - } - else - { - outSimName = "(unknown region)"; - } + if (sim_info) + { + outSimName = sim_info->getName(); + } + else + { + outSimName = "(unknown region)"; + } - return (sim_info != NULL); + return (sim_info != NULL); } void LLWorldMap::reloadItems(bool force) { - //LL_INFOS("WorldMap") << "LLWorldMap::reloadItems()" << LL_ENDL; - if (clearItems(force)) - { - LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_TELEHUB); - LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_PG_EVENT); - LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_MATURE_EVENT); - LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_ADULT_EVENT); - LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE); - LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE_ADULT); - } + //LL_INFOS("WorldMap") << "LLWorldMap::reloadItems()" << LL_ENDL; + if (clearItems(force)) + { + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_TELEHUB); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_PG_EVENT); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_MATURE_EVENT); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_ADULT_EVENT); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE); + LLWorldMapMessage::getInstance()->sendItemRequest(MAP_ITEM_LAND_FOR_SALE_ADULT); + } } @@ -393,51 +393,51 @@ void LLWorldMap::reloadItems(bool force) // returns true if region inserted, false otherwise bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& image_id, U32 accesscode, U32 region_flags) { - // This region doesn't exist - if (accesscode == 255) - { - // Checks if the track point is in it and invalidates it if it is - if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS)) - { - LLWorldMap::getInstance()->setTrackingInvalid(); - } - // return failure to insert - return false; - } - else - { - U64 handle = to_region_handle(x_world, y_world); - //LL_INFOS("WorldMap") << "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) - { - siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); - } - siminfo->setName(name); - siminfo->setAccess(accesscode); - siminfo->setRegionFlags(region_flags); - // siminfo->setWaterHeight((F32) water_height); - siminfo->setLandForSaleImage(image_id); - - // Handle the location tracking (for teleport, UI feedback and info display) - if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS)) - { - if (siminfo->isDown()) - { - // We were tracking this location, but it's no available - LLWorldMap::getInstance()->setTrackingInvalid(); - } - else - { - // We were tracking this location, and it does exist and is available - LLWorldMap::getInstance()->setTrackingValid(); - } - } - // return insert region success - return true; - } + // This region doesn't exist + if (accesscode == 255) + { + // Checks if the track point is in it and invalidates it if it is + if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS)) + { + LLWorldMap::getInstance()->setTrackingInvalid(); + } + // return failure to insert + return false; + } + else + { + U64 handle = to_region_handle(x_world, y_world); + //LL_INFOS("WorldMap") << "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) + { + siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); + } + siminfo->setName(name); + siminfo->setAccess(accesscode); + siminfo->setRegionFlags(region_flags); + // siminfo->setWaterHeight((F32) water_height); + siminfo->setLandForSaleImage(image_id); + + // Handle the location tracking (for teleport, UI feedback and info display) + if (LLWorldMap::getInstance()->isTrackingInRectangle( x_world, y_world, x_world + REGION_WIDTH_UNITS, y_world + REGION_WIDTH_UNITS)) + { + if (siminfo->isDown()) + { + // We were tracking this location, but it's no available + LLWorldMap::getInstance()->setTrackingInvalid(); + } + else + { + // We were tracking this location, and it does exist and is available + LLWorldMap::getInstance()->setTrackingValid(); + } + } + // return insert region success + return true; + } } // static public @@ -445,183 +445,183 @@ bool LLWorldMap::insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUI // returns true if item inserted, false otherwise bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2) { - // Create an item record for the received object - LLItemInfo new_item((F32)x_world, (F32)y_world, name, uuid); - - // Compute a region handle based on the objects coordinates - LLVector3d pos((F32)x_world, (F32)y_world, 40.0); - U64 handle = to_region_handle(pos); - - // Get the region record for that handle or NULL if we haven't browsed it yet - LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); - if (siminfo == NULL) - { - siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); - } - - //LL_INFOS("WorldMap") << "Process item : type = " << type << LL_ENDL; - switch (type) - { - case MAP_ITEM_TELEHUB: // telehubs - { - /* Merov: we are not using the hub color anymore for display so commenting that out - // Telehub color - U32 X = x_world / REGION_WIDTH_UNITS; - U32 Y = y_world / REGION_WIDTH_UNITS; - F32 red = fmod((F32)X * 0.11f, 1.f) * 0.8f; - F32 green = fmod((F32)Y * 0.11f, 1.f) * 0.8f; - F32 blue = fmod(1.5f * (F32)(X + Y) * 0.11f, 1.f) * 0.8f; - F32 add_amt = (X % 2) ? 0.15f : -0.15f; - add_amt += (Y % 2) ? -0.15f : 0.15f; - LLColor4 color(red + add_amt, green + add_amt, blue + add_amt); - new_item.setColor(color); - */ - - // extra2 specifies whether this is an infohub or a telehub. - if (extra2) - { - siminfo->insertInfoHub(new_item); - } - else - { - siminfo->insertTeleHub(new_item); - } - break; - } - case MAP_ITEM_PG_EVENT: // events - case MAP_ITEM_MATURE_EVENT: - case MAP_ITEM_ADULT_EVENT: - { - std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:[" - +LLTrans::getString ("TimeMin")+"] [" - +LLTrans::getString ("TimeAMPM")+"]"; - LLSD substitution; - substitution["datetime"] = (S32) extra; - LLStringUtil::format (timeStr, substitution); - new_item.setTooltip(timeStr); - - // HACK: store Z in extra2 - new_item.setElevation((F64)extra2); - if (type == MAP_ITEM_PG_EVENT) - { - siminfo->insertPGEvent(new_item); - } - else if (type == MAP_ITEM_MATURE_EVENT) - { - siminfo->insertMatureEvent(new_item); - } - else if (type == MAP_ITEM_ADULT_EVENT) - { - siminfo->insertAdultEvent(new_item); - } - break; - } - case MAP_ITEM_LAND_FOR_SALE: // land for sale - case MAP_ITEM_LAND_FOR_SALE_ADULT: // adult land for sale - { - static LLUIString tooltip_fmt = LLTrans::getString("worldmap_item_tooltip_format"); - - tooltip_fmt.setArg("[AREA]", llformat("%d", extra)); - tooltip_fmt.setArg("[PRICE]", llformat("%d", extra2)); - - // Check for division by zero - if (extra != 0) - { - tooltip_fmt.setArg("[SQMPRICE]", llformat("%.1f", (F32)extra2 / (F32)extra)); - } - else - { - tooltip_fmt.setArg("[SQMPRICE]", LLTrans::getString("Unknown")); - } - - new_item.setTooltip(tooltip_fmt.getString()); - - if (type == MAP_ITEM_LAND_FOR_SALE) - { - siminfo->insertLandForSale(new_item); - } - else if (type == MAP_ITEM_LAND_FOR_SALE_ADULT) - { - siminfo->insertLandForSaleAdult(new_item); - } - break; - } - case MAP_ITEM_CLASSIFIED: // classifieds - { - //DEPRECATED: no longer used - break; - } - case MAP_ITEM_AGENT_LOCATIONS: // agent locations - { -// LL_INFOS("WorldMap") << "New Location " << new_item.mName << LL_ENDL; - if (extra > 0) - { - new_item.setCount(extra); - siminfo->insertAgentLocation(new_item); - } - break; - } - default: - break; - } - return true; + // Create an item record for the received object + LLItemInfo new_item((F32)x_world, (F32)y_world, name, uuid); + + // Compute a region handle based on the objects coordinates + LLVector3d pos((F32)x_world, (F32)y_world, 40.0); + U64 handle = to_region_handle(pos); + + // Get the region record for that handle or NULL if we haven't browsed it yet + LLSimInfo* siminfo = LLWorldMap::getInstance()->simInfoFromHandle(handle); + if (siminfo == NULL) + { + siminfo = LLWorldMap::getInstance()->createSimInfoFromHandle(handle); + } + + //LL_INFOS("WorldMap") << "Process item : type = " << type << LL_ENDL; + switch (type) + { + case MAP_ITEM_TELEHUB: // telehubs + { + /* Merov: we are not using the hub color anymore for display so commenting that out + // Telehub color + U32 X = x_world / REGION_WIDTH_UNITS; + U32 Y = y_world / REGION_WIDTH_UNITS; + F32 red = fmod((F32)X * 0.11f, 1.f) * 0.8f; + F32 green = fmod((F32)Y * 0.11f, 1.f) * 0.8f; + F32 blue = fmod(1.5f * (F32)(X + Y) * 0.11f, 1.f) * 0.8f; + F32 add_amt = (X % 2) ? 0.15f : -0.15f; + add_amt += (Y % 2) ? -0.15f : 0.15f; + LLColor4 color(red + add_amt, green + add_amt, blue + add_amt); + new_item.setColor(color); + */ + + // extra2 specifies whether this is an infohub or a telehub. + if (extra2) + { + siminfo->insertInfoHub(new_item); + } + else + { + siminfo->insertTeleHub(new_item); + } + break; + } + case MAP_ITEM_PG_EVENT: // events + case MAP_ITEM_MATURE_EVENT: + case MAP_ITEM_ADULT_EVENT: + { + std::string timeStr = "["+ LLTrans::getString ("TimeHour")+"]:[" + +LLTrans::getString ("TimeMin")+"] [" + +LLTrans::getString ("TimeAMPM")+"]"; + LLSD substitution; + substitution["datetime"] = (S32) extra; + LLStringUtil::format (timeStr, substitution); + new_item.setTooltip(timeStr); + + // HACK: store Z in extra2 + new_item.setElevation((F64)extra2); + if (type == MAP_ITEM_PG_EVENT) + { + siminfo->insertPGEvent(new_item); + } + else if (type == MAP_ITEM_MATURE_EVENT) + { + siminfo->insertMatureEvent(new_item); + } + else if (type == MAP_ITEM_ADULT_EVENT) + { + siminfo->insertAdultEvent(new_item); + } + break; + } + case MAP_ITEM_LAND_FOR_SALE: // land for sale + case MAP_ITEM_LAND_FOR_SALE_ADULT: // adult land for sale + { + static LLUIString tooltip_fmt = LLTrans::getString("worldmap_item_tooltip_format"); + + tooltip_fmt.setArg("[AREA]", llformat("%d", extra)); + tooltip_fmt.setArg("[PRICE]", llformat("%d", extra2)); + + // Check for division by zero + if (extra != 0) + { + tooltip_fmt.setArg("[SQMPRICE]", llformat("%.1f", (F32)extra2 / (F32)extra)); + } + else + { + tooltip_fmt.setArg("[SQMPRICE]", LLTrans::getString("Unknown")); + } + + new_item.setTooltip(tooltip_fmt.getString()); + + if (type == MAP_ITEM_LAND_FOR_SALE) + { + siminfo->insertLandForSale(new_item); + } + else if (type == MAP_ITEM_LAND_FOR_SALE_ADULT) + { + siminfo->insertLandForSaleAdult(new_item); + } + break; + } + case MAP_ITEM_CLASSIFIED: // classifieds + { + //DEPRECATED: no longer used + break; + } + case MAP_ITEM_AGENT_LOCATIONS: // agent locations + { +// LL_INFOS("WorldMap") << "New Location " << new_item.mName << LL_ENDL; + if (extra > 0) + { + new_item.setCount(extra); + siminfo->insertAgentLocation(new_item); + } + break; + } + default: + break; + } + return true; } bool LLWorldMap::isTrackingInRectangle(F64 x0, F64 y0, F64 x1, F64 y1) { - if (!mIsTrackingLocation) - return false; - return ((mTrackingLocation[0] >= x0) && (mTrackingLocation[0] < x1) && (mTrackingLocation[1] >= y0) && (mTrackingLocation[1] < y1)); + if (!mIsTrackingLocation) + return false; + return ((mTrackingLocation[0] >= x0) && (mTrackingLocation[0] < x1) && (mTrackingLocation[1] >= y0) && (mTrackingLocation[1] < y1)); } // Drop priority of all images being fetched by the map void LLWorldMap::dropImagePriorities() { - // Drop the download of tiles priority to nil - mWorldMipmap.dropBoostLevels(); - // Same for the "land for sale" tiles per region - for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) - { - LLSimInfo* info = it->second; - info->dropImagePriority(); - } + // Drop the download of tiles priority to nil + mWorldMipmap.dropBoostLevels(); + // Same for the "land for sale" tiles per region + for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + { + LLSimInfo* info = it->second; + info->dropImagePriority(); + } } // Load all regions in a given rectangle (in region grid coordinates, i.e. world / 256 meters) void LLWorldMap::updateRegions(S32 x0, S32 y0, S32 x1, S32 y1) { - // Convert those boundaries to the corresponding (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) block coordinates - x0 = x0 / MAP_BLOCK_SIZE; - x1 = x1 / MAP_BLOCK_SIZE; - y0 = y0 / MAP_BLOCK_SIZE; - y1 = y1 / MAP_BLOCK_SIZE; - - // Load the region info those blocks - for (S32 block_x = llmax(x0, 0); block_x <= llmin(x1, MAP_BLOCK_RES-1); ++block_x) - { - for (S32 block_y = llmax(y0, 0); block_y <= llmin(y1, MAP_BLOCK_RES-1); ++block_y) - { - S32 offset = block_x | (block_y * MAP_BLOCK_RES); - if (!mMapBlockLoaded[offset]) - { - //LL_INFOS("WorldMap") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL; - LLWorldMapMessage::getInstance()->sendMapBlockRequest(block_x * MAP_BLOCK_SIZE, block_y * MAP_BLOCK_SIZE, (block_x * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1, (block_y * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1); - mMapBlockLoaded[offset] = true; - } - } - } + // Convert those boundaries to the corresponding (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) block coordinates + x0 = x0 / MAP_BLOCK_SIZE; + x1 = x1 / MAP_BLOCK_SIZE; + y0 = y0 / MAP_BLOCK_SIZE; + y1 = y1 / MAP_BLOCK_SIZE; + + // Load the region info those blocks + for (S32 block_x = llmax(x0, 0); block_x <= llmin(x1, MAP_BLOCK_RES-1); ++block_x) + { + for (S32 block_y = llmax(y0, 0); block_y <= llmin(y1, MAP_BLOCK_RES-1); ++block_y) + { + S32 offset = block_x | (block_y * MAP_BLOCK_RES); + if (!mMapBlockLoaded[offset]) + { + //LL_INFOS("WorldMap") << "Loading Block (" << block_x << "," << block_y << ")" << LL_ENDL; + LLWorldMapMessage::getInstance()->sendMapBlockRequest(block_x * MAP_BLOCK_SIZE, block_y * MAP_BLOCK_SIZE, (block_x * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1, (block_y * MAP_BLOCK_SIZE) + MAP_BLOCK_SIZE - 1); + mMapBlockLoaded[offset] = true; + } + } + } } void LLWorldMap::dump() { - LL_INFOS("WorldMap") << "LLWorldMap::dump()" << LL_ENDL; - for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) - { - LLSimInfo* info = it->second; - if (info) - { - info->dump(); - } - } + LL_INFOS("WorldMap") << "LLWorldMap::dump()" << LL_ENDL; + for (sim_info_map_t::iterator it = mSimInfoMap.begin(); it != mSimInfoMap.end(); ++it) + { + LLSimInfo* info = it->second; + if (info) + { + info->dump(); + } + } } |