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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llhudobject.cpp
  3.  * @brief LLHUDObject class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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. // llhudobject.cpp
  33. // Copyright 2002, Linden Research, Inc.
  34. #include "llviewerprecompiledheaders.h"
  35. #include "llhudobject.h"
  36. #include "llviewerobject.h"
  37. #include "llhudtext.h"
  38. #include "llhudicon.h"
  39. #include "llhudeffectbeam.h"
  40. #include "llhudeffecttrail.h"
  41. #include "llhudeffectlookat.h"
  42. #include "llvoicevisualizer.h"
  43. #include "llagent.h"
  44. // statics
  45. std::list<LLPointer<LLHUDObject> > LLHUDObject::sHUDObjects;
  46. struct hud_object_further_away
  47. {
  48. bool operator()(const LLPointer<LLHUDObject>& lhs, const LLPointer<LLHUDObject>& rhs) const;
  49. };
  50. bool hud_object_further_away::operator()(const LLPointer<LLHUDObject>& lhs, const LLPointer<LLHUDObject>& rhs) const
  51. {
  52. return (lhs->getDistance() > rhs->getDistance()) ? true : false;
  53. }
  54. LLHUDObject::LLHUDObject(const U8 type) : 
  55. mPositionGlobal(), 
  56. mSourceObject(NULL), 
  57. mTargetObject(NULL)
  58. {
  59. mVisible = TRUE;
  60. mType = type;
  61. mDead = FALSE;
  62. mOnHUDAttachment = FALSE;
  63. }
  64. LLHUDObject::~LLHUDObject()
  65. {
  66. }
  67. void LLHUDObject::markDead()
  68. {
  69. mVisible = FALSE;
  70. mDead = TRUE;
  71. mSourceObject = NULL;
  72. mTargetObject = NULL;
  73. }
  74. F32 LLHUDObject::getDistance() const
  75. {
  76. return 0.f;
  77. }
  78. void LLHUDObject::setSourceObject(LLViewerObject* objectp)
  79. {
  80. if (objectp == mSourceObject)
  81. {
  82. return;
  83. }
  84. mSourceObject = objectp;
  85. }
  86. void LLHUDObject::setTargetObject(LLViewerObject* objectp)
  87. {
  88. if (objectp == mTargetObject)
  89. {
  90. return;
  91. }
  92. mTargetObject = objectp;
  93. }
  94. void LLHUDObject::setPositionGlobal(const LLVector3d &position_global)
  95. {
  96. mPositionGlobal = position_global;
  97. }
  98. void LLHUDObject::setPositionAgent(const LLVector3 &position_agent)
  99. {
  100. mPositionGlobal = gAgent.getPosGlobalFromAgent(position_agent);
  101. }
  102. // static
  103. void LLHUDObject::cleanupHUDObjects()
  104. {
  105. LLHUDIcon::cleanupDeadIcons();
  106. hud_object_list_t::iterator object_it;
  107. for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); ++object_it)
  108. {
  109. (*object_it)->markDead();
  110. if ((*object_it)->getNumRefs() > 1)
  111. {
  112. llinfos << "LLHUDObject " << (LLHUDObject *)(*object_it) << " type " << (S32)(*object_it)->getType() << " has " << (*object_it)->getNumRefs() << " refs!" << llendl;
  113. }
  114. }
  115. sHUDObjects.clear();
  116. }
  117. // static
  118. LLHUDObject *LLHUDObject::addHUDObject(const U8 type)
  119. {
  120. LLHUDObject *hud_objectp = NULL;
  121. switch (type)
  122. {
  123. case LL_HUD_TEXT:
  124. hud_objectp = new LLHUDText(type);
  125. break;
  126. case LL_HUD_ICON:
  127. hud_objectp = new LLHUDIcon(type);
  128. break;
  129. default:
  130. llwarns << "Unknown type of hud object:" << (U32) type << llendl;
  131. }
  132. if (hud_objectp)
  133. {
  134. sHUDObjects.push_back(hud_objectp);
  135. }
  136. return hud_objectp;
  137. }
  138. LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
  139. {
  140. LLHUDEffect *hud_objectp = NULL;
  141. switch (type)
  142. {
  143. case LL_HUD_EFFECT_BEAM:
  144. hud_objectp = new LLHUDEffectSpiral(type);
  145. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.7f);
  146. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(0.f);
  147. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
  148. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.1f);
  149. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.2f);
  150. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
  151. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
  152. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.05f);
  153. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.02f);
  154. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  155. break;
  156. case LL_HUD_EFFECT_GLOW:
  157. // deprecated
  158. break;
  159. case LL_HUD_EFFECT_POINT:
  160. hud_objectp = new LLHUDEffectSpiral(type);
  161. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.5f);
  162. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(1.f);
  163. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
  164. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.5f);
  165. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(1.f);
  166. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
  167. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
  168. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
  169. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
  170. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  171. break;
  172. case LL_HUD_EFFECT_SPHERE:
  173. hud_objectp = new LLHUDEffectSpiral(type);
  174. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.5f);
  175. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(1.f);
  176. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
  177. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.5f);
  178. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.5f);
  179. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(20.f);
  180. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
  181. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
  182. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
  183. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  184. break;
  185. case LL_HUD_EFFECT_SPIRAL:
  186. hud_objectp = new LLHUDEffectSpiral(type);
  187. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(2.f);
  188. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(-2.f);
  189. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.5f);
  190. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(1.f);
  191. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.5f);
  192. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
  193. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(20.f);
  194. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.02f);
  195. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.02f);
  196. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  197. break;
  198. case LL_HUD_EFFECT_EDIT:
  199. hud_objectp = new LLHUDEffectSpiral(type);
  200. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(2.f);
  201. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(2.f);
  202. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(-1.f);
  203. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(1.5f);
  204. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(1.f);
  205. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(4.f);
  206. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(200.f);
  207. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
  208. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
  209. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  210. break;
  211. case LL_HUD_EFFECT_LOOKAT:
  212. hud_objectp = new LLHUDEffectLookAt(type);
  213. break;
  214. case LL_HUD_EFFECT_VOICE_VISUALIZER:
  215. hud_objectp = new LLVoiceVisualizer(type);
  216. break;
  217. case LL_HUD_EFFECT_POINTAT:
  218. hud_objectp = new LLHUDEffectPointAt(type);
  219. break;
  220. default:
  221. llwarns << "Unknown type of hud effect:" << (U32) type << llendl;
  222. }
  223. if (hud_objectp)
  224. {
  225. sHUDObjects.push_back(hud_objectp);
  226. }
  227. return hud_objectp;
  228. }
  229. static LLFastTimer::DeclareTimer FTM_HUD_UPDATE("Update Hud");
  230. // static
  231. void LLHUDObject::updateAll()
  232. {
  233. LLFastTimer ftm(FTM_HUD_UPDATE);
  234. LLHUDText::updateAll();
  235. LLHUDIcon::updateAll();
  236. sortObjects();
  237. }
  238. // static
  239. void LLHUDObject::renderAll()
  240. {
  241. LLHUDObject *hud_objp;
  242. hud_object_list_t::iterator object_it;
  243. for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); )
  244. {
  245. hud_object_list_t::iterator cur_it = object_it++;
  246. hud_objp = (*cur_it);
  247. if (hud_objp->getNumRefs() == 1)
  248. {
  249. sHUDObjects.erase(cur_it);
  250. }
  251. else if (hud_objp->isVisible())
  252. {
  253. hud_objp->render();
  254. }
  255. }
  256. LLVertexBuffer::unbind();
  257. }
  258. // static
  259. void LLHUDObject::renderAllForSelect()
  260. {
  261. LLHUDObject *hud_objp;
  262. hud_object_list_t::iterator object_it;
  263. for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); )
  264. {
  265. hud_object_list_t::iterator cur_it = object_it++;
  266. hud_objp = (*cur_it);
  267. if (hud_objp->getNumRefs() == 1)
  268. {
  269. sHUDObjects.erase(cur_it);
  270. }
  271. else if (hud_objp->isVisible())
  272. {
  273. hud_objp->renderForSelect();
  274. }
  275. }
  276. }
  277. // static
  278. void LLHUDObject::sortObjects()
  279. {
  280. sHUDObjects.sort(hud_object_further_away());
  281. }