llteleporthistory.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llteleporthistory.cpp
  3.  * @brief Teleport history
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llteleporthistory.h"
  34. #include "llparcel.h"
  35. #include "llsdserialize.h"
  36. #include "llagent.h"
  37. #include "llslurl.h"
  38. #include "llviewercontrol.h"        // for gSavedSettings
  39. #include "llviewerparcelmgr.h"
  40. #include "llviewerregion.h"
  41. #include "llworldmap.h"
  42. #include "llagentui.h"
  43. //////////////////////////////////////////////////////////////////////////////
  44. // LLTeleportHistoryItem
  45. //////////////////////////////////////////////////////////////////////////////
  46. const std::string& LLTeleportHistoryItem::getTitle() const
  47. {
  48. return gSavedSettings.getBOOL("NavBarShowCoordinates") ? mFullTitle : mTitle;
  49. }
  50. //////////////////////////////////////////////////////////////////////////////
  51. // LLTeleportHistory
  52. //////////////////////////////////////////////////////////////////////////////
  53. LLTeleportHistory::LLTeleportHistory():
  54. mCurrentItem(-1),
  55. mRequestedItem(-1),
  56. mGotInitialUpdate(false)
  57. {
  58. mTeleportFinishedConn = LLViewerParcelMgr::getInstance()->
  59. setTeleportFinishedCallback(boost::bind(&LLTeleportHistory::updateCurrentLocation, this, _1));
  60. mTeleportFailedConn = LLViewerParcelMgr::getInstance()->
  61. setTeleportFailedCallback(boost::bind(&LLTeleportHistory::onTeleportFailed, this));
  62. }
  63. LLTeleportHistory::~LLTeleportHistory()
  64. {
  65. mTeleportFinishedConn.disconnect();
  66. mTeleportFailedConn.disconnect();
  67. }
  68. void LLTeleportHistory::goToItem(int idx)
  69. {
  70. // Validate specified index.
  71. if (idx < 0 || idx >= (int)mItems.size())
  72. {
  73. llwarns << "Invalid teleport history index (" << idx << ") specified" << llendl;
  74. dump();
  75. return;
  76. }
  77. if (idx == mCurrentItem)
  78. {
  79. llwarns << "Will not teleport to the same location." << llendl;
  80. dump();
  81. return;
  82. }
  83. // Attempt to teleport to the requested item.
  84. gAgent.teleportViaLocation(mItems[idx].mGlobalPos);
  85. mRequestedItem = idx;
  86. }
  87. void LLTeleportHistory::onTeleportFailed()
  88. {
  89. // Are we trying to teleport within the history?
  90. if (mRequestedItem != -1)
  91. {
  92. // Not anymore.
  93. mRequestedItem = -1;
  94. }
  95. }
  96. void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
  97. {
  98. if (mRequestedItem != -1) // teleport within the history in progress?
  99. {
  100. mCurrentItem = mRequestedItem;
  101. mRequestedItem = -1;
  102. }
  103. else
  104. {
  105. // If we're getting the initial location update
  106. // while we already have a (loaded) non-empty history,
  107. // there's no need to purge forward items or add a new item.
  108. if (mGotInitialUpdate || mItems.size() == 0)
  109. {
  110. // Purge forward items (if any).
  111. if(mItems.size())
  112. mItems.erase (mItems.begin() + mCurrentItem + 1, mItems.end());
  113. // Append an empty item to the history and make it current.
  114. mItems.push_back(LLTeleportHistoryItem("", LLVector3d()));
  115. mCurrentItem++;
  116. }
  117. // Update current history item.
  118. if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check
  119. {
  120. llwarns << "Invalid current item. (this should not happen)" << llendl;
  121. return;
  122. }
  123. LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos);
  124. mItems[mCurrentItem].mFullTitle = getCurrentLocationTitle(true, new_pos_local);
  125. mItems[mCurrentItem].mTitle = getCurrentLocationTitle(false, new_pos_local);
  126. mItems[mCurrentItem].mGlobalPos = new_pos;
  127. mItems[mCurrentItem].mRegionID = gAgent.getRegion()->getRegionID();
  128. }
  129. dump();
  130. if (!mGotInitialUpdate)
  131. mGotInitialUpdate = true;
  132. // Signal the interesting party that we've changed. 
  133. onHistoryChanged();
  134. }
  135. boost::signals2::connection LLTeleportHistory::setHistoryChangedCallback(history_callback_t cb)
  136. {
  137. return mHistoryChangedSignal.connect(cb);
  138. }
  139. void LLTeleportHistory::onHistoryChanged()
  140. {
  141. mHistoryChangedSignal();
  142. }
  143. void LLTeleportHistory::purgeItems()
  144. {
  145. if (mItems.size() > 0)
  146. {
  147. mItems.erase(mItems.begin(), mItems.end()-1);
  148. }
  149. // reset the count
  150. mRequestedItem = -1;
  151. mCurrentItem = 0;
  152. onHistoryChanged();
  153. }
  154. // static
  155. std::string LLTeleportHistory::getCurrentLocationTitle(bool full, const LLVector3& local_pos_override)
  156. {
  157. std::string location_name;
  158. LLAgentUI::ELocationFormat fmt = full ? LLAgentUI::LOCATION_FORMAT_NO_MATURITY : LLAgentUI::LOCATION_FORMAT_NORMAL;
  159. if (!LLAgentUI::buildLocationString(location_name, fmt, local_pos_override)) location_name = "Unknown";
  160. return location_name;
  161. }
  162. void LLTeleportHistory::dump() const
  163. {
  164. llinfos << "Teleport history dump (" << mItems.size() << " items):" << llendl;
  165. for (size_t i=0; i<mItems.size(); i++)
  166. {
  167. std::stringstream line;
  168. line << ((i == mCurrentItem) ? " * " : "   ");
  169. line << i << ": " << mItems[i].mTitle;
  170. line << " REGION_ID: " << mItems[i].mRegionID;
  171. line << ", pos: " << mItems[i].mGlobalPos;
  172. llinfos << line.str() << llendl;
  173. }
  174. }