PageRenderTime 43ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/newview/llhudobject.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 323 lines | 254 code | 34 blank | 35 comment | 23 complexity | 4a692777acc8f36349d474a52efc6ac9 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file llhudobject.cpp
  3. * @brief LLHUDObject class implementation
  4. *
  5. * $LicenseInfo:firstyear=2002&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2002-2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "llviewerprecompiledheaders.h"
  27. #include "llhudobject.h"
  28. #include "llviewerobject.h"
  29. #include "llhudtext.h"
  30. #include "llhudicon.h"
  31. #include "llhudeffectbeam.h"
  32. #include "llhudeffectblob.h"
  33. #include "llhudeffecttrail.h"
  34. #include "llhudeffectlookat.h"
  35. #include "llhudeffectpointat.h"
  36. #include "llhudnametag.h"
  37. #include "llvoicevisualizer.h"
  38. #include "llagent.h"
  39. // statics
  40. std::list<LLPointer<LLHUDObject> > LLHUDObject::sHUDObjects;
  41. struct hud_object_further_away
  42. {
  43. bool operator()(const LLPointer<LLHUDObject>& lhs, const LLPointer<LLHUDObject>& rhs) const;
  44. };
  45. bool hud_object_further_away::operator()(const LLPointer<LLHUDObject>& lhs, const LLPointer<LLHUDObject>& rhs) const
  46. {
  47. return (lhs->getDistance() > rhs->getDistance()) ? true : false;
  48. }
  49. LLHUDObject::LLHUDObject(const U8 type) :
  50. mPositionGlobal(),
  51. mSourceObject(NULL),
  52. mTargetObject(NULL)
  53. {
  54. mVisible = TRUE;
  55. mType = type;
  56. mDead = FALSE;
  57. }
  58. LLHUDObject::~LLHUDObject()
  59. {
  60. }
  61. void LLHUDObject::markDead()
  62. {
  63. mVisible = FALSE;
  64. mDead = TRUE;
  65. mSourceObject = NULL;
  66. mTargetObject = NULL;
  67. }
  68. F32 LLHUDObject::getDistance() const
  69. {
  70. return 0.f;
  71. }
  72. void LLHUDObject::setSourceObject(LLViewerObject* objectp)
  73. {
  74. if (objectp == mSourceObject)
  75. {
  76. return;
  77. }
  78. mSourceObject = objectp;
  79. }
  80. void LLHUDObject::setTargetObject(LLViewerObject* objectp)
  81. {
  82. if (objectp == mTargetObject)
  83. {
  84. return;
  85. }
  86. mTargetObject = objectp;
  87. }
  88. void LLHUDObject::setPositionGlobal(const LLVector3d &position_global)
  89. {
  90. mPositionGlobal = position_global;
  91. }
  92. void LLHUDObject::setPositionAgent(const LLVector3 &position_agent)
  93. {
  94. mPositionGlobal = gAgent.getPosGlobalFromAgent(position_agent);
  95. }
  96. // static
  97. void LLHUDObject::cleanupHUDObjects()
  98. {
  99. LLHUDIcon::cleanupDeadIcons();
  100. hud_object_list_t::iterator object_it;
  101. for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); ++object_it)
  102. {
  103. (*object_it)->markDead();
  104. if ((*object_it)->getNumRefs() > 1)
  105. {
  106. llinfos << "LLHUDObject " << (LLHUDObject *)(*object_it) << " type " << (S32)(*object_it)->getType() << " has " << (*object_it)->getNumRefs() << " refs!" << llendl;
  107. }
  108. }
  109. sHUDObjects.clear();
  110. }
  111. // static
  112. LLHUDObject *LLHUDObject::addHUDObject(const U8 type)
  113. {
  114. LLHUDObject *hud_objectp = NULL;
  115. switch (type)
  116. {
  117. case LL_HUD_TEXT:
  118. hud_objectp = new LLHUDText(type);
  119. break;
  120. case LL_HUD_ICON:
  121. hud_objectp = new LLHUDIcon(type);
  122. break;
  123. case LL_HUD_NAME_TAG:
  124. hud_objectp = new LLHUDNameTag(type);
  125. break;
  126. default:
  127. llwarns << "Unknown type of hud object:" << (U32) type << llendl;
  128. }
  129. if (hud_objectp)
  130. {
  131. sHUDObjects.push_back(hud_objectp);
  132. }
  133. return hud_objectp;
  134. }
  135. LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
  136. {
  137. LLHUDEffect *hud_objectp = NULL;
  138. switch (type)
  139. {
  140. case LL_HUD_EFFECT_BEAM:
  141. hud_objectp = new LLHUDEffectSpiral(type);
  142. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.7f);
  143. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(0.f);
  144. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
  145. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.1f);
  146. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.2f);
  147. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
  148. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
  149. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.05f);
  150. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.02f);
  151. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  152. break;
  153. case LL_HUD_EFFECT_GLOW:
  154. // deprecated
  155. break;
  156. case LL_HUD_EFFECT_POINT:
  157. hud_objectp = new LLHUDEffectSpiral(type);
  158. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.5f);
  159. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(1.f);
  160. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
  161. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.5f);
  162. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(1.f);
  163. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
  164. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
  165. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
  166. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
  167. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  168. break;
  169. case LL_HUD_EFFECT_SPHERE:
  170. hud_objectp = new LLHUDEffectSpiral(type);
  171. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.5f);
  172. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(1.f);
  173. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
  174. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.5f);
  175. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.5f);
  176. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(20.f);
  177. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
  178. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
  179. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
  180. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  181. break;
  182. case LL_HUD_EFFECT_SPIRAL:
  183. hud_objectp = new LLHUDEffectSpiral(type);
  184. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(2.f);
  185. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(-2.f);
  186. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.5f);
  187. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(1.f);
  188. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.5f);
  189. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
  190. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(20.f);
  191. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.02f);
  192. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.02f);
  193. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  194. break;
  195. case LL_HUD_EFFECT_EDIT:
  196. hud_objectp = new LLHUDEffectSpiral(type);
  197. ((LLHUDEffectSpiral *)hud_objectp)->setDuration(2.f);
  198. ((LLHUDEffectSpiral *)hud_objectp)->setVMag(2.f);
  199. ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(-1.f);
  200. ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(1.5f);
  201. ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(1.f);
  202. ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(4.f);
  203. ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(200.f);
  204. ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
  205. ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
  206. ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
  207. break;
  208. case LL_HUD_EFFECT_LOOKAT:
  209. hud_objectp = new LLHUDEffectLookAt(type);
  210. break;
  211. case LL_HUD_EFFECT_VOICE_VISUALIZER:
  212. hud_objectp = new LLVoiceVisualizer(type);
  213. break;
  214. case LL_HUD_EFFECT_POINTAT:
  215. hud_objectp = new LLHUDEffectPointAt(type);
  216. break;
  217. case LL_HUD_EFFECT_BLOB:
  218. hud_objectp = new LLHUDEffectBlob(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. LLHUDNameTag::updateAll();
  237. sortObjects();
  238. }
  239. // static
  240. void LLHUDObject::renderAll()
  241. {
  242. LLHUDObject *hud_objp;
  243. hud_object_list_t::iterator object_it;
  244. for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); )
  245. {
  246. hud_object_list_t::iterator cur_it = object_it++;
  247. hud_objp = (*cur_it);
  248. if (hud_objp->getNumRefs() == 1)
  249. {
  250. sHUDObjects.erase(cur_it);
  251. }
  252. else if (hud_objp->isVisible())
  253. {
  254. hud_objp->render();
  255. }
  256. }
  257. LLVertexBuffer::unbind();
  258. }
  259. // static
  260. void LLHUDObject::renderAllForTimer()
  261. {
  262. LLHUDObject *hud_objp;
  263. hud_object_list_t::iterator object_it;
  264. for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); )
  265. {
  266. hud_object_list_t::iterator cur_it = object_it++;
  267. hud_objp = (*cur_it);
  268. if (hud_objp->getNumRefs() == 1)
  269. {
  270. sHUDObjects.erase(cur_it);
  271. }
  272. else if (hud_objp->isVisible())
  273. {
  274. hud_objp->renderForTimer();
  275. }
  276. }
  277. }
  278. // static
  279. void LLHUDObject::reshapeAll()
  280. {
  281. // only hud objects that use fonts care about window size/scale changes
  282. LLHUDText::reshape();
  283. LLHUDNameTag::reshape();
  284. }
  285. // static
  286. void LLHUDObject::sortObjects()
  287. {
  288. sHUDObjects.sort(hud_object_further_away());
  289. }