Merge branch 'master' of git://github.com/siana/SingularityViewer.git
This commit is contained in:
@@ -45,11 +45,7 @@
|
||||
#endif
|
||||
|
||||
#define LL_OCTREE_PARANOIA_CHECK 0
|
||||
#if LL_DARWIN
|
||||
#define LL_OCTREE_MAX_CAPACITY 32
|
||||
#else
|
||||
#define LL_OCTREE_MAX_CAPACITY 128
|
||||
#endif
|
||||
|
||||
template <class T> class LLOctreeNode;
|
||||
|
||||
|
||||
@@ -492,8 +492,7 @@ set(viewer_SOURCE_FILES
|
||||
llwlparamset.cpp
|
||||
llworld.cpp
|
||||
llworldmap.cpp
|
||||
llworldmapmessage.cpp
|
||||
llworldmipmap.cpp
|
||||
llmapresponders.cpp
|
||||
llworldmapview.cpp
|
||||
llxmlrpctransaction.cpp
|
||||
noise.cpp
|
||||
@@ -965,8 +964,7 @@ set(viewer_HEADER_FILES
|
||||
llwlparamset.h
|
||||
llworld.h
|
||||
llworldmap.h
|
||||
llworldmapmessage.h
|
||||
llworldmipmap.h
|
||||
llmapresponders.h
|
||||
llworldmapview.h
|
||||
llxmlrpctransaction.h
|
||||
macmain.h
|
||||
|
||||
@@ -7147,6 +7147,17 @@
|
||||
<key>Value</key>
|
||||
<string>http://map.secondlife.com.s3.amazonaws.com/</string>
|
||||
</map>
|
||||
<key>UseWebMapTiles</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use web map tiles whenever possible</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>MapOverlayIndex</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
@@ -7180,10 +7191,10 @@
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>MapShowEvents</key>
|
||||
<key>MapShowPGEvents</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show events on world map</string>
|
||||
<string>Show PG events on world map</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
@@ -7191,6 +7202,28 @@
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>MapShowMatureEvents</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show mature events on world map</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>MapShowAdultEvents</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show adult events on world map</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>MapShowInfohubs</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
#include "lltoolmgr.h"
|
||||
#include "lltoolpie.h"
|
||||
#include "lltoolview.h"
|
||||
#include "lltrans.h"
|
||||
#include "llui.h" // for make_ui_sound
|
||||
#include "llurldispatcher.h"
|
||||
#include "llviewercamera.h"
|
||||
@@ -139,7 +140,6 @@
|
||||
#include "llfollowcam.h"
|
||||
|
||||
#include "llao.h"
|
||||
#include "llworldmapmessage.h"
|
||||
#include "llfollowcam.h"
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-09-27 (RLVa-1.1.3b)
|
||||
@@ -8517,21 +8517,26 @@ std::string LLAgent::getCapability(const std::string& name) const
|
||||
}
|
||||
return iter->second;
|
||||
}
|
||||
// <edit>
|
||||
|
||||
void LLAgent::showLureDestination(const std::string fromname, const int global_x, const int global_y, const int x, const int y, const int z, const std::string maturity)
|
||||
{
|
||||
const LLVector3d posglobal = LLVector3d(F64(global_x), F64(global_y), F64(0));
|
||||
LLSimInfo* siminfo;
|
||||
siminfo = LLWorldMap::getInstance()->simInfoFromPosGlobal(posglobal);
|
||||
std::string sim_name;
|
||||
LLWorldMap::getInstance()->simNameFromPosGlobal( posglobal, sim_name );
|
||||
|
||||
if(siminfo)
|
||||
{
|
||||
llinfos << fromname << "'s teleport lure is to " << siminfo->getName() << " (" << maturity << ")" << llendl;
|
||||
std::string url = LLURLDispatcher::buildSLURL(siminfo->getName(), S32(x), S32(y), S32(z));
|
||||
std::string msg;
|
||||
msg = llformat("%s's teleport lure is to %s", fromname.c_str(), url.c_str());
|
||||
if(maturity != "")
|
||||
llinfos << fromname << "'s teleport lure is to " << sim_name << " (" << maturity << ")" << llendl;
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NAME]"] = fromname;
|
||||
args["[DESTINATION]"] = LLURLDispatcher::buildSLURL(sim_name.c_str(), S32(x), S32(y), S32(z));
|
||||
std::string msg = LLTrans::getString("TeleportLureMaturity", args);
|
||||
if (maturity != "")
|
||||
{
|
||||
msg.append(llformat(" (%s)", maturity.c_str()));
|
||||
}
|
||||
LLChat chat(msg);
|
||||
LLFloaterChat::addChat(chat);
|
||||
}
|
||||
@@ -8546,7 +8551,7 @@ void LLAgent::showLureDestination(const std::string fromname, const int global_x
|
||||
LLAgent::lure_y = y;
|
||||
LLAgent::lure_z = z;
|
||||
LLAgent::lure_maturity = maturity;
|
||||
LLWorldMapMessage::getInstance()->sendMapBlockRequest(lure_global_x, lure_global_y, lure_global_x, lure_global_y, true);
|
||||
LLWorldMap::getInstance()->sendMapBlockRequest(lure_global_x, lure_global_y, lure_global_x, lure_global_y, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8555,14 +8560,19 @@ void LLAgent::onFoundLureDestination()
|
||||
LLAgent::lure_show = FALSE;
|
||||
LLSimInfo* siminfo;
|
||||
siminfo = LLWorldMap::getInstance()->simInfoFromPosGlobal(LLAgent::lure_posglobal);
|
||||
std::string sim_name;
|
||||
LLWorldMap::getInstance()->simNameFromPosGlobal(LLAgent::lure_posglobal, sim_name );
|
||||
if(siminfo)
|
||||
{
|
||||
llinfos << LLAgent::lure_name << "'s teleport lure is to " << siminfo->getName() << " (" << LLAgent::lure_maturity << ")" << llendl;
|
||||
std::string url = LLURLDispatcher::buildSLURL(siminfo->getName(), S32(LLAgent::lure_x), S32(LLAgent::lure_y), S32(LLAgent::lure_z));
|
||||
std::string msg;
|
||||
msg = llformat("%s's teleport lure is to %s", LLAgent::lure_name.c_str(), url.c_str());
|
||||
if(LLAgent::lure_maturity != "")
|
||||
llinfos << LLAgent::lure_name << "'s teleport lure is to " << sim_name << " (" << LLAgent::lure_maturity << ")" << llendl;
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NAME]"] = LLAgent::lure_name;
|
||||
args["[DESTINATION]"] = LLURLDispatcher::buildSLURL(sim_name, S32(LLAgent::lure_x), S32(LLAgent::lure_y), S32(LLAgent::lure_z));
|
||||
std::string msg = LLTrans::getString("TeleportOfferMaturity", args);
|
||||
if (LLAgent::lure_maturity != "")
|
||||
{
|
||||
msg.append(llformat(" (%s)", LLAgent::lure_maturity.c_str()));
|
||||
}
|
||||
LLChat chat(msg);
|
||||
LLFloaterChat::addChat(chat);
|
||||
}
|
||||
@@ -8570,7 +8580,6 @@ void LLAgent::onFoundLureDestination()
|
||||
llwarns << "Grand scheme failed" << llendl;
|
||||
}
|
||||
|
||||
// </edit>
|
||||
|
||||
// EOF
|
||||
|
||||
|
||||
@@ -87,6 +87,16 @@ LLFloaterAbout* LLFloaterAbout::sInstance = NULL;
|
||||
|
||||
static std::string get_viewer_release_notes_url();
|
||||
|
||||
static void onAboutClickCopyToClipboard(void* user_data)
|
||||
{
|
||||
LLFloater* self = (LLFloater*) user_data;
|
||||
LLViewerTextEditor *support_widget =
|
||||
self->getChild<LLViewerTextEditor>("support_editor", true);
|
||||
support_widget->selectAll();
|
||||
support_widget->copy();
|
||||
support_widget->deselect();
|
||||
}
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
/// Class LLFloaterAbout
|
||||
///----------------------------------------------------------------------------
|
||||
@@ -107,7 +117,8 @@ LLFloaterAbout::LLFloaterAbout()
|
||||
|
||||
LLViewerTextEditor *credits_widget =
|
||||
getChild<LLViewerTextEditor>("credits_editor", true);
|
||||
|
||||
|
||||
childSetAction("copy_btn", onAboutClickCopyToClipboard, this);
|
||||
|
||||
if (!support_widget || !credits_widget)
|
||||
{
|
||||
@@ -264,7 +275,7 @@ LLFloaterAbout::LLFloaterAbout()
|
||||
|
||||
// TODO: Implement media plugin version query
|
||||
|
||||
support.append("Qt Webkit Version: 4.5.2 ");
|
||||
support.append("Qt Webkit Version: 4.6.0 ");
|
||||
support.append("\n");
|
||||
|
||||
if (gPacketsIn > 0)
|
||||
@@ -315,7 +326,8 @@ void LLFloaterAbout::show(void*)
|
||||
|
||||
static std::string get_viewer_release_notes_url()
|
||||
{
|
||||
std::ostringstream version;
|
||||
return "http://www.singularityviewer.org";
|
||||
/*std::ostringstream version;
|
||||
version << LL_VERSION_MAJOR
|
||||
<< "." << LL_VERSION_MINOR
|
||||
<< "." << LL_VERSION_PATCH
|
||||
@@ -329,5 +341,6 @@ static std::string get_viewer_release_notes_url()
|
||||
std::ostringstream url;
|
||||
url << RELEASE_NOTES_BASE_URL << LLURI::mapToQueryString(query);
|
||||
|
||||
return "http://ascent.balseraph.org/index.php/Ascent_" + version.str();// url.str();
|
||||
return "http://ascent.balseraph.org/index.php/Ascent_" + version.str();// url.str();*/
|
||||
}
|
||||
|
||||
|
||||
@@ -61,9 +61,7 @@
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerstats.h"
|
||||
#include "llviewerimage.h"
|
||||
#include "llworldmap.h"
|
||||
#include "llworldmapmessage.h"
|
||||
#include "llworldmapview.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llappviewer.h"
|
||||
@@ -81,12 +79,6 @@
|
||||
//---------------------------------------------------------------------------
|
||||
static const F32 MAP_ZOOM_TIME = 0.2f;
|
||||
|
||||
// Merov: we switched from using the "world size" (which varies depending where the user went) to a fixed
|
||||
// width of 512 regions max visible at a time. This makes the zoom slider works in a consistent way across
|
||||
// sessions and doesn't prevent the user to pan the world if it was to grow a lot beyond that limit.
|
||||
// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
|
||||
static const S32 MAX_VISIBLE_REGIONS = 512;
|
||||
|
||||
enum EPanDirection
|
||||
{
|
||||
PAN_UP,
|
||||
@@ -175,6 +167,7 @@ LLFloaterWorldMap::LLFloaterWorldMap()
|
||||
{
|
||||
LLCallbackMap::map_t factory_map;
|
||||
factory_map["objects_mapview"] = LLCallbackMap(createWorldMapView, NULL);
|
||||
factory_map["terrain_mapview"] = LLCallbackMap(createWorldMapView, NULL);
|
||||
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_world_map.xml", &factory_map);
|
||||
}
|
||||
|
||||
@@ -186,7 +179,30 @@ void* LLFloaterWorldMap::createWorldMapView(void* data)
|
||||
|
||||
BOOL LLFloaterWorldMap::postBuild()
|
||||
{
|
||||
mPanel = getChild<LLPanel>("objects_mapview");
|
||||
mTabs = getChild<LLTabContainer>("maptab");
|
||||
if (!mTabs) return FALSE;
|
||||
|
||||
LLPanel *panel;
|
||||
|
||||
panel = mTabs->getChild<LLPanel>("objects_mapview");
|
||||
if (panel)
|
||||
{
|
||||
mTabs->setTabChangeCallback(panel, onCommitBackground);
|
||||
mTabs->setTabUserData(panel, this);
|
||||
}
|
||||
panel = mTabs->getChild<LLPanel>("terrain_mapview");
|
||||
if (panel)
|
||||
{
|
||||
mTabs->setTabChangeCallback(panel, onCommitBackground);
|
||||
mTabs->setTabUserData(panel, this);
|
||||
}
|
||||
|
||||
// The following callback syncs the worlmap tabs with the images.
|
||||
// Commented out since it was crashing when LLWorldMap became a singleton.
|
||||
// We should be fine without it but override the onOpen method and put it
|
||||
// there if it turns out to be needed. -MG
|
||||
//
|
||||
//onCommitBackground((void*)this, false);
|
||||
|
||||
childSetCommitCallback("friend combo", onAvatarComboCommit, this);
|
||||
|
||||
@@ -247,7 +263,7 @@ BOOL LLFloaterWorldMap::postBuild()
|
||||
LLFloaterWorldMap::~LLFloaterWorldMap()
|
||||
{
|
||||
// All cleaned up by LLView destructor
|
||||
mPanel = NULL;
|
||||
mTabs = NULL;
|
||||
|
||||
// Inventory deletes all observers on shutdown
|
||||
mInventory = NULL;
|
||||
@@ -280,7 +296,7 @@ void LLFloaterWorldMap::show(void*, BOOL center_on_target)
|
||||
gFloaterWorldMap->open(); /* Flawfinder: ignore */
|
||||
|
||||
LLWorldMapView* map_panel;
|
||||
map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel;
|
||||
map_panel = (LLWorldMapView*)gFloaterWorldMap->mTabs->getCurrentPanel();
|
||||
map_panel->clearLastClick();
|
||||
|
||||
if (!was_visible)
|
||||
@@ -292,8 +308,15 @@ void LLFloaterWorldMap::show(void*, BOOL center_on_target)
|
||||
}
|
||||
map_panel->updateVisibleBlocks();
|
||||
|
||||
// Reload items as they may have changed
|
||||
LLWorldMap::getInstance()->reloadItems();
|
||||
// Reload the agent positions when we show the window
|
||||
LLWorldMap::getInstance()->eraseItems();
|
||||
|
||||
// Reload any maps that may have changed
|
||||
LLWorldMap::getInstance()->clearSimFlags();
|
||||
|
||||
const S32 panel_num = gFloaterWorldMap->mTabs->getCurrentPanelIndex();
|
||||
const bool request_from_sim = true;
|
||||
LLWorldMap::getInstance()->setCurrentLayer(panel_num, request_from_sim);
|
||||
|
||||
// We may already have a bounding box for the regions of the world,
|
||||
// so use that to adjust the view.
|
||||
@@ -327,7 +350,9 @@ void LLFloaterWorldMap::show(void*, BOOL center_on_target)
|
||||
// static
|
||||
void LLFloaterWorldMap::reloadIcons(void*)
|
||||
{
|
||||
LLWorldMap::getInstance()->reloadItems();
|
||||
LLWorldMap::getInstance()->eraseItems();
|
||||
|
||||
LLWorldMap::getInstance()->sendMapLayerRequest();
|
||||
}
|
||||
|
||||
|
||||
@@ -365,7 +390,7 @@ void LLFloaterWorldMap::setVisible( BOOL visible )
|
||||
|
||||
if( !visible )
|
||||
{
|
||||
// While we're not visible, discard the image tiles and overlays
|
||||
// While we're not visible, discard the overlay images we're using
|
||||
LLWorldMap::getInstance()->clearImageRefs();
|
||||
}
|
||||
}
|
||||
@@ -402,6 +427,12 @@ BOOL LLFloaterWorldMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
||||
void LLFloaterWorldMap::reshape( S32 width, S32 height, BOOL called_from_parent )
|
||||
{
|
||||
LLFloater::reshape( width, height, called_from_parent );
|
||||
|
||||
// Might have changed size of world display area
|
||||
// JC: Technically, this is correct, but it makes the slider "pop"
|
||||
// if you resize the window, then draw the slider. Just leaving it
|
||||
// the way it was when you opened the window seems better.
|
||||
// adjustZoomSliderBounds();
|
||||
}
|
||||
|
||||
|
||||
@@ -480,7 +511,7 @@ void LLFloaterWorldMap::draw()
|
||||
|
||||
childSetEnabled("Teleport", (BOOL)tracking_status);
|
||||
// childSetEnabled("Clear", (BOOL)tracking_status);
|
||||
childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->isTracking());
|
||||
childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->mIsTrackingUnknownLocation);
|
||||
childSetEnabled("copy_slurl", (mSLURL.size() > 0) );
|
||||
|
||||
setMouseOpaque(TRUE);
|
||||
@@ -501,18 +532,6 @@ void LLFloaterWorldMap::draw()
|
||||
F32 map_scale = 256.f*pow(2.f, mCurZoomVal);
|
||||
LLWorldMapView::setScale( map_scale );
|
||||
|
||||
// Enable/disable checkboxes depending on the zoom level
|
||||
// If above threshold level (i.e. low res) -> Disable all checkboxes
|
||||
// If under threshold level (i.e. high res) -> Enable all checkboxes
|
||||
bool enable = LLWorldMapView::showRegionInfo();
|
||||
childSetEnabled("people_chk", enable);
|
||||
childSetEnabled("infohub_chk", enable);
|
||||
childSetEnabled("telehubchk", enable);
|
||||
childSetEnabled("land_for_sale_chk", enable);
|
||||
childSetEnabled("event_chk", enable);
|
||||
childSetEnabled("event_mature_chk", enable);
|
||||
childSetEnabled("event_adult_chk", enable);
|
||||
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
||||
@@ -600,14 +619,14 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
|
||||
void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info)
|
||||
{
|
||||
mTrackedStatus = LLTracker::TRACKING_LOCATION;
|
||||
LLTracker::trackLocation(event_info.getGlobalPosition(), event_info.getName(), event_info.getToolTip(), LLTracker::LOCATION_EVENT);
|
||||
LLTracker::trackLocation(event_info.mPosGlobal, event_info.mName, event_info.mToolTip, LLTracker::LOCATION_EVENT);
|
||||
setDefaultBtn("Teleport");
|
||||
}
|
||||
|
||||
void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item)
|
||||
{
|
||||
mTrackedStatus = LLTracker::TRACKING_LOCATION;
|
||||
LLTracker::trackLocation(item.getGlobalPosition(), item.getName(), item.getToolTip(), LLTracker::LOCATION_ITEM);
|
||||
LLTracker::trackLocation(item.mPosGlobal, item.mName, item.mToolTip, LLTracker::LOCATION_ITEM);
|
||||
setDefaultBtn("Teleport");
|
||||
}
|
||||
|
||||
@@ -616,27 +635,29 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
|
||||
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
|
||||
if (!sim_info)
|
||||
{
|
||||
// We haven't found a region for that point yet, leave the tracking to the world map
|
||||
LLWorldMap::getInstance()->setTracking(pos_global);
|
||||
LLWorldMap::getInstance()->mIsTrackingUnknownLocation = TRUE;
|
||||
LLWorldMap::getInstance()->mInvalidLocation = FALSE;
|
||||
LLWorldMap::getInstance()->mUnknownLocation = pos_global;
|
||||
LLTracker::stopTracking(NULL);
|
||||
S32 world_x = S32(pos_global.mdV[0] / 256);
|
||||
S32 world_y = S32(pos_global.mdV[1] / 256);
|
||||
LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true);
|
||||
LLWorldMap::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true);
|
||||
setDefaultBtn("");
|
||||
return;
|
||||
}
|
||||
if (sim_info->isDown())
|
||||
if (sim_info->mAccess == SIM_ACCESS_DOWN)
|
||||
{
|
||||
// Down region. Show the blue circle of death!
|
||||
// i.e. let the world map that this and tell it it's invalid
|
||||
LLWorldMap::getInstance()->setTracking(pos_global);
|
||||
LLWorldMap::getInstance()->setTrackingInvalid();
|
||||
// Down sim. Show the blue circle of death!
|
||||
LLWorldMap::getInstance()->mIsTrackingUnknownLocation = TRUE;
|
||||
LLWorldMap::getInstance()->mUnknownLocation = pos_global;
|
||||
LLWorldMap::getInstance()->mInvalidLocation = TRUE;
|
||||
LLTracker::stopTracking(NULL);
|
||||
setDefaultBtn("");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string sim_name = sim_info->getName();
|
||||
std::string sim_name;
|
||||
LLWorldMap::getInstance()->simNameFromPosGlobal( pos_global, sim_name );
|
||||
F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS );
|
||||
F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS );
|
||||
std::string full_name = llformat("%s (%d, %d, %d)",
|
||||
@@ -651,7 +672,9 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
|
||||
std::string tooltip("");
|
||||
mTrackedStatus = LLTracker::TRACKING_LOCATION;
|
||||
LLTracker::trackLocation(pos_global, full_name, tooltip);
|
||||
LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking
|
||||
LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE;
|
||||
LLWorldMap::getInstance()->mIsTrackingDoubleClick = FALSE;
|
||||
LLWorldMap::getInstance()->mIsTrackingCommit = FALSE;
|
||||
|
||||
setDefaultBtn("Teleport");
|
||||
}
|
||||
@@ -780,9 +803,9 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3
|
||||
|
||||
// pass sim name to combo box
|
||||
gFloaterWorldMap->mCompletingRegionName = region_name;
|
||||
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name);
|
||||
LLWorldMap::getInstance()->sendNamedRegionRequest(region_name);
|
||||
LLStringUtil::toLower(gFloaterWorldMap->mCompletingRegionName);
|
||||
LLWorldMap::getInstance()->setTrackingCommit();
|
||||
LLWorldMap::getInstance()->mIsTrackingCommit = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -963,7 +986,7 @@ void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui)
|
||||
{
|
||||
childSetValue("spin z", 0);
|
||||
}
|
||||
LLWorldMap::getInstance()->cancelTracking();
|
||||
LLWorldMap::getInstance()->mIsTrackingCommit = FALSE;
|
||||
mCompletingRegionName = "";
|
||||
mExactMatch = FALSE;
|
||||
}
|
||||
@@ -1000,16 +1023,18 @@ void LLFloaterWorldMap::clearAvatarSelection(BOOL clear_ui)
|
||||
// can see the whole world, plus a little.
|
||||
void LLFloaterWorldMap::adjustZoomSliderBounds()
|
||||
{
|
||||
// Merov: we switched from using the "world size" (which varies depending where the user went) to a fixed
|
||||
// width of 512 regions max visible at a time. This makes the zoom slider works in a consistent way across
|
||||
// sessions and doesn't prevent the user to pan the world if it was to grow a lot beyond that limit.
|
||||
// Currently (01/26/09), this value allows the whole grid to be visible in a 1024x1024 window.
|
||||
S32 world_width_regions = MAX_VISIBLE_REGIONS;
|
||||
S32 world_height_regions = MAX_VISIBLE_REGIONS;
|
||||
// World size in regions
|
||||
S32 world_width_regions = LLWorldMap::getInstance()->getWorldWidth() / REGION_WIDTH_UNITS;
|
||||
S32 world_height_regions = LLWorldMap::getInstance()->getWorldHeight() / REGION_WIDTH_UNITS;
|
||||
|
||||
// Pad the world size a little bit, so we have a nice border on
|
||||
// the edge
|
||||
world_width_regions++;
|
||||
world_height_regions++;
|
||||
|
||||
// Find how much space we have to display the world
|
||||
LLWorldMapView* map_panel;
|
||||
map_panel = (LLWorldMapView*)mPanel;
|
||||
map_panel = (LLWorldMapView*)mTabs->getCurrentPanel();
|
||||
LLRect view_rect = map_panel->getRect();
|
||||
|
||||
// View size in pixels
|
||||
@@ -1059,7 +1084,7 @@ void LLFloaterWorldMap::onPanBtn( void* userdata )
|
||||
}
|
||||
|
||||
LLWorldMapView* map_panel;
|
||||
map_panel = (LLWorldMapView*)gFloaterWorldMap->mPanel;
|
||||
map_panel = (LLWorldMapView*)gFloaterWorldMap->mTabs->getCurrentPanel();
|
||||
map_panel->translatePan( pan_x, pan_y );
|
||||
}
|
||||
|
||||
@@ -1259,16 +1284,16 @@ void LLFloaterWorldMap::onLocationCommit( void* userdata )
|
||||
|
||||
LLStringUtil::toLower(str);
|
||||
gFloaterWorldMap->mCompletingRegionName = str;
|
||||
LLWorldMap::getInstance()->setTrackingCommit();
|
||||
LLWorldMap::getInstance()->mIsTrackingCommit = TRUE;
|
||||
self->mExactMatch = FALSE;
|
||||
if (str.length() >= 3)
|
||||
{
|
||||
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(str);
|
||||
LLWorldMap::getInstance()->sendNamedRegionRequest(str);
|
||||
}
|
||||
else
|
||||
{
|
||||
str += "#";
|
||||
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(str);
|
||||
LLWorldMap::getInstance()->sendNamedRegionRequest(str);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1279,7 +1304,7 @@ void LLFloaterWorldMap::onClearBtn(void* data)
|
||||
LLFloaterWorldMap* self = (LLFloaterWorldMap*)data;
|
||||
self->mTrackedStatus = LLTracker::TRACKING_NOTHING;
|
||||
LLTracker::stopTracking((void *)(intptr_t)TRUE);
|
||||
LLWorldMap::getInstance()->cancelTracking();
|
||||
LLWorldMap::getInstance()->mIsTrackingUnknownLocation = FALSE;
|
||||
self->mSLURL = ""; // Clear the SLURL since it's invalid
|
||||
self->mSetToUserPosition = TRUE; // Revert back to the current user position
|
||||
}
|
||||
@@ -1354,9 +1379,9 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate)
|
||||
pos_global = LLTracker::getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();
|
||||
}
|
||||
}
|
||||
else if(LLWorldMap::getInstance()->isTracking())
|
||||
else if(LLWorldMap::getInstance()->mIsTrackingUnknownLocation)
|
||||
{
|
||||
pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();;
|
||||
pos_global = LLWorldMap::getInstance()->mUnknownLocation - gAgent.getCameraPositionGlobal();;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1364,8 +1389,8 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate)
|
||||
pos_global.clearVec();
|
||||
}
|
||||
|
||||
LLWorldMapView::setPan( -llfloor((F32)(pos_global.mdV[VX] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)),
|
||||
-llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sMapScale / REGION_WIDTH_METERS)),
|
||||
LLWorldMapView::setPan( -llfloor((F32)(pos_global.mdV[VX] * (F64)LLWorldMapView::sPixelsPerMeter)),
|
||||
-llfloor((F32)(pos_global.mdV[VY] * (F64)LLWorldMapView::sPixelsPerMeter)),
|
||||
!animate);
|
||||
mWaitingForTracker = FALSE;
|
||||
}
|
||||
@@ -1541,6 +1566,17 @@ void LLFloaterWorldMap::flyToAvatar()
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFloaterWorldMap::onCommitBackground(void* userdata, bool from_click)
|
||||
{
|
||||
LLFloaterWorldMap* self = (LLFloaterWorldMap*) userdata;
|
||||
|
||||
// Find my index
|
||||
S32 index = self->mTabs->getCurrentPanelIndex();
|
||||
|
||||
LLWorldMap::getInstance()->setCurrentLayer(index);
|
||||
}
|
||||
|
||||
void LLFloaterWorldMap::updateSims(bool found_null_sim)
|
||||
{
|
||||
if (mCompletingRegionName == "")
|
||||
@@ -1558,27 +1594,28 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)
|
||||
BOOL match_found = FALSE;
|
||||
S32 num_results = 0;
|
||||
std::map<U64, LLSimInfo*>::const_iterator it;
|
||||
for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
|
||||
for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)
|
||||
{
|
||||
LLSimInfo* info = it->second;
|
||||
std::string sim_name_lower = info->getName();
|
||||
LLSimInfo* info = (*it).second;
|
||||
std::string sim_name = info->mName;
|
||||
std::string sim_name_lower = sim_name;
|
||||
LLStringUtil::toLower(sim_name_lower);
|
||||
|
||||
if (sim_name_lower.substr(0, name_length) == mCompletingRegionName)
|
||||
{
|
||||
if (LLWorldMap::getInstance()->isTrackingCommit())
|
||||
if (LLWorldMap::getInstance()->mIsTrackingCommit)
|
||||
{
|
||||
if (info->isName(mCompletingRegionName))
|
||||
if (sim_name_lower == mCompletingRegionName)
|
||||
{
|
||||
selected_value = info->getName();
|
||||
selected_value = sim_name;
|
||||
match_found = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
LLSD value;
|
||||
value["id"] = info->getName();
|
||||
value["id"] = sim_name;
|
||||
value["columns"][0]["column"] = "sim_name";
|
||||
value["columns"][0]["value"] = info->getName();
|
||||
value["columns"][0]["value"] = sim_name;
|
||||
list->addElement(value);
|
||||
num_results++;
|
||||
}
|
||||
@@ -1645,13 +1682,15 @@ void LLFloaterWorldMap::onCommitSearchResult(LLUICtrl*, void* userdata)
|
||||
LLStringUtil::toLower(sim_name);
|
||||
|
||||
std::map<U64, LLSimInfo*>::const_iterator it;
|
||||
for (it = LLWorldMap::getInstance()->getRegionMap().begin(); it != LLWorldMap::getInstance()->getRegionMap().end(); ++it)
|
||||
for (it = LLWorldMap::getInstance()->mSimInfoMap.begin(); it != LLWorldMap::getInstance()->mSimInfoMap.end(); ++it)
|
||||
{
|
||||
LLSimInfo* info = it->second;
|
||||
LLSimInfo* info = (*it).second;
|
||||
std::string info_sim_name = info->mName;
|
||||
LLStringUtil::toLower(info_sim_name);
|
||||
|
||||
if (info->isName(sim_name))
|
||||
if (sim_name == info_sim_name)
|
||||
{
|
||||
LLVector3d pos_global = info->getGlobalOrigin();
|
||||
LLVector3d pos_global = from_region_handle( info->mHandle );
|
||||
F64 local_x = self->childGetValue("spin x");
|
||||
F64 local_y = self->childGetValue("spin y");
|
||||
F64 local_z = self->childGetValue("spin z");
|
||||
|
||||
@@ -50,6 +50,7 @@ class LLInventoryModel;
|
||||
class LLInventoryObserver;
|
||||
class LLItemInfo;
|
||||
class LLTabContainer;
|
||||
class LLWorldMapView;
|
||||
|
||||
class LLFloaterWorldMap : public LLFloater
|
||||
{
|
||||
@@ -111,7 +112,7 @@ public:
|
||||
// teleport to the tracked item, if there is one
|
||||
void teleport();
|
||||
|
||||
private:
|
||||
protected:
|
||||
static void onPanBtn( void* userdata );
|
||||
|
||||
static void onGoHome(void* data);
|
||||
@@ -122,6 +123,8 @@ private:
|
||||
static void onAvatarComboPrearrange( LLUICtrl* ctrl, void* data );
|
||||
static void onAvatarComboCommit( LLUICtrl* ctrl, void* data );
|
||||
|
||||
static void onCommitBackground(void* data, bool from_click);
|
||||
|
||||
static void onComboTextEntry( LLLineEditor* ctrl, void* data );
|
||||
static void onSearchTextEntry( LLLineEditor* ctrl, void* data );
|
||||
|
||||
@@ -158,10 +161,10 @@ private:
|
||||
|
||||
void cacheLandmarkPosition();
|
||||
|
||||
private:
|
||||
LLPanel* mPanel; // Panel displaying the map
|
||||
protected:
|
||||
LLTabContainer* mTabs;
|
||||
|
||||
// Ties to LLWorldMapView::sMapScale, in pixels per region
|
||||
// Sets sMapScale, in pixels per region
|
||||
F32 mCurZoomVal;
|
||||
LLFrameTimer mZoomTimer;
|
||||
|
||||
|
||||
224
indra/newview/llmapresponders.cpp
Normal file
224
indra/newview/llmapresponders.cpp
Normal file
@@ -0,0 +1,224 @@
|
||||
/**
|
||||
* @file llmapresponders.cpp
|
||||
* @brief Processes responses received for map requests.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2006-2010, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llmapresponders.h"
|
||||
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "llviewerimagelist.h"
|
||||
#include "llworldmap.h"
|
||||
#include "llagent.h"
|
||||
|
||||
//virtual
|
||||
void LLMapLayerResponder::result(const LLSD& result)
|
||||
{
|
||||
llinfos << "LLMapLayerResponder::result from capabilities" << llendl;
|
||||
|
||||
S32 agent_flags = result["AgentData"]["Flags"];
|
||||
|
||||
if (agent_flags != LLWorldMap::getInstance()->mCurrentMap)
|
||||
{
|
||||
llwarns << "Invalid or out of date map image type returned!" << llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
LLUUID image_id;
|
||||
//U32 left, right, top, bottom;
|
||||
|
||||
LLWorldMap::getInstance()->mMapLayers[agent_flags].clear();
|
||||
|
||||
bool use_web_map_tiles = LLWorldMap::useWebMapTiles();
|
||||
|
||||
LLSD::array_const_iterator iter;
|
||||
BOOL adjust = FALSE;
|
||||
for(iter = result["LayerData"].beginArray(); iter != result["LayerData"].endArray(); ++iter)
|
||||
{
|
||||
const LLSD& layer_data = *iter;
|
||||
|
||||
LLWorldMapLayer new_layer;
|
||||
new_layer.LayerDefined = TRUE;
|
||||
|
||||
new_layer.LayerExtents.mLeft = layer_data["Left"];
|
||||
new_layer.LayerExtents.mRight = layer_data["Right"];
|
||||
new_layer.LayerExtents.mBottom = layer_data["Bottom"];
|
||||
new_layer.LayerExtents.mTop = layer_data["Top"];
|
||||
|
||||
new_layer.LayerImageID = layer_data["ImageID"];
|
||||
// if (use_web_map_tiles)
|
||||
// {
|
||||
// new_layer.LayerImage = LLWorldMap::loadObjectsTile((U32)new_layer.LayerExtents.mLeft, (U32)new_layer.LayerExtents.mBottom); // no good... Maybe using of level 2 and higher web maps ?
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
new_layer.LayerImage = gImageList.getImage(new_layer.LayerImageID, MIPMAP_TRUE, FALSE);
|
||||
// }
|
||||
gGL.getTexUnit(0)->bind(new_layer.LayerImage.get());
|
||||
new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP);
|
||||
|
||||
F32 x_meters = F32(new_layer.LayerExtents.mLeft*REGION_WIDTH_UNITS);
|
||||
F32 y_meters = F32(new_layer.LayerExtents.mBottom*REGION_WIDTH_UNITS);
|
||||
adjust = LLWorldMap::getInstance()->extendAABB(U32(x_meters), U32(y_meters),
|
||||
U32(x_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getWidth()),
|
||||
U32(y_meters+REGION_WIDTH_UNITS*new_layer.LayerExtents.getHeight())) || adjust;
|
||||
|
||||
LLWorldMap::getInstance()->mMapLayers[agent_flags].push_back(new_layer);
|
||||
}
|
||||
|
||||
LLWorldMap::getInstance()->mMapLoaded[agent_flags] = TRUE;
|
||||
if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();
|
||||
|
||||
/*
|
||||
U32 agent_flags;
|
||||
msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
|
||||
|
||||
if (agent_flags < 0 || agent_flags >= MAP_SIM_IMAGE_TYPES)
|
||||
{
|
||||
llwarns << "Invalid map image type returned! " << agent_flags << llendl;
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
bool found_null_sim = false;
|
||||
|
||||
adjust = FALSE;
|
||||
if (result.has("MapBlocks"))
|
||||
{
|
||||
const LLSD& map_blocks = result["MapBlocks"];
|
||||
for (iter = map_blocks.beginArray(); iter != map_blocks.endArray(); ++iter)
|
||||
{
|
||||
const LLSD& map_block = *iter;
|
||||
|
||||
S32 x_regions = map_block["X"];
|
||||
S32 y_regions = map_block["Y"];
|
||||
std::string name = map_block["Name"];
|
||||
S32 access = map_block["Access"];
|
||||
S32 region_flags = map_block["RegionFlags"];
|
||||
S32 water_height = map_block["WaterHeight"];
|
||||
LLUUID image_id = map_block["MapImageID"];
|
||||
|
||||
U32 x_meters = x_regions * REGION_WIDTH_UNITS;
|
||||
U32 y_meters = y_regions * REGION_WIDTH_UNITS;
|
||||
|
||||
if (access == 255)
|
||||
{
|
||||
// This region doesn't exist
|
||||
if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256)
|
||||
{
|
||||
// We were tracking this location, but it doesn't exist
|
||||
LLWorldMap::getInstance()->mInvalidLocation = TRUE;
|
||||
}
|
||||
|
||||
found_null_sim = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
adjust = LLWorldMap::getInstance()->extendAABB(x_meters,
|
||||
y_meters,
|
||||
x_meters+REGION_WIDTH_UNITS,
|
||||
y_meters+REGION_WIDTH_UNITS) || adjust;
|
||||
U64 handle = to_region_handle(x_meters, y_meters);
|
||||
|
||||
// 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* oldinfo = iter->second;
|
||||
for (S32 image=0; image<MAP_SIM_IMAGE_TYPES; ++image)
|
||||
{
|
||||
siminfo->mMapImageID[image] = oldinfo->mMapImageID[image];
|
||||
}
|
||||
delete oldinfo;
|
||||
}
|
||||
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;
|
||||
if (use_web_map_tiles)
|
||||
{
|
||||
siminfo->mCurrentImage = LLWorldMap::loadObjectsTile((U32)x_regions, (U32)y_regions);
|
||||
}
|
||||
else
|
||||
{
|
||||
siminfo->mCurrentImage = gImageList.getImage(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE);
|
||||
}
|
||||
siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
|
||||
gGL.getTexUnit(0)->bind(siminfo->mCurrentImage.get());
|
||||
|
||||
if (siminfo->mMapImageID[2].notNull())
|
||||
{
|
||||
siminfo->mOverlayImage = gImageList.getImage(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
siminfo->mOverlayImage = NULL;
|
||||
}
|
||||
|
||||
if (LLWorldMap::getInstance()->mIsTrackingUnknownLocation &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[0] >= x_meters &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[0] < x_meters + 256 &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[1] >= y_meters &&
|
||||
LLWorldMap::getInstance()->mUnknownLocation.mdV[1] < y_meters + 256)
|
||||
{
|
||||
if (siminfo->mAccess == SIM_ACCESS_DOWN)
|
||||
{
|
||||
// We were tracking this location, but it doesn't exist
|
||||
LLWorldMap::getInstance()->mInvalidLocation = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// We were tracking this location, and it does exist
|
||||
bool is_tracking_dbl = LLWorldMap::getInstance()->mIsTrackingDoubleClick == TRUE;
|
||||
gFloaterWorldMap->trackLocation(LLWorldMap::getInstance()->mUnknownLocation);
|
||||
if (is_tracking_dbl)
|
||||
{
|
||||
LLVector3d pos_global = LLTracker::getTrackedPositionGlobal();
|
||||
gAgent.teleportViaLocation( pos_global );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();
|
||||
gFloaterWorldMap->updateSims(found_null_sim);
|
||||
}
|
||||
43
indra/newview/llmapresponders.h
Normal file
43
indra/newview/llmapresponders.h
Normal file
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* @file llmapresponders.h
|
||||
* @brief Processes responses received for map requests.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2006&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2006-2010, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLMAPLAYERRESPONDER_H
|
||||
#define LL_LLMAPLAYERRESPONDER_H
|
||||
|
||||
#include "llhttpclient.h"
|
||||
|
||||
class LLMapLayerResponder : public LLHTTPClient::Responder
|
||||
{
|
||||
virtual void result(const LLSD& content);
|
||||
};
|
||||
|
||||
#endif // LL_LLMAPLAYERRESPONDER_H
|
||||
@@ -80,10 +80,10 @@
|
||||
// [/RLVa:KB]
|
||||
|
||||
const F32 MAP_SCALE_MIN = 32;
|
||||
const F32 MAP_SCALE_MID = 1024;
|
||||
const F32 MAP_SCALE_MID = 256;
|
||||
const F32 MAP_SCALE_MAX = 4096;
|
||||
const F32 MAP_SCALE_INCREMENT = 16;
|
||||
const F32 MAP_SCALE_ZOOM_FACTOR = 1.04f; // Zoom in factor per click of the scroll wheel (4%)
|
||||
const F32 MAP_SCALE_ZOOM_FACTOR = 1.1f; // Zoom in factor per click of the scroll wheel (10%)
|
||||
const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f;
|
||||
const F32 MIN_DOT_RADIUS = 3.5f;
|
||||
const F32 DOT_SCALE = 0.75f;
|
||||
@@ -198,7 +198,7 @@ void LLNetMap::draw()
|
||||
createObjectImage();
|
||||
}
|
||||
|
||||
if (gSavedSettings.getS32( "MiniMapCenter" ) != MAP_CENTER_NONE)
|
||||
if (gSavedSettings.getS32( "MiniMapCenter") != MAP_CENTER_NONE)
|
||||
{
|
||||
mCurPanX = lerp(mCurPanX, mTargetPanX, LLCriticalDamp::getInterpolant(0.1f));
|
||||
mCurPanY = lerp(mCurPanY, mTargetPanY, LLCriticalDamp::getInterpolant(0.1f));
|
||||
@@ -231,9 +231,9 @@ void LLNetMap::draw()
|
||||
gGL.pushMatrix();
|
||||
|
||||
gGL.translatef( (F32) center_sw_left, (F32) center_sw_bottom, 0.f);
|
||||
|
||||
|
||||
BOOL rotate_map = gSavedSettings.getBOOL( "MiniMapRotate" );
|
||||
if( rotate_map )
|
||||
if (rotate_map)
|
||||
{
|
||||
// rotate subsequent draws to agent rotation
|
||||
rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
|
||||
@@ -383,6 +383,10 @@ void LLNetMap::draw()
|
||||
// TODO: it'd be very cool to draw these in sorted order from lowest Z to highest.
|
||||
// just be careful to sort the avatar IDs along with the positions. -MG
|
||||
pos_map = globalPosToView(positions[i], rotate_map);
|
||||
if (positions[i].mdV[VZ] == 0.f)
|
||||
{
|
||||
pos_map.mV[VZ] = 16000.f;
|
||||
}
|
||||
std::string avName;
|
||||
|
||||
gCacheName->getFullName(avatar_ids[i], avName);
|
||||
@@ -438,19 +442,19 @@ void LLNetMap::draw()
|
||||
// Draw dot for autopilot target
|
||||
if (gAgent.getAutoPilot())
|
||||
{
|
||||
drawTracking( gAgent.getAutoPilotTargetGlobal(), rotate_map, gTrackColor );
|
||||
drawTracking(gAgent.getAutoPilotTargetGlobal(), rotate_map, gTrackColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus();
|
||||
if ( LLTracker::TRACKING_AVATAR == tracking_status )
|
||||
{
|
||||
drawTracking( LLAvatarTracker::instance().getGlobalPos(), rotate_map, gTrackColor );
|
||||
drawTracking(LLAvatarTracker::instance().getGlobalPos(), rotate_map, gTrackColor);
|
||||
}
|
||||
else if ( LLTracker::TRACKING_LANDMARK == tracking_status
|
||||
|| LLTracker::TRACKING_LOCATION == tracking_status )
|
||||
{
|
||||
drawTracking( LLTracker::getTrackedPositionGlobal(), rotate_map, gTrackColor );
|
||||
drawTracking(LLTracker::getTrackedPositionGlobal(), rotate_map, gTrackColor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -481,7 +485,7 @@ void LLNetMap::draw()
|
||||
|
||||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
|
||||
if( rotate_map )
|
||||
if (rotate_map)
|
||||
{
|
||||
gGL.color4fv(gColors.getColor("NetMapFrustum").mV);
|
||||
|
||||
@@ -529,7 +533,8 @@ void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
|
||||
updateMinorDirections();
|
||||
}
|
||||
|
||||
LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos, BOOL rotated ){
|
||||
LLVector3 LLNetMap::globalPosToView(const LLVector3d& global_pos, BOOL rotated)
|
||||
{
|
||||
LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal();
|
||||
LLVector3 pos_local;
|
||||
pos_local.setVec(relative_pos_global); // convert to floats from doubles
|
||||
@@ -619,7 +624,7 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, std::string& msg, LLRect* sticky_rec
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( viewPosToGlobal( x, y , gSavedSettings.getBOOL( "MiniMapRotate" )) );
|
||||
LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(viewPosToGlobal(x, y, gSavedSettings.getBOOL( "MiniMapRotate" )));
|
||||
if( region )
|
||||
{
|
||||
msg.assign("");
|
||||
@@ -985,7 +990,7 @@ BOOL LLNetMap::handleHover( S32 x, S32 y, MASK mask )
|
||||
|
||||
BOOL LLNetMap::handleDoubleClick( S32 x, S32 y, MASK mask )
|
||||
{
|
||||
LLVector3d pos_global = viewPosToGlobal( x, y , gSavedSettings.getBOOL( "MiniMapRotate" ) );
|
||||
LLVector3d pos_global = viewPosToGlobal(x, y, gSavedSettings.getBOOL( "MiniMapRotate" ));
|
||||
BOOL new_target = FALSE;
|
||||
if (!LLTracker::isTracking(NULL))
|
||||
{
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
#include "llweb.h"
|
||||
#include "llwind.h"
|
||||
#include "llworld.h"
|
||||
#include "llworldmapmessage.h"
|
||||
#include "llworldmap.h"
|
||||
#include "llxfermanager.h"
|
||||
#include "pipeline.h"
|
||||
#include "llappviewer.h"
|
||||
@@ -1783,6 +1783,8 @@ bool idle_startup()
|
||||
if(!map_server_url.empty())
|
||||
{
|
||||
gSavedSettings.setString("MapServerURL", map_server_url);
|
||||
LLWorldMap::gotMapServerURL(true);
|
||||
llinfos << "Got Map server URL: " << map_server_url << llendl;
|
||||
}
|
||||
|
||||
// Override grid info with anything sent in the login response
|
||||
@@ -3558,8 +3560,9 @@ void register_viewer_callbacks(LLMessageSystem* msg)
|
||||
|
||||
msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply);
|
||||
|
||||
msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
|
||||
msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
|
||||
msg->setHandlerFunc("MapLayerReply", LLWorldMap::processMapLayerReply);
|
||||
msg->setHandlerFunc("MapBlockReply", LLWorldMap::processMapBlockReply);
|
||||
msg->setHandlerFunc("MapItemReply", LLWorldMap::processMapItemReply);
|
||||
|
||||
msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply);
|
||||
msg->setHandlerFunc("PickInfoReply", LLPanelPick::processPickInfoReply);
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
#include "llstartup.h" // gStartupState
|
||||
#include "llurlsimstring.h"
|
||||
#include "llweb.h"
|
||||
#include "llworldmapmessage.h"
|
||||
#include "llworldmap.h"
|
||||
|
||||
// library includes
|
||||
#include "llsd.h"
|
||||
@@ -243,7 +243,7 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, bool right_mous
|
||||
url_displayp->setName(region_name);
|
||||
|
||||
// Request a region handle by name
|
||||
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
|
||||
LLWorldMap::getInstance()->sendNamedRegionRequest(region_name,
|
||||
LLURLDispatcherImpl::regionNameCallback,
|
||||
url,
|
||||
false); // don't teleport
|
||||
@@ -282,7 +282,7 @@ void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::strin
|
||||
LLVector3d global_pos = from_region_handle(region_handle) + LLVector3d(local_pos);
|
||||
|
||||
U64 new_region_handle = to_region_handle(global_pos);
|
||||
LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle,
|
||||
LLWorldMap::getInstance()->sendHandleRegionRequest(new_region_handle,
|
||||
LLURLDispatcherImpl::regionHandleCallback,
|
||||
url, teleport);
|
||||
}
|
||||
@@ -401,7 +401,7 @@ public:
|
||||
{
|
||||
url += tokens[i].asString() + "/";
|
||||
}
|
||||
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
|
||||
LLWorldMap::getInstance()->sendNamedRegionRequest(region_name,
|
||||
LLURLDispatcherImpl::regionHandleCallback,
|
||||
url,
|
||||
true); // teleport
|
||||
|
||||
@@ -70,6 +70,8 @@
|
||||
#include "llappviewer.h"
|
||||
#include "llvosurfacepatch.h"
|
||||
#include "llvowlsky.h"
|
||||
#include "llworldmapview.h"
|
||||
#include "llnetmap.h"
|
||||
#include "llrender.h"
|
||||
#include "llfloaterchat.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
@@ -336,7 +338,6 @@ static bool handleUploadBakedTexOldChanged(const LLSD& newvalue)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static bool handleNumpadControlChanged(const LLSD& newvalue)
|
||||
{
|
||||
if (gKeyboard)
|
||||
|
||||
@@ -1001,6 +1001,9 @@ void init_client_menu(LLMenuGL* menu)
|
||||
// </dogmode>
|
||||
menu->append(new LLMenuItemCallGL("Clear Group Cache",
|
||||
LLGroupMgr::debugClearAllGroups));
|
||||
|
||||
menu->append(new LLMenuItemCheckGL("Use Web Map Tiles", menu_toggle_control, NULL, menu_check_control, (void*)"UseWebMapTiles"));
|
||||
|
||||
menu->appendSeparator();
|
||||
|
||||
sub_menu = new LLMenuGL("Rendering");
|
||||
@@ -3543,7 +3546,8 @@ void set_god_level(U8 god_level)
|
||||
LLFloaterDirectory::requestClassifieds();
|
||||
|
||||
// God mode changes region visibility
|
||||
LLWorldMap::getInstance()->reloadItems(true);
|
||||
LLWorldMap::getInstance()->reset();
|
||||
LLWorldMap::getInstance()->setCurrentLayer(0);
|
||||
|
||||
// inventory in items may change in god mode
|
||||
gObjectList.dirtyAllObjectInventory();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -33,245 +33,207 @@
|
||||
#ifndef LL_LLWORLDMAP_H
|
||||
#define LL_LLWORLDMAP_H
|
||||
|
||||
#include "llworldmipmap.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "v3math.h"
|
||||
#include "v3dmath.h"
|
||||
#include "llframetimer.h"
|
||||
#include "llmapimagetype.h"
|
||||
#include "lluuid.h"
|
||||
#include "llmemory.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerimage.h"
|
||||
#include "lleventinfo.h"
|
||||
#include "v3color.h"
|
||||
|
||||
class LLMessageSystem;
|
||||
|
||||
|
||||
// Description of objects like hubs, events, land for sale, people and more (TBD).
|
||||
// Note: we don't store a "type" in there so we need to store instances of this class in
|
||||
// well known objects (i.e. list of objects which type is "well known").
|
||||
class LLItemInfo
|
||||
{
|
||||
public:
|
||||
LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id);
|
||||
LLItemInfo(F32 global_x, F32 global_y, const std::string& name, LLUUID id, S32 extra = 0, S32 extra2 = 0);
|
||||
|
||||
// Setters
|
||||
void setTooltip(std::string& tooltip) { mToolTip = tooltip; }
|
||||
void setElevation(F64 z) { mPosGlobal.mdV[VZ] = z; }
|
||||
void setCount(S32 count) { mCount = count; }
|
||||
// void setSelected(bool selected) { mSelected = selected; }
|
||||
// void setColor(LLColor4 color) { mColor = color; }
|
||||
|
||||
// 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; }
|
||||
S32 getCount() const { return mCount; }
|
||||
|
||||
U64 getRegionHandle() const { return to_region_handle(mPosGlobal); } // Build the handle on the fly
|
||||
|
||||
bool isName(const std::string& name) const { return (mName == name); } // True if name same as item's name
|
||||
// bool isSelected() const { return mSelected; }
|
||||
|
||||
private:
|
||||
std::string mName; // Name of the individual item
|
||||
std::string mToolTip; // Tooltip : typically, something to be displayed to the user when selecting this item
|
||||
LLVector3d mPosGlobal; // Global world position
|
||||
LLUUID mID; // UUID of the item
|
||||
S32 mCount; // Number of elements in item (e.g. people count)
|
||||
// Currently not used but might prove useful one day so we comment out
|
||||
// bool mSelected; // Selected or not: updated by the viewer UI, not the simulator or asset DB
|
||||
// LLColor4 mColor; // Color of the item
|
||||
std::string mName;
|
||||
std::string mToolTip;
|
||||
LLVector3d mPosGlobal;
|
||||
LLUUID mID;
|
||||
BOOL mSelected;
|
||||
S32 mExtra;
|
||||
S32 mExtra2;
|
||||
U64 mRegionHandle;
|
||||
};
|
||||
|
||||
// Info per region
|
||||
// Such records are stored in a global map hold by the LLWorldMap and indexed by region handles.
|
||||
// To avoid creating too many of them, they are requested in "blocks" corresponding to areas covered by the screen.
|
||||
// Unfortunately, when the screen covers the whole world (zoomed out), that can translate in requesting info for
|
||||
// every sim on the grid... Not good...
|
||||
// To avoid this, the code implements a cut-off threshold for overlay graphics and, therefore, all LLSimInfo.
|
||||
// In other words, when zooming out too much, we simply stop requesting LLSimInfo and
|
||||
// LLItemInfo and just display the map tiles.
|
||||
// As they are stored in different structures (LLSimInfo and LLWorldMipmap), this strategy is now workable.
|
||||
#define MAP_SIM_IMAGE_TYPES 3
|
||||
// 0 - Prim
|
||||
// 1 - Terrain Only
|
||||
// 2 - Overlay: Land For Sale
|
||||
|
||||
class LLSimInfo
|
||||
{
|
||||
public:
|
||||
LLSimInfo(U64 handle);
|
||||
LLSimInfo();
|
||||
|
||||
// Convert local region coordinates into world coordinates
|
||||
LLVector3d getGlobalPos(const LLVector3& local_pos) const;
|
||||
LLVector3d getGlobalPos(LLVector3 local_pos) const;
|
||||
// Get the world coordinates of the SW corner of that region
|
||||
LLVector3d getGlobalOrigin() const;
|
||||
|
||||
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
|
||||
public:
|
||||
U64 mHandle;
|
||||
std::string mName;
|
||||
|
||||
// Setters
|
||||
void setName(std::string& name) { mName = name; }
|
||||
void setAccess (U32 accesscode) { mAccess = accesscode; }
|
||||
void setRegionFlags (U32 region_flags) { mRegionFlags = region_flags; }
|
||||
void setLandForSaleImage (LLUUID image_id);
|
||||
// void setWaterHeight (F32 water_height) { mWaterHeight = water_height; }
|
||||
F64 mAgentsUpdateTime;
|
||||
BOOL mShowAgentLocations; // are agents visible?
|
||||
|
||||
// Accessors
|
||||
const std::string getName() const { return mName; }
|
||||
const std::string getFlagsString() const { return LLViewerRegion::regionFlagsToString(mRegionFlags); }
|
||||
const std::string getAccessString() const { return LLViewerRegion::accessToString((U8)mAccess); }
|
||||
const std::string getShortAccessString() const { return LLViewerRegion::accessToShortString((U8)mAccess); }
|
||||
U8 mAccess;
|
||||
U32 mRegionFlags;
|
||||
F32 mWaterHeight;
|
||||
|
||||
const S32 getAgentCount() const; // Compute the total agents count
|
||||
LLPointer<LLViewerImage> getLandForSaleImage(); // Get the overlay image, fetch it if necessary
|
||||
// <edit>
|
||||
//Added this so I could get map images on opensim.
|
||||
const LLUUID getMapImageID() const { return mMapImageID; }
|
||||
F32 mAlpha;
|
||||
|
||||
bool isName(const std::string& name) const;
|
||||
bool isDown() { return (mAccess == SIM_ACCESS_DOWN); }
|
||||
bool isPG() { return (mAccess <= SIM_ACCESS_PG); }
|
||||
// Image ID for the current overlay mode.
|
||||
LLUUID mMapImageID[MAP_SIM_IMAGE_TYPES];
|
||||
|
||||
// Debug only
|
||||
void dump() const; // Print the region info to the standard output
|
||||
|
||||
// Items lists handling
|
||||
typedef std::vector<LLItemInfo> item_info_list_t;
|
||||
void clearItems();
|
||||
|
||||
void insertTeleHub(const LLItemInfo& item) { mTelehubs.push_back(item); }
|
||||
void insertInfoHub(const LLItemInfo& item) { mInfohubs.push_back(item); }
|
||||
void insertPGEvent(const LLItemInfo& item) { mPGEvents.push_back(item); }
|
||||
void insertMatureEvent(const LLItemInfo& item) { mMatureEvents.push_back(item); }
|
||||
void insertAdultEvent(const LLItemInfo& item) { mAdultEvents.push_back(item); }
|
||||
void insertLandForSale(const LLItemInfo& item) { mLandForSale.push_back(item); }
|
||||
void insertLandForSaleAdult(const LLItemInfo& item) { mLandForSaleAdult.push_back(item); }
|
||||
void insertAgentLocation(const LLItemInfo& item);
|
||||
|
||||
const LLSimInfo::item_info_list_t& getTeleHub() const { return mTelehubs; }
|
||||
const LLSimInfo::item_info_list_t& getInfoHub() const { return mInfohubs; }
|
||||
const LLSimInfo::item_info_list_t& getPGEvent() const { return mPGEvents; }
|
||||
const LLSimInfo::item_info_list_t& getMatureEvent() const { return mMatureEvents; }
|
||||
const LLSimInfo::item_info_list_t& getAdultEvent() const { return mAdultEvents; }
|
||||
const LLSimInfo::item_info_list_t& getLandForSale() const { return mLandForSale; }
|
||||
const LLSimInfo::item_info_list_t& getLandForSaleAdult() const { return mLandForSaleAdult; }
|
||||
const LLSimInfo::item_info_list_t& getAgentLocation() const { return mAgentLocations; }
|
||||
|
||||
private:
|
||||
U64 mHandle; // This is a hash of the X and Y world coordinates of the SW corner of the sim
|
||||
std::string mName; // Region name
|
||||
|
||||
F64 mAgentsUpdateTime; // Time stamp giving the last time the agents information was requested for that region
|
||||
bool mFirstAgentRequest; // Init agent request flag
|
||||
|
||||
U32 mAccess; // Down/up and maturity rating of the region
|
||||
U32 mRegionFlags; // Tell us if the siminfo has been received (if non 0) and what kind of region it is (Sandbox, allow damage)
|
||||
// Currently not used but might prove useful one day so we comment out
|
||||
// F32 mWaterHeight; // Water height on the region (not actively used)
|
||||
|
||||
// Handling the "land for sale / land for auction" overlay image
|
||||
|
||||
LLUUID mMapImageID; // Image ID of the overlay image
|
||||
LLPointer<LLViewerImage> mOverlayImage; // Reference to the overlay image
|
||||
|
||||
// Items for this region
|
||||
// Those are data received through item requests (as opposed to block requests for the rest of the data)
|
||||
item_info_list_t mTelehubs; // List of tele hubs in the region
|
||||
item_info_list_t mInfohubs; // List of info hubs in the region
|
||||
item_info_list_t mPGEvents; // List of PG events in the region
|
||||
item_info_list_t mMatureEvents; // List of Mature events in the region
|
||||
item_info_list_t mAdultEvents; // List of Adult events in the region (AO)
|
||||
item_info_list_t mLandForSale; // List of Land for sales in the region
|
||||
item_info_list_t mLandForSaleAdult; // List of Adult Land for sales in the region (AO)
|
||||
item_info_list_t mAgentLocations; // List of agents in the region
|
||||
// Hold a reference to the currently displayed image.
|
||||
LLPointer<LLViewerImage> mCurrentImage;
|
||||
LLPointer<LLViewerImage> mOverlayImage;
|
||||
};
|
||||
|
||||
#define MAP_BLOCK_RES 256
|
||||
|
||||
struct LLWorldMapLayer
|
||||
{
|
||||
BOOL LayerDefined;
|
||||
LLPointer<LLViewerImage> LayerImage;
|
||||
LLUUID LayerImageID;
|
||||
LLRect LayerExtents;
|
||||
|
||||
LLWorldMapLayer() : LayerDefined(FALSE) { }
|
||||
};
|
||||
|
||||
// We request region data on the world by "blocks" of (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) regions
|
||||
// This is to reduce the number of requests to the asset DB and get things in big "blocks"
|
||||
const S32 MAP_MAX_SIZE = 2048;
|
||||
const S32 MAP_BLOCK_SIZE = 4;
|
||||
const S32 MAP_BLOCK_RES = (MAP_MAX_SIZE / MAP_BLOCK_SIZE);
|
||||
|
||||
class LLWorldMap : public LLSingleton<LLWorldMap>
|
||||
{
|
||||
public:
|
||||
typedef void(*url_callback_t)(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport);
|
||||
|
||||
LLWorldMap();
|
||||
~LLWorldMap();
|
||||
|
||||
// Clear all: list of region info, tiles, blocks and items
|
||||
// clears the list
|
||||
void reset();
|
||||
|
||||
void clearImageRefs(); // Clears the image references
|
||||
void dropImagePriorities(); // Drops the priority of the images being fetched
|
||||
void reloadItems(bool force = false); // Reload the items (people, hub, etc...)
|
||||
// clear the visible items
|
||||
void eraseItems();
|
||||
|
||||
// Region Map access
|
||||
typedef std::map<U64, LLSimInfo*> sim_info_map_t;
|
||||
const LLWorldMap::sim_info_map_t& getRegionMap() const { return mSimInfoMap; }
|
||||
void updateRegions(S32 x0, S32 y0, S32 x1, S32 y1); // Requests region info for a rectangle of regions (in grid coordinates)
|
||||
// Removes references to cached images
|
||||
void clearImageRefs();
|
||||
|
||||
// Insert a region and items in the map global instance
|
||||
// Note: x_world and y_world in world coordinates (meters)
|
||||
static bool insertRegion(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 accesscode, U32 region_flags);
|
||||
static bool insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& uuid, U32 type, S32 extra, S32 extra2);
|
||||
// Clears the flags indicating that we've received sim infos
|
||||
// Causes a re-request of the sim info without erasing extisting info
|
||||
void clearSimFlags();
|
||||
|
||||
// Get info on sims (region) : note that those methods only search the range of loaded sims (the one that are being browsed)
|
||||
// *not* the entire world. So a NULL return does not mean a down or unexisting region, just an out of range region.
|
||||
// Returns simulator information, or NULL if out of range
|
||||
LLSimInfo* simInfoFromHandle(const U64 handle);
|
||||
|
||||
// Returns simulator information, or NULL if out of range
|
||||
LLSimInfo* simInfoFromPosGlobal(const LLVector3d& pos_global);
|
||||
|
||||
// Returns simulator information for named sim, or NULL if non-existent
|
||||
LLSimInfo* simInfoFromName(const std::string& sim_name);
|
||||
|
||||
// Gets simulator name from a global position, returns true if found
|
||||
// Gets simulator name for a global position, returns true if it was found
|
||||
bool simNameFromPosGlobal(const LLVector3d& pos_global, std::string& outSimName );
|
||||
|
||||
// Debug only
|
||||
void dump(); // Print the world info to the standard output
|
||||
// Sets the current layer
|
||||
void setCurrentLayer(S32 layer, bool request_layer = false);
|
||||
|
||||
// Track handling
|
||||
void cancelTracking() { mIsTrackingLocation = false; mIsTrackingFound = false; mIsInvalidLocation = false; mIsTrackingDoubleClick = false; mIsTrackingCommit = false; }
|
||||
void sendMapLayerRequest();
|
||||
void sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent = false);
|
||||
void sendNamedRegionRequest(std::string region_name);
|
||||
void sendNamedRegionRequest(std::string region_name,
|
||||
url_callback_t callback,
|
||||
const std::string& callback_url,
|
||||
bool teleport);
|
||||
void sendHandleRegionRequest(U64 region_handle,
|
||||
url_callback_t callback,
|
||||
const std::string& callback_url,
|
||||
bool teleport);
|
||||
void sendItemRequest(U32 type, U64 handle = 0);
|
||||
|
||||
void setTracking(const LLVector3d& loc) { mIsTrackingLocation = true; mTrackingLocation = loc; mIsTrackingFound = false; mIsInvalidLocation = false; mIsTrackingDoubleClick = false; mIsTrackingCommit = false;}
|
||||
void setTrackingInvalid() { mIsTrackingFound = true; mIsInvalidLocation = true; }
|
||||
void setTrackingValid() { mIsTrackingFound = true; mIsInvalidLocation = false; }
|
||||
void setTrackingDoubleClick() { mIsTrackingDoubleClick = true; }
|
||||
void setTrackingCommit() { mIsTrackingCommit = true; }
|
||||
static void processMapLayerReply(LLMessageSystem*, void**);
|
||||
static void processMapBlockReply(LLMessageSystem*, void**);
|
||||
static void processMapItemReply(LLMessageSystem*, void**);
|
||||
|
||||
bool isTracking() { return mIsTrackingLocation; }
|
||||
bool isTrackingValidLocation() { return mIsTrackingFound && !mIsInvalidLocation; }
|
||||
bool isTrackingInvalidLocation() { return mIsTrackingFound && mIsInvalidLocation; }
|
||||
bool isTrackingDoubleClick() { return mIsTrackingDoubleClick; }
|
||||
bool isTrackingCommit() { return mIsTrackingCommit; }
|
||||
bool isTrackingInRectangle(F64 x0, F64 y0, F64 x1, F64 y1);
|
||||
static void gotMapServerURL(bool flag) { sGotMapURL = flag; }
|
||||
static bool useWebMapTiles();
|
||||
static LLPointer<LLViewerImage> loadObjectsTile(U32 grid_x, U32 grid_y);
|
||||
|
||||
LLVector3d getTrackedPositionGlobal() const { return mTrackingLocation; }
|
||||
void dump();
|
||||
|
||||
// World Mipmap delegation: currently used when drawing the mipmap
|
||||
void equalizeBoostLevels();
|
||||
LLPointer<LLViewerImage> getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true) { return mWorldMipmap.getObjectsTile(grid_x, grid_y, level, load); }
|
||||
// Extend the bounding box of the list of simulators. Returns true
|
||||
// if the extents changed.
|
||||
BOOL extendAABB(U32 x_min, U32 y_min, U32 x_max, U32 y_max);
|
||||
|
||||
// build coverage maps for telehub region visualization
|
||||
void updateTelehubCoverage();
|
||||
BOOL coveredByTelehub(LLSimInfo* infop);
|
||||
|
||||
// Bounds of the world, in meters
|
||||
U32 getWorldWidth() const;
|
||||
U32 getWorldHeight() const;
|
||||
public:
|
||||
// Map from region-handle to simulator info
|
||||
typedef std::map<U64, LLSimInfo*> sim_info_map_t;
|
||||
sim_info_map_t mSimInfoMap;
|
||||
|
||||
BOOL mIsTrackingUnknownLocation, mInvalidLocation, mIsTrackingDoubleClick, mIsTrackingCommit;
|
||||
LLVector3d mUnknownLocation;
|
||||
|
||||
bool mRequestLandForSale;
|
||||
|
||||
typedef std::vector<LLItemInfo> item_info_list_t;
|
||||
item_info_list_t mTelehubs;
|
||||
item_info_list_t mInfohubs;
|
||||
item_info_list_t mPGEvents;
|
||||
item_info_list_t mMatureEvents;
|
||||
item_info_list_t mAdultEvents;
|
||||
item_info_list_t mLandForSale;
|
||||
item_info_list_t mLandForSaleAdult;
|
||||
|
||||
std::map<U64,S32> mNumAgents;
|
||||
|
||||
typedef std::map<U64, item_info_list_t> agent_list_map_t;
|
||||
agent_list_map_t mAgentLocationsMap;
|
||||
|
||||
std::vector<LLWorldMapLayer> mMapLayers[MAP_SIM_IMAGE_TYPES];
|
||||
BOOL mMapLoaded[MAP_SIM_IMAGE_TYPES];
|
||||
BOOL * mMapBlockLoaded[MAP_SIM_IMAGE_TYPES];
|
||||
S32 mCurrentMap;
|
||||
|
||||
// AABB of the list of simulators
|
||||
U32 mMinX;
|
||||
U32 mMaxX;
|
||||
U32 mMinY;
|
||||
U32 mMaxY;
|
||||
|
||||
U8* mNeighborMap;
|
||||
U8* mTelehubCoverageMap;
|
||||
S32 mNeighborMapWidth;
|
||||
S32 mNeighborMapHeight;
|
||||
|
||||
private:
|
||||
bool clearItems(bool force = false); // Clears the item lists
|
||||
void clearSimFlags(); // Clears the block flags indicating that we've already requested region infos
|
||||
LLTimer mRequestTimer;
|
||||
|
||||
// Create a region record corresponding to the handle, insert it in the region map and returns a pointer
|
||||
LLSimInfo* createSimInfoFromHandle(const U64 handle);
|
||||
// search for named region for url processing
|
||||
std::string mSLURLRegionName;
|
||||
U64 mSLURLRegionHandle;
|
||||
std::string mSLURL;
|
||||
url_callback_t mSLURLCallback;
|
||||
bool mSLURLTeleport;
|
||||
|
||||
// Map from region-handle to region info
|
||||
sim_info_map_t mSimInfoMap;
|
||||
|
||||
// Holds the tiled mipmap of the world. This is the structure that contains the images used for rendering.
|
||||
LLWorldMipmap mWorldMipmap;
|
||||
|
||||
// The World is divided in "blocks" of (MAP_BLOCK_SIZE x MAP_BLOCK_SIZE) regions that get requested at once.
|
||||
// This boolean table avoids "blocks" to be requested multiple times.
|
||||
// Issue: Not sure this scheme is foolproof though as I've seen
|
||||
// cases where a block is never retrieved and, because of this boolean being set, never re-requested
|
||||
bool * mMapBlockLoaded; // Telling us if the block of regions has been requested or not
|
||||
|
||||
// Track location data : used while there's nothing tracked yet by LLTracker
|
||||
bool mIsTrackingLocation; // True when we're tracking a point
|
||||
bool mIsTrackingFound; // True when the tracking position has been found, valid or not
|
||||
bool mIsInvalidLocation; // The region is down or the location does not correspond to an existing region
|
||||
bool mIsTrackingDoubleClick; // User double clicked to set the location (i.e. teleport when found please...)
|
||||
bool mIsTrackingCommit; // User used the search or landmark fields to set the location
|
||||
LLVector3d mTrackingLocation; // World global position being tracked
|
||||
|
||||
// General grid items request timing flags (used for events,hubs and land for sale)
|
||||
LLTimer mRequestTimer;
|
||||
bool mFirstRequest;
|
||||
static bool sGotMapURL;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,274 +0,0 @@
|
||||
/**
|
||||
* @file llworldmapmessage.cpp
|
||||
* @brief Handling of the messages to the DB made by and for the world map.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2003&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2003-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llworldmapmessage.h"
|
||||
|
||||
#include "llworldmap.h"
|
||||
#include "llagent.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
|
||||
#include "llviewernetwork.h" //for isInProductionGrid()
|
||||
#include "hippogridmanager.h"
|
||||
|
||||
const U32 LAYER_FLAG = 2;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// World Map Message Handling
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
LLWorldMapMessage::LLWorldMapMessage() :
|
||||
mSLURLRegionName(),
|
||||
mSLURLRegionHandle(0),
|
||||
mSLURL(),
|
||||
mSLURLCallback(0),
|
||||
mSLURLTeleport(false)
|
||||
{
|
||||
}
|
||||
|
||||
LLWorldMapMessage::~LLWorldMapMessage()
|
||||
{
|
||||
}
|
||||
|
||||
void LLWorldMapMessage::sendItemRequest(U32 type, U64 handle)
|
||||
{
|
||||
//LL_INFOS("World Map") << "Send item request : type = " << type << LL_ENDL;
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
msg->newMessageFast(_PREHASH_MapItemRequest);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->addU32Fast(_PREHASH_Flags, LAYER_FLAG);
|
||||
msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
|
||||
msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
|
||||
|
||||
msg->nextBlockFast(_PREHASH_RequestData);
|
||||
msg->addU32Fast(_PREHASH_ItemType, type);
|
||||
msg->addU64Fast(_PREHASH_RegionHandle, handle); // If zero, filled in on sim
|
||||
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
|
||||
void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name)
|
||||
{
|
||||
//LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL;
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
// Request for region data
|
||||
msg->newMessageFast(_PREHASH_MapNameRequest);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->addU32Fast(_PREHASH_Flags, LAYER_FLAG);
|
||||
msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
|
||||
msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
|
||||
msg->nextBlockFast(_PREHASH_NameData);
|
||||
msg->addStringFast(_PREHASH_Name, region_name);
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
|
||||
void LLWorldMapMessage::sendNamedRegionRequest(std::string region_name,
|
||||
url_callback_t callback,
|
||||
const std::string& callback_url,
|
||||
bool teleport) // immediately teleport when result returned
|
||||
{
|
||||
//LL_INFOS("World Map") << "LLWorldMap::sendNamedRegionRequest()" << LL_ENDL;
|
||||
mSLURLRegionName = region_name;
|
||||
mSLURLRegionHandle = 0;
|
||||
mSLURL = callback_url;
|
||||
mSLURLCallback = callback;
|
||||
mSLURLTeleport = teleport;
|
||||
|
||||
sendNamedRegionRequest(region_name);
|
||||
}
|
||||
|
||||
void LLWorldMapMessage::sendHandleRegionRequest(U64 region_handle,
|
||||
url_callback_t callback,
|
||||
const std::string& callback_url,
|
||||
bool teleport) // immediately teleport when result returned
|
||||
{
|
||||
//LL_INFOS("World Map") << "LLWorldMap::sendHandleRegionRequest()" << LL_ENDL;
|
||||
mSLURLRegionName.clear();
|
||||
mSLURLRegionHandle = region_handle;
|
||||
mSLURL = callback_url;
|
||||
mSLURLCallback = callback;
|
||||
mSLURLTeleport = teleport;
|
||||
|
||||
U32 global_x;
|
||||
U32 global_y;
|
||||
from_region_handle(region_handle, &global_x, &global_y);
|
||||
U16 grid_x = (U16)(global_x / REGION_WIDTH_UNITS);
|
||||
U16 grid_y = (U16)(global_y / REGION_WIDTH_UNITS);
|
||||
|
||||
sendMapBlockRequest(grid_x, grid_y, grid_x, grid_y, true);
|
||||
}
|
||||
|
||||
void LLWorldMapMessage::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent)
|
||||
{
|
||||
//LL_INFOS("World Map") << "LLWorldMap::sendMapBlockRequest()" << ", min = (" << min_x << ", " << min_y << "), max = (" << max_x << ", " << max_y << "), nonexistent = " << return_nonexistent << LL_ENDL;
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
msg->newMessageFast(_PREHASH_MapBlockRequest);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
U32 flags = LAYER_FLAG;
|
||||
flags |= (return_nonexistent ? 0x10000 : 0);
|
||||
msg->addU32Fast(_PREHASH_Flags, flags);
|
||||
msg->addU32Fast(_PREHASH_EstateID, 0); // Filled in on sim
|
||||
msg->addBOOLFast(_PREHASH_Godlike, FALSE); // Filled in on sim
|
||||
msg->nextBlockFast(_PREHASH_PositionData);
|
||||
msg->addU16Fast(_PREHASH_MinX, min_x);
|
||||
msg->addU16Fast(_PREHASH_MinY, min_y);
|
||||
msg->addU16Fast(_PREHASH_MaxX, max_x);
|
||||
msg->addU16Fast(_PREHASH_MaxY, max_y);
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
|
||||
// public static
|
||||
void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
|
||||
{
|
||||
U32 agent_flags;
|
||||
msg->getU32Fast(_PREHASH_AgentData, _PREHASH_Flags, agent_flags);
|
||||
|
||||
// There's only one flag that we ever use here
|
||||
if (agent_flags != LAYER_FLAG
|
||||
&& gHippoGridManager->getConnectedGrid()->getPlatform() == HippoGridInfo::PLATFORM_SECONDLIFE)
|
||||
{
|
||||
llwarns << "Invalid map image type returned! layer = " << agent_flags << llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_Data);
|
||||
//LL_INFOS("World Map") << "LLWorldMap::processMapBlockReply(), num_blocks = " << num_blocks << LL_ENDL;
|
||||
|
||||
bool found_null_sim = false;
|
||||
|
||||
for (S32 block=0; block<num_blocks; ++block)
|
||||
{
|
||||
U16 x_regions;
|
||||
U16 y_regions;
|
||||
std::string name;
|
||||
U8 accesscode;
|
||||
U32 region_flags;
|
||||
// U8 water_height;
|
||||
// U8 agents;
|
||||
LLUUID image_id;
|
||||
msg->getU16Fast(_PREHASH_Data, _PREHASH_X, x_regions, block);
|
||||
msg->getU16Fast(_PREHASH_Data, _PREHASH_Y, y_regions, block);
|
||||
msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
|
||||
msg->getU8Fast(_PREHASH_Data, _PREHASH_Access, accesscode, block);
|
||||
msg->getU32Fast(_PREHASH_Data, _PREHASH_RegionFlags, region_flags, block);
|
||||
// msg->getU8Fast(_PREHASH_Data, _PREHASH_WaterHeight, water_height, block);
|
||||
// msg->getU8Fast(_PREHASH_Data, _PREHASH_Agents, agents, block);
|
||||
msg->getUUIDFast(_PREHASH_Data, _PREHASH_MapImageID, image_id, block);
|
||||
|
||||
U32 x_world = (U32)(x_regions) * REGION_WIDTH_UNITS;
|
||||
U32 y_world = (U32)(y_regions) * REGION_WIDTH_UNITS;
|
||||
|
||||
// Insert that region in the world map, if failure, flag it as a "null_sim"
|
||||
if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags)))
|
||||
{
|
||||
found_null_sim = true;
|
||||
}
|
||||
|
||||
// If we hit a valid tracking location, do what needs to be done app level wise
|
||||
if (LLWorldMap::getInstance()->isTrackingValidLocation())
|
||||
{
|
||||
LLVector3d pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal();
|
||||
if (LLWorldMap::getInstance()->isTrackingDoubleClick())
|
||||
{
|
||||
// Teleport if the user double clicked
|
||||
gAgent.teleportViaLocation(pos_global);
|
||||
}
|
||||
// Update the "real" tracker information
|
||||
gFloaterWorldMap->trackLocation(pos_global);
|
||||
}
|
||||
|
||||
// Handle the SLURL callback if any
|
||||
if(LLWorldMapMessage::getInstance()->mSLURLCallback != NULL)
|
||||
{
|
||||
U64 handle = to_region_handle(x_world, y_world);
|
||||
// Check if we reached the requested region
|
||||
if ((LLStringUtil::compareInsensitive(LLWorldMapMessage::getInstance()->mSLURLRegionName, name)==0)
|
||||
|| (LLWorldMapMessage::getInstance()->mSLURLRegionHandle == handle))
|
||||
{
|
||||
url_callback_t callback = LLWorldMapMessage::getInstance()->mSLURLCallback;
|
||||
|
||||
LLWorldMapMessage::getInstance()->mSLURLCallback = NULL;
|
||||
LLWorldMapMessage::getInstance()->mSLURLRegionName.clear();
|
||||
LLWorldMapMessage::getInstance()->mSLURLRegionHandle = 0;
|
||||
|
||||
callback(handle, LLWorldMapMessage::getInstance()->mSLURL, image_id, LLWorldMapMessage::getInstance()->mSLURLTeleport);
|
||||
}
|
||||
}
|
||||
// <edit>
|
||||
if(LLAgent::lure_show)
|
||||
{
|
||||
if((x_regions == LLAgent::lure_global_x) && (y_regions == LLAgent::lure_global_y))
|
||||
{
|
||||
gAgent.onFoundLureDestination();
|
||||
}
|
||||
}
|
||||
// </edit>
|
||||
}
|
||||
// Tell the UI to update itself
|
||||
gFloaterWorldMap->updateSims(found_null_sim);
|
||||
}
|
||||
|
||||
// public static
|
||||
void LLWorldMapMessage::processMapItemReply(LLMessageSystem* msg, void**)
|
||||
{
|
||||
//LL_INFOS("World Map") << "LLWorldMap::processMapItemReply()" << LL_ENDL;
|
||||
U32 type;
|
||||
msg->getU32Fast(_PREHASH_RequestData, _PREHASH_ItemType, type);
|
||||
|
||||
S32 num_blocks = msg->getNumberOfBlocks("Data");
|
||||
|
||||
for (S32 block=0; block<num_blocks; ++block)
|
||||
{
|
||||
U32 X, Y;
|
||||
std::string name;
|
||||
S32 extra, extra2;
|
||||
LLUUID uuid;
|
||||
msg->getU32Fast(_PREHASH_Data, _PREHASH_X, X, block);
|
||||
msg->getU32Fast(_PREHASH_Data, _PREHASH_Y, Y, block);
|
||||
msg->getStringFast(_PREHASH_Data, _PREHASH_Name, name, block);
|
||||
msg->getUUIDFast(_PREHASH_Data, _PREHASH_ID, uuid, block);
|
||||
msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra, extra, block);
|
||||
msg->getS32Fast(_PREHASH_Data, _PREHASH_Extra2, extra2, block);
|
||||
|
||||
LLWorldMap::getInstance()->insertItem(X, Y, name, uuid, type, extra, extra2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
/**
|
||||
* @file llworldmapmessage.h
|
||||
* @brief Handling of the messages to the DB made by and for the world map.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2003&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2003-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLWORLDMAPMESSAGE_H
|
||||
#define LL_LLWORLDMAPMESSAGE_H
|
||||
|
||||
// Handling of messages (send and process) as well as SLURL callback if necessary
|
||||
class LLMessageSystem;
|
||||
|
||||
class LLWorldMapMessage : public LLSingleton<LLWorldMapMessage>
|
||||
{
|
||||
public:
|
||||
typedef void(*url_callback_t)(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport);
|
||||
|
||||
LLWorldMapMessage();
|
||||
~LLWorldMapMessage();
|
||||
|
||||
// Process incoming answers to map stuff requests
|
||||
static void processMapBlockReply(LLMessageSystem*, void**);
|
||||
static void processMapItemReply(LLMessageSystem*, void**);
|
||||
|
||||
// Request data for all regions in a rectangular area. Coordinates in grids (i.e. meters / 256).
|
||||
void sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent = false);
|
||||
|
||||
// Various methods to request LLSimInfo data to the simulator and asset DB
|
||||
void sendNamedRegionRequest(std::string region_name);
|
||||
void sendNamedRegionRequest(std::string region_name,
|
||||
url_callback_t callback,
|
||||
const std::string& callback_url,
|
||||
bool teleport);
|
||||
void sendHandleRegionRequest(U64 region_handle,
|
||||
url_callback_t callback,
|
||||
const std::string& callback_url,
|
||||
bool teleport);
|
||||
|
||||
// Request item data for regions
|
||||
// Note: the handle works *only* when requesting agent count (type = MAP_ITEM_AGENT_LOCATIONS). In that case,
|
||||
// the request will actually be transitting through the spaceserver (all that is done on the sim).
|
||||
// All other values of type do create a global grid request to the asset DB. So no need to try to get, say,
|
||||
// the events for one particular region. For such a request, the handle is ignored.
|
||||
void sendItemRequest(U32 type, U64 handle = 0);
|
||||
|
||||
private:
|
||||
// Search for region (by name or handle) for SLURL processing and teleport
|
||||
// None of this relies explicitly on the LLWorldMap instance so better handle it here
|
||||
std::string mSLURLRegionName;
|
||||
U64 mSLURLRegionHandle;
|
||||
std::string mSLURL;
|
||||
url_callback_t mSLURLCallback;
|
||||
bool mSLURLTeleport;
|
||||
};
|
||||
|
||||
#endif // LL_LLWORLDMAPMESSAGE_H
|
||||
File diff suppressed because it is too large
Load Diff
@@ -39,14 +39,21 @@
|
||||
#define LL_LLWORLDMAPVIEW_H
|
||||
|
||||
#include "llpanel.h"
|
||||
#include "llworldmap.h"
|
||||
#include "v3math.h"
|
||||
#include "v3dmath.h"
|
||||
#include "v4color.h"
|
||||
#include "llviewerimage.h"
|
||||
#include "llmapimagetype.h"
|
||||
#include "llworldmap.h"
|
||||
|
||||
class LLItemInfo;
|
||||
|
||||
const S32 DEFAULT_TRACKING_ARROW_SIZE = 16;
|
||||
|
||||
class LLUUID;
|
||||
class LLVector3d;
|
||||
class LLVector3;
|
||||
class LLColor4;
|
||||
class LLColor4U;
|
||||
class LLCoordGL;
|
||||
class LLViewerImage;
|
||||
class LLTextBox;
|
||||
|
||||
|
||||
@@ -71,26 +78,22 @@ public:
|
||||
bool checkItemHit(S32 x, S32 y, LLItemInfo& item, LLUUID* id, bool track);
|
||||
void handleClick(S32 x, S32 y, MASK mask, S32* hit_type, LLUUID* id);
|
||||
|
||||
// Scale and pan are shared across all instances! (i.e. Terrain and Objects maps are always registered)
|
||||
// Scale and pan are shared across all instances.
|
||||
static void setScale( F32 scale );
|
||||
static void translatePan( S32 delta_x, S32 delta_y );
|
||||
static void setPan( S32 x, S32 y, BOOL snap = TRUE );
|
||||
// Return true if the current scale level is above the threshold for accessing region info
|
||||
static bool showRegionInfo();
|
||||
|
||||
LLVector3 globalPosToView(const LLVector3d& global_pos);
|
||||
LLVector3d viewPosToGlobal(S32 x,S32 y);
|
||||
|
||||
virtual void draw();
|
||||
void drawGenericItems(const LLSimInfo::item_info_list_t& items, LLUIImagePtr image);
|
||||
void drawGenericItems(const LLWorldMap::item_info_list_t& items, LLUIImagePtr image);
|
||||
void drawGenericItem(const LLItemInfo& item, LLUIImagePtr image);
|
||||
void drawImage(const LLVector3d& global_pos, LLUIImagePtr image, const LLColor4& color = LLColor4::white);
|
||||
void drawImageStack(const LLVector3d& global_pos, LLUIImagePtr image, U32 count, F32 offset, const LLColor4& color);
|
||||
void drawAgents();
|
||||
void drawItems();
|
||||
void drawEvents();
|
||||
void drawFrustum();
|
||||
void drawMipmap(S32 width, S32 height);
|
||||
bool drawMipmapLevel(S32 width, S32 height, S32 level, bool load = true);
|
||||
|
||||
static void cleanupTextures();
|
||||
|
||||
@@ -106,7 +109,7 @@ public:
|
||||
F32 y_pixels,
|
||||
const LLColor4& color,
|
||||
F32 relative_z = 0.f,
|
||||
F32 dot_radius = 5.f);
|
||||
F32 dot_radius = 3.f);
|
||||
|
||||
static void drawTrackingCircle( const LLRect& rect, S32 x, S32 y,
|
||||
const LLColor4& color,
|
||||
@@ -114,7 +117,7 @@ public:
|
||||
S32 overlap );
|
||||
static void drawAvatar( F32 x_pixels,
|
||||
F32 y_pixels,
|
||||
const LLColor4& color,
|
||||
LLColor4 color,
|
||||
F32 relative_z = 0.f,
|
||||
F32 dot_radius = 3.f);
|
||||
static void drawIconName(F32 x_pixels,
|
||||
@@ -127,7 +130,9 @@ public:
|
||||
static void clearLastClick() { sHandledLastClick = FALSE; }
|
||||
|
||||
// if the view changes, download additional sim info as needed
|
||||
void updateVisibleBlocks();
|
||||
// return value is number of blocks newly requested.
|
||||
U32 updateBlock(S32 block_x, S32 block_y);
|
||||
U32 updateVisibleBlocks();
|
||||
|
||||
protected:
|
||||
void setDirectionPos( LLTextBox* text_box, F32 rotation );
|
||||
@@ -142,7 +147,6 @@ public:
|
||||
static LLUIImagePtr sAvatarLevelImage;
|
||||
static LLUIImagePtr sAvatarAboveImage;
|
||||
static LLUIImagePtr sAvatarBelowImage;
|
||||
|
||||
static LLUIImagePtr sTelehubImage;
|
||||
static LLUIImagePtr sInfohubImage;
|
||||
static LLUIImagePtr sHomeImage;
|
||||
@@ -155,6 +159,10 @@ public:
|
||||
static LLUIImagePtr sForSaleImage;
|
||||
static LLUIImagePtr sForSaleAdultImage;
|
||||
|
||||
static F32 sThresholdA;
|
||||
static F32 sThresholdB;
|
||||
static F32 sPixelsPerMeter; // world meters to map pixels
|
||||
|
||||
static F32 sMapScale; // scale = size of a region in pixels
|
||||
|
||||
BOOL mItemPicked;
|
||||
@@ -165,7 +173,6 @@ public:
|
||||
static F32 sTargetPanY; // in pixels
|
||||
static S32 sTrackingArrowX;
|
||||
static S32 sTrackingArrowY;
|
||||
static bool sVisibleTilesLoaded;
|
||||
|
||||
// Are we mid-pan from a user drag?
|
||||
BOOL mPanning;
|
||||
@@ -188,14 +195,10 @@ public:
|
||||
static BOOL sHandledLastClick;
|
||||
S32 mSelectIDStart;
|
||||
|
||||
// Keep the list of regions that are displayed on screen. Avoids iterating through the whole region map after draw().
|
||||
typedef std::vector<U64> handle_list_t;
|
||||
handle_list_t mVisibleRegions; // set every frame
|
||||
|
||||
static std::map<std::string,std::string> sStringsMap;
|
||||
|
||||
private:
|
||||
void drawTileOutline(S32 level, F32 top, F32 left, F32 bottom, F32 right);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,294 +0,0 @@
|
||||
/**
|
||||
* @file llworldmipmap.cpp
|
||||
* @brief Data storage for the S3 mipmap of the entire world.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2003&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2003-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llworldmipmap.h"
|
||||
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewerimagelist.h"
|
||||
#include "math.h" // log()
|
||||
|
||||
#include "llworldmap.h"
|
||||
#include "llviewernetwork.h" //for isProductionGrid();
|
||||
#include "hippogridmanager.h"
|
||||
|
||||
// Turn this on to output tile stats in the standard output
|
||||
#define DEBUG_TILES_STAT 0
|
||||
|
||||
LLWorldMipmap::LLWorldMipmap() :
|
||||
mCurrentLevel(0)
|
||||
{
|
||||
}
|
||||
|
||||
LLWorldMipmap::~LLWorldMipmap()
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
// Delete all sublevel maps and clean them
|
||||
void LLWorldMipmap::reset()
|
||||
{
|
||||
for (int level = 0; level < MAP_LEVELS; level++)
|
||||
{
|
||||
mWorldObjectsMipMap[level].clear();
|
||||
}
|
||||
}
|
||||
|
||||
// This method should be called before each use of the mipmap (typically, before each draw), so that to let
|
||||
// the boost level of unused tiles to drop to 0 (BOOST_NONE).
|
||||
// Tiles that are accessed have had their boost level pushed to BOOST_MAP_VISIBLE so we can identify them.
|
||||
// The result of this strategy is that if a tile is not used during 2 consecutive loops, its boost level drops to 0.
|
||||
void LLWorldMipmap::equalizeBoostLevels()
|
||||
{
|
||||
#if DEBUG_TILES_STAT
|
||||
S32 nb_missing = 0;
|
||||
S32 nb_tiles = 0;
|
||||
S32 nb_visible = 0;
|
||||
#endif // DEBUG_TILES_STAT
|
||||
// For each level
|
||||
for (S32 level = 0; level < MAP_LEVELS; level++)
|
||||
{
|
||||
sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level];
|
||||
// For each tile
|
||||
for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++)
|
||||
{
|
||||
LLPointer<LLViewerImage> img = iter->second;
|
||||
S32 current_boost_level = img->getBoostLevel();
|
||||
if (current_boost_level == LLViewerImageBoostLevel::BOOST_MAP_VISIBLE)
|
||||
{
|
||||
// If level was BOOST_MAP_VISIBLE, the tile has been used in the last draw so keep it high
|
||||
img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If level was BOOST_MAP only (or anything else...), the tile wasn't used in the last draw
|
||||
// so we drop its boost level to BOOST_NONE.
|
||||
img->setBoostLevel(LLViewerImageBoostLevel::BOOST_NONE);
|
||||
}
|
||||
#if DEBUG_TILES_STAT
|
||||
// Increment some stats if compile option on
|
||||
nb_tiles++;
|
||||
if (current_boost_level == LLViewerImageBoostLevel::BOOST_MAP_VISIBLE)
|
||||
{
|
||||
nb_visible++;
|
||||
}
|
||||
if (img->isMissingAsset())
|
||||
{
|
||||
nb_missing++;
|
||||
}
|
||||
#endif // DEBUG_TILES_STAT
|
||||
}
|
||||
}
|
||||
#if DEBUG_TILES_STAT
|
||||
LL_INFOS("World Map") << "LLWorldMipmap tile stats : total requested = " << nb_tiles << ", visible = " << nb_visible << ", missing = " << nb_missing << LL_ENDL;
|
||||
#endif // DEBUG_TILES_STAT
|
||||
}
|
||||
|
||||
// This method should be used when the mipmap is not actively used for a while, e.g., the map UI is hidden
|
||||
void LLWorldMipmap::dropBoostLevels()
|
||||
{
|
||||
// For each level
|
||||
for (S32 level = 0; level < MAP_LEVELS; level++)
|
||||
{
|
||||
sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level];
|
||||
// For each tile
|
||||
for (sublevel_tiles_t::iterator iter = level_mipmap.begin(); iter != level_mipmap.end(); iter++)
|
||||
{
|
||||
LLPointer<LLViewerImage> img = iter->second;
|
||||
img->setBoostLevel(LLViewerImageBoostLevel::BOOST_NONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLPointer<LLViewerImage> LLWorldMipmap::getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load)
|
||||
{
|
||||
// Check the input data
|
||||
llassert(level <= MAP_LEVELS);
|
||||
llassert(level >= 1);
|
||||
|
||||
// If the *loading* level changed, cleared the new level from "missed" tiles
|
||||
// so that we get a chance to reload them
|
||||
if (load && (level != mCurrentLevel))
|
||||
{
|
||||
cleanMissedTilesFromLevel(level);
|
||||
mCurrentLevel = level;
|
||||
}
|
||||
|
||||
// Build the region handle
|
||||
U64 handle = convertGridToHandle(grid_x, grid_y);
|
||||
|
||||
// Check if the image is around already
|
||||
sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level-1];
|
||||
sublevel_tiles_t::iterator found = level_mipmap.find(handle);
|
||||
|
||||
// If not there and load on, go load it
|
||||
if (found == level_mipmap.end())
|
||||
{
|
||||
if (load)
|
||||
{
|
||||
// Load it
|
||||
LLPointer<LLViewerImage> img;
|
||||
|
||||
//hack for opensims.
|
||||
if(gHippoGridManager->getConnectedGrid()->getPlatform() == HippoGridInfo::PLATFORM_SECONDLIFE)
|
||||
img = loadObjectsTile(grid_x, grid_y, level);
|
||||
else
|
||||
{
|
||||
LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromHandle(handle);
|
||||
if(info)
|
||||
{
|
||||
img = gImageList.getImage(info->getMapImageID(), MIPMAP_TRUE, FALSE);
|
||||
img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP);
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
// </edit>
|
||||
// Insert the image in the map
|
||||
level_mipmap.insert(sublevel_tiles_t::value_type( handle, img ));
|
||||
// Find the element again in the map (it's there now...)
|
||||
found = level_mipmap.find(handle);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Return with NULL if not found and we're not trying to load
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the image pointer and check if this asset is missing
|
||||
LLPointer<LLViewerImage> img = found->second;
|
||||
if (img->isMissingAsset())
|
||||
{
|
||||
// Return NULL if asset missing
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Boost the tile level so to mark it's in use *if* load on
|
||||
if (load)
|
||||
{
|
||||
img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP_VISIBLE);
|
||||
}
|
||||
return img;
|
||||
}
|
||||
}
|
||||
|
||||
LLPointer<LLViewerImage> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level)
|
||||
{
|
||||
// Get the grid coordinates
|
||||
std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);
|
||||
|
||||
// DO NOT COMMIT!! DEBUG ONLY!!!
|
||||
// Use a local jpeg for every tile to test map speed without S3 access
|
||||
//imageurl = "file://C:\\Develop\\mapserver-distribute-3\\indra\\build-vc80\\mapserver\\relwithdebinfo\\regions\\00995\\01001\\region-995-1001-prims.jpg";
|
||||
// END DEBUG
|
||||
//LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
|
||||
|
||||
LLPointer<LLViewerImage> img = gImageList.getImageFromUrl(imageurl);
|
||||
img->setBoostLevel(LLViewerImageBoostLevel::BOOST_MAP);
|
||||
|
||||
// Return the smart pointer
|
||||
return img;
|
||||
}
|
||||
|
||||
// This method is used to clean up a level from tiles marked as "missing".
|
||||
// The idea is to allow tiles that have been improperly marked missing to be reloaded when retraversing the level again.
|
||||
// When zooming in and out rapidly, some tiles are never properly loaded and, eventually marked missing.
|
||||
// This creates "blue" areas in a subresolution that never got a chance to reload if we don't clean up the level.
|
||||
void LLWorldMipmap::cleanMissedTilesFromLevel(S32 level)
|
||||
{
|
||||
// Check the input data
|
||||
llassert(level <= MAP_LEVELS);
|
||||
llassert(level >= 0);
|
||||
|
||||
// This happens when the object is first initialized
|
||||
if (level == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Iterate through the subresolution level and suppress the tiles that are marked as missing
|
||||
// Note: erasing in a map while iterating through it is bug prone. Using a postfix increment is mandatory here.
|
||||
sublevel_tiles_t& level_mipmap = mWorldObjectsMipMap[level-1];
|
||||
sublevel_tiles_t::iterator it = level_mipmap.begin();
|
||||
while (it != level_mipmap.end())
|
||||
{
|
||||
LLPointer<LLViewerImage> img = it->second;
|
||||
if (img->isMissingAsset())
|
||||
{
|
||||
level_mipmap.erase(it++);
|
||||
}
|
||||
else
|
||||
{
|
||||
++it;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// static methods
|
||||
// Compute the level in the world mipmap (between 1 and MAP_LEVELS, as in the URL) given the scale (size of a sim in screen pixels)
|
||||
S32 LLWorldMipmap::scaleToLevel(F32 scale)
|
||||
{
|
||||
// If scale really small, picks up the higest level there is (lowest resolution)
|
||||
if (scale <= F32_MIN)
|
||||
return MAP_LEVELS;
|
||||
// Compute the power of two resolution level knowing the base level
|
||||
S32 level = llfloor((log(REGION_WIDTH_METERS/scale)/log(2.0f)) + 1.0f);
|
||||
// Check bounds and return the value
|
||||
if (level > MAP_LEVELS)
|
||||
return MAP_LEVELS;
|
||||
else if (level < 1)
|
||||
return 1;
|
||||
else
|
||||
return level;
|
||||
}
|
||||
|
||||
// Convert world coordinates to mipmap grid coordinates at a given level (between 1 and MAP_LEVELS)
|
||||
void LLWorldMipmap::globalToMipmap(F64 global_x, F64 global_y, S32 level, U32* grid_x, U32* grid_y)
|
||||
{
|
||||
// Check the input data
|
||||
llassert(level <= MAP_LEVELS);
|
||||
llassert(level >= 1);
|
||||
|
||||
// Convert world coordinates into grid coordinates
|
||||
*grid_x = lltrunc(global_x/REGION_WIDTH_METERS);
|
||||
*grid_y = lltrunc(global_y/REGION_WIDTH_METERS);
|
||||
// Compute the valid grid coordinates at that level of the mipmap
|
||||
S32 regions_in_tile = 1 << (level - 1);
|
||||
*grid_x = *grid_x - (*grid_x % regions_in_tile);
|
||||
*grid_y = *grid_y - (*grid_y % regions_in_tile);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
/**
|
||||
* @file llworldmipmap.h
|
||||
* @brief Data storage for the S3 mipmap of the entire world.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2003&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2003-2009, Linden Research, Inc.
|
||||
*
|
||||
* Second Life Viewer Source Code
|
||||
* The source code in this file ("Source Code") is provided by Linden Lab
|
||||
* to you under the terms of the GNU General Public License, version 2.0
|
||||
* ("GPL"), unless you have obtained a separate licensing agreement
|
||||
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
||||
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
||||
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
||||
*
|
||||
* There are special exceptions to the terms and conditions of the GPL as
|
||||
* it is applied to this Source Code. View the full text of the exception
|
||||
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
||||
* online at
|
||||
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
||||
*
|
||||
* By copying, modifying or distributing this software, you acknowledge
|
||||
* that you have read and understood your obligations described above,
|
||||
* and agree to abide by those obligations.
|
||||
*
|
||||
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
||||
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
||||
* COMPLETENESS OR PERFORMANCE.
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLWORLDMIPMAP_H
|
||||
#define LL_LLWORLDMIPMAP_H
|
||||
|
||||
#include <map>
|
||||
|
||||
#include "llmemory.h" // LLPointer
|
||||
#include "indra_constants.h" // REGION_WIDTH_UNITS
|
||||
#include "llregionhandle.h" // to_region_handle()
|
||||
|
||||
class LLViewerImage;
|
||||
|
||||
// LLWorldMipmap : Mipmap handling of all the tiles used to render the world at any resolution.
|
||||
// This class provides a clean structured access to the hierarchy of tiles stored in the
|
||||
// Amazon S3 repository and abstracts its directory/file structure.
|
||||
// The interface of this class though still assumes that the caller knows the general level/tiles
|
||||
// structure (at least, that it exists...) but doesn't requite the caller to know the details of it.
|
||||
// IOW, you need to know that rendering levels exists as well as grid coordinates for regions,
|
||||
// but you can ignore where those tiles are located, how to get them, etc...
|
||||
// The class API gives you back LLPointer<LLViewerImage> per tile.
|
||||
|
||||
// See llworldmipmapview.cpp for the implementation of a class who knows how to render an LLWorldMipmap.
|
||||
|
||||
// Implementation notes:
|
||||
// - On the S3 servers, the tiles are rendered in 2 flavors: Objects and Terrain.
|
||||
// - For the moment, LLWorldMipmap implements access only to the Objects tiles.
|
||||
class LLWorldMipmap
|
||||
{
|
||||
public:
|
||||
// Parameters of the mipmap
|
||||
static const S32 MAP_LEVELS = 8; // Number of subresolution levels computed by the mapserver
|
||||
static const S32 MAP_TILE_SIZE = 256; // Width in pixels of the tiles computed by the mapserver
|
||||
|
||||
LLWorldMipmap();
|
||||
~LLWorldMipmap();
|
||||
|
||||
// Clear up the maps and release all image handles
|
||||
void reset();
|
||||
// Manage the boost levels between loops (typically draw() loops)
|
||||
void equalizeBoostLevels();
|
||||
// Drop the boost levels to none (used when hiding the map)
|
||||
void dropBoostLevels();
|
||||
// Get the tile smart pointer, does the loading if necessary
|
||||
LLPointer<LLViewerImage> getObjectsTile(U32 grid_x, U32 grid_y, S32 level, bool load = true);
|
||||
|
||||
// Helper functions: those are here as they depend solely on the topology of the mipmap though they don't access it
|
||||
// Convert sim scale (given in sim width in display pixels) into a mipmap level
|
||||
static S32 scaleToLevel(F32 scale);
|
||||
// Convert world coordinates to mipmap grid coordinates at a given level
|
||||
static void globalToMipmap(F64 global_x, F64 global_y, S32 level, U32* grid_x, U32* grid_y);
|
||||
|
||||
private:
|
||||
// Get a handle (key) from grid coordinates
|
||||
U64 convertGridToHandle(U32 grid_x, U32 grid_y) { return to_region_handle(grid_x * REGION_WIDTH_UNITS, grid_y * REGION_WIDTH_UNITS); }
|
||||
// Load the relevant tile from S3
|
||||
LLPointer<LLViewerImage> loadObjectsTile(U32 grid_x, U32 grid_y, S32 level);
|
||||
// Clear a level from its "missing" tiles
|
||||
void cleanMissedTilesFromLevel(S32 level);
|
||||
|
||||
// The mipmap is organized by resolution level (MAP_LEVELS of them). Each resolution level is an std::map
|
||||
// using a region_handle as a key and storing a smart pointer to the image as a value.
|
||||
typedef std::map<U64, LLPointer<LLViewerImage> > sublevel_tiles_t;
|
||||
sublevel_tiles_t mWorldObjectsMipMap[MAP_LEVELS];
|
||||
// sublevel_tiles_t mWorldTerrainMipMap[MAP_LEVELS];
|
||||
|
||||
S32 mCurrentLevel; // The level last accessed by a getObjectsTile()
|
||||
};
|
||||
|
||||
#endif // LL_LLWORLDMIPMAP_H
|
||||
@@ -3,11 +3,62 @@
|
||||
can_resize="false" height="440" min_height="100" min_width="100"
|
||||
name="floater_about" rect_control="FloaterAboutRect"
|
||||
title="About Singularity Viewer" width="470">
|
||||
<text_editor bottom="-434" embedded_items="false"
|
||||
follows="left|top|right|bottom" font="SansSerifSmall" height="168" left="6"
|
||||
max_length="65536" mouse_opaque="true" name="credits_editor" width="458"
|
||||
word_wrap="true">
|
||||
Singularity Viewer is developed and maintained by Siana Gearz with contributions by Shyotl Kuhr. Singularity is based upon Ascent source code. Credits for Ascent include Hg Beeks, Charley Levenque, Hazim Gazov, Zwagoth Klaar, Qarl Fizz, and others. Ascent is based off the Inertia source base.
|
||||
<tab_container
|
||||
follows="all"
|
||||
bottom="10"
|
||||
left="10"
|
||||
height="405"
|
||||
width="450"
|
||||
name="about_tab"
|
||||
tab_position="top">
|
||||
<panel
|
||||
border="true"
|
||||
height="386"
|
||||
label="Info"
|
||||
help_topic="about_support_tab"
|
||||
name="support_panel">
|
||||
<text_editor
|
||||
parse_urls="true"
|
||||
follows="top|left"
|
||||
font="SansSerif"
|
||||
height="343"
|
||||
bg_readonly_color="Transparent"
|
||||
left="1"
|
||||
max_length="65536"
|
||||
name="support_editor"
|
||||
top="-1"
|
||||
bottom="28"
|
||||
width="446"
|
||||
word_wrap="true" />
|
||||
<button
|
||||
follows="left|top"
|
||||
label="Copy to Clipboard"
|
||||
name="copy_btn"
|
||||
right="-5"
|
||||
bottom="0"
|
||||
top_pad="5"
|
||||
height="25"
|
||||
width="180" />
|
||||
</panel>
|
||||
<panel
|
||||
border="true"
|
||||
label="Credits"
|
||||
height="386"
|
||||
help_topic="about_credits_tab"
|
||||
name="credits_panel">
|
||||
<text_editor
|
||||
enabled="false"
|
||||
follows="left|top"
|
||||
bg_readonly_color="Transparent"
|
||||
left="1"
|
||||
text_color="LtGray"
|
||||
max_length="65536"
|
||||
name="credits_editor"
|
||||
top="-1"
|
||||
bottom="0"
|
||||
width="446"
|
||||
word_wrap="true">
|
||||
Singularity Viewer is developed and maintained by Siana Gearz with contributions by Shyotl Kuhr and Narv Czervik. Singularity is based upon Ascent source code. Credits for Ascent include Hg Beeks, Charley Levenque, Hazim Gazov, Zwagoth Klaar, Qarl Fizz, and others. Ascent is based upon the Inertia source code.
|
||||
|
||||
Singularity Viewer includes source code contributions of the following residents: Able Whitman, Adam Marker, Agathos Frascati, Aimee Trescothick, Alejandro Rosenthal, Aleric Inglewood, Alissa Sabre, Angus Boyd, Ann Congrejo, Argent Stonecutter, Asuka Neely, Balp Allen, Benja Kepler, Biancaluce Robbiani, Blakar Ogre, blino Nakamura, Boroondas Gupte, Bulli Schumann, bushing Spatula, Carjay McGinnis, Catherine Pfeffer, Celierra Darling, Cron Stardust, Dale Glass, Drewan Keats, Dylan Haskell, Dzonatas Sol, Eddy Stryker, EponymousDylan Ra, Eva Nowicka, Farallon Greyskin, Feep Larsson, Flemming Congrejo, Fluf Fredriksson, Fremont Cunningham, Geneko Nemeth, Gigs Taggart, Ginko Bayliss, Grazer Kline, Gudmund Shepherd, Hamncheese Omlet, HappySmurf Papp, Henri Beauchamp, Hikkoshi Sakai, Hiro Sommambulist, Hoze Menges, Ian Kas, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Joghert LeSabre, Kage Pixel, Ken March, Kerutsen Sellery, Khyota Wulluf, Kunnis Basiat, Lisa Lowe, Lockhart Cordoso, maciek marksman, Magnus Balczo, Malwina Dollinger, march Korda, Matthew Dowd, McCabe Maxsted, Michelle2 Zenovka, Mm Alder, Mr Greggan, Nicholaz Beresford, Nounouch Hapmouche, Patric Mills, Paul Churchill, Paula Innis, Peekay Semyorka, Peter Lameth, Pf Shan, princess niven, Renault Clio, Ringo Tuxing, Robin Cornelius, Ryozu Kojima, Salahzar Stenvaag, Sammy Frederix, Scrippy Scofield, Seg Baphomet, Sergen Davies, SignpostMarv Martin, Simon Nolan, SpacedOut Frye, Sporked Friis, Stevex Janus, Still Defiant, Strife Onizuka, Tayra Dagostino, TBBle Kurosawa, Teardrops Fall, tenebrous pau, Tharax Ferraris, Thickbrick Sleaford, Thraxis Epsilon, tiamat bingyi, TraductoresAnonimos Alter, Tue Torok, Vadim Bigbear, Vixen Heron, Whoops Babii, Wilton Lundquist, Zarkonnen Decosta, Zi Ree, Zipherius Turas
|
||||
|
||||
@@ -45,11 +96,8 @@ Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft
|
||||
|
||||
|
||||
To be a success in business, be daring, be first, be different. --Henry Marchant</text_editor>
|
||||
|
||||
<text_editor bottom_delta="174" embedded_items="false"
|
||||
follows="left|top|right|bottom" font="SansSerif" height="238" left="6"
|
||||
max_length="65536" mouse_opaque="true" name="support_editor" width="458"
|
||||
word_wrap="true" />
|
||||
</panel>
|
||||
</tab_container>
|
||||
<string name="you_are_at">
|
||||
You are at [POSITION]
|
||||
</string>
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
can_tear_off="false" follows="top|right" height="220" min_height="64" min_width="64"
|
||||
name="minimap" rect_control="FloaterMiniMapRect" width="200">
|
||||
<panel bottom="2" follows="left|top|right|bottom" height="216" label="Mini Map"
|
||||
left="2" mouse_opaque="false" name="mini_mapview" tool_tip="(Double-click to open Map, Shift-drag to pan)"
|
||||
left="2" mouse_opaque="false" name="mini_mapview" tool_tip="(Double-click to open the Map, SHIFT-click and drag to pan)"
|
||||
width="196" />
|
||||
</floater>
|
||||
|
||||
@@ -82,19 +82,19 @@
|
||||
<icon bottom="-116" color="1, 1, 1, 1" follows="top|right" height="16"
|
||||
image_name="map_event.tga" left="1151" mouse_opaque="true" name="event"
|
||||
width="16" />
|
||||
<check_box bottom="-116" control_name="MapShowEvents" follows="top|right"
|
||||
<check_box bottom="-116" control_name="MapShowPGEvents" follows="top|right"
|
||||
font="SansSerifSmall" height="16" initial_value="false" label="PG"
|
||||
left_delta="20" mouse_opaque="true" name="event_chk" width="55" />
|
||||
<icon bottom="-136" color="1, 1, 1, 1" follows="top|right" height="16"
|
||||
image_name="map_event_mature.tga" left="1151" mouse_opaque="true"
|
||||
name="events_mature_icon" width="16" />
|
||||
<check_box bottom="-136" control_name="ShowMatureEvents" follows="top|right"
|
||||
<check_box bottom="-136" control_name="MapShowMatureEvents" follows="top|right"
|
||||
font="SansSerifSmall" height="16" initial_value="true" label="Mature"
|
||||
left_delta="20" mouse_opaque="true" name="event_mature_chk" width="55" />
|
||||
<icon bottom="-156" color="1, 1, 1, 1" follows="top|right" height="16"
|
||||
image_name="map_event_adult.tga" left="1151" mouse_opaque="true"
|
||||
name="events_adult_icon" width="16" />
|
||||
<check_box bottom="-156" control_name="ShowAdultEvents" follows="top|right"
|
||||
<check_box bottom="-156" control_name="MapShowAdultEvents" follows="top|right"
|
||||
font="SansSerifSmall" height="16" initial_value="false" label="Adult"
|
||||
left_delta="20" mouse_opaque="true" name="event_adult_chk" width="55" />
|
||||
<icon bottom="-180" color="0.5, 0, 0, 1" follows="top|right" height="16"
|
||||
|
||||
@@ -7,6 +7,13 @@
|
||||
|
||||
<string name="hippo_label_free">free</string>
|
||||
<string name="hippo_label_week">week</string>
|
||||
<string name="TeleportOfferMaturity">
|
||||
[NAME] is offering a TP to [DESTINATION]
|
||||
</string>
|
||||
<string name="TeleportLureMaturity">
|
||||
[NAME]'s teleport lure is to [DESTINATION]
|
||||
</string>
|
||||
|
||||
<!-- Login -->
|
||||
<string name="LoginInProgress">Logging in. [APP_NAME] may appear frozen. Please wait.</string>
|
||||
<string name="LoginAuthenticating">Authenticating</string>
|
||||
|
||||
Reference in New Issue
Block a user