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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llagentui.cpp
  3.  * @brief Utility methods to process agent's data as slurl's etc. before displaying
  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 "llagentui.h"
  34. // Library includes
  35. #include "llparcel.h"
  36. // Viewer includes
  37. #include "llagent.h"
  38. #include "llviewercontrol.h"
  39. #include "llviewerregion.h"
  40. #include "llviewerparcelmgr.h"
  41. #include "llvoavatarself.h"
  42. #include "llslurl.h"
  43. //static
  44. void LLAgentUI::buildName(std::string& name)
  45. {
  46. name.clear();
  47. LLVOAvatarSelf* avatar_object = gAgent.getAvatarObject();
  48. if (avatar_object)
  49. {
  50. LLNameValue *first_nv = avatar_object->getNVPair("FirstName");
  51. LLNameValue *last_nv = avatar_object->getNVPair("LastName");
  52. if (first_nv && last_nv)
  53. {
  54. name = first_nv->printData() + " " + last_nv->printData();
  55. }
  56. else
  57. {
  58. llwarns << "Agent is missing FirstName and/or LastName nv pair." << llendl;
  59. }
  60. }
  61. else
  62. {
  63. name = gSavedSettings.getString("FirstName") + " " + gSavedSettings.getString("LastName");
  64. }
  65. }
  66. //static
  67. void LLAgentUI::buildFullname(std::string& name)
  68. {
  69. if (gAgent.getAvatarObject()) name = gAgent.getAvatarObject()->getFullname();
  70. }
  71. //static
  72. std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/)
  73. {
  74. std::string slurl;
  75. LLViewerRegion *regionp = gAgent.getRegion();
  76. if (regionp)
  77. {
  78. LLVector3d agentPos = gAgent.getPositionGlobal();
  79. slurl = LLSLURL::buildSLURLfromPosGlobal(regionp->getName(), agentPos, escaped);
  80. }
  81. return slurl;
  82. }
  83. //static
  84. BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius)
  85. {
  86. F32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX];
  87. F32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY];
  88. return  sqrt( delta_x* delta_x + delta_y* delta_y ) < radius;
  89. }
  90. BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const LLVector3& agent_pos_region)
  91. {
  92. LLViewerRegion* region = gAgent.getRegion();
  93. LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
  94. if (!region || !parcel) return FALSE;
  95. S32 pos_x = S32(agent_pos_region.mV[VX]);
  96. S32 pos_y = S32(agent_pos_region.mV[VY]);
  97. S32 pos_z = S32(agent_pos_region.mV[VZ]);
  98. // Round the numbers based on the velocity
  99. F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
  100. const F32 FLY_CUTOFF = 6.f; // meters/sec
  101. const F32 FLY_CUTOFF_SQ = FLY_CUTOFF * FLY_CUTOFF;
  102. const F32 WALK_CUTOFF = 1.5f; // meters/sec
  103. const F32 WALK_CUTOFF_SQ = WALK_CUTOFF * WALK_CUTOFF;
  104. if (velocity_mag_sq > FLY_CUTOFF_SQ)
  105. {
  106. pos_x -= pos_x % 4;
  107. pos_y -= pos_y % 4;
  108. }
  109. else if (velocity_mag_sq > WALK_CUTOFF_SQ)
  110. {
  111. pos_x -= pos_x % 2;
  112. pos_y -= pos_y % 2;
  113. }
  114. // create a default name and description for the landmark
  115. std::string parcel_name = LLViewerParcelMgr::getInstance()->getAgentParcelName();
  116. std::string region_name = region->getName();
  117. std::string sim_access_string = region->getSimAccessString();
  118. std::string buffer;
  119. if( parcel_name.empty() )
  120. {
  121. // the parcel doesn't have a name
  122. switch (fmt)
  123. {
  124. case LOCATION_FORMAT_LANDMARK:
  125. buffer = llformat("%.100s", region_name.c_str());
  126. break;
  127. case LOCATION_FORMAT_NORMAL:
  128. buffer = llformat("%s", region_name.c_str());
  129. break;
  130. case LOCATION_FORMAT_NO_COORDS:
  131. buffer = llformat("%s%s%s",
  132. region_name.c_str(),
  133. sim_access_string.empty() ? "" : " - ",
  134. sim_access_string.c_str());
  135. break;
  136. case LOCATION_FORMAT_NO_MATURITY:
  137. buffer = llformat("%s (%d, %d, %d)",
  138. region_name.c_str(),
  139. pos_x, pos_y, pos_z);
  140. break;
  141. case LOCATION_FORMAT_FULL:
  142. buffer = llformat("%s (%d, %d, %d)%s%s",
  143. region_name.c_str(),
  144. pos_x, pos_y, pos_z,
  145. sim_access_string.empty() ? "" : " - ",
  146. sim_access_string.c_str());
  147. break;
  148. }
  149. }
  150. else
  151. {
  152. // the parcel has a name, so include it in the landmark name
  153. switch (fmt)
  154. {
  155. case LOCATION_FORMAT_LANDMARK:
  156. buffer = llformat("%.100s", parcel_name.c_str());
  157. break;
  158. case LOCATION_FORMAT_NORMAL:
  159. buffer = llformat("%s, %s", parcel_name.c_str(), region_name.c_str());
  160. break;
  161. case LOCATION_FORMAT_NO_MATURITY:
  162. buffer = llformat("%s, %s (%d, %d, %d)",
  163. parcel_name.c_str(),
  164. region_name.c_str(),
  165. pos_x, pos_y, pos_z);
  166. break;
  167. case LOCATION_FORMAT_NO_COORDS:
  168. buffer = llformat("%s, %s%s%s",
  169.   parcel_name.c_str(),
  170.   region_name.c_str(),
  171.   sim_access_string.empty() ? "" : " - ",
  172.   sim_access_string.c_str());
  173. break;
  174. case LOCATION_FORMAT_FULL:
  175. buffer = llformat("%s, %s (%d, %d, %d)%s%s",
  176. parcel_name.c_str(),
  177. region_name.c_str(),
  178. pos_x, pos_y, pos_z,
  179. sim_access_string.empty() ? "" : " - ",
  180. sim_access_string.c_str());
  181. break;
  182. }
  183. }
  184. str = buffer;
  185. return TRUE;
  186. }
  187. BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt)
  188. {
  189. return buildLocationString(str,fmt, gAgent.getPositionAgent());
  190. }