00001
00032
00033
00034
00035 #include "llviewerprecompiledheaders.h"
00036
00037 #include "llhudobject.h"
00038 #include "llviewerobject.h"
00039
00040 #include "llhudtext.h"
00041 #include "llhudicon.h"
00042 #include "llhudeffectbeam.h"
00043 #include "llhudeffecttrail.h"
00044 #include "llhudeffectlookat.h"
00045
00046 #include "llvoicevisualizer.h"
00047
00048 #include "llagent.h"
00049
00050
00051 std::list<LLPointer<LLHUDObject> > LLHUDObject::sHUDObjects;
00052
00053 struct hud_object_further_away
00054 {
00055 bool operator()(const LLPointer<LLHUDObject>& lhs, const LLPointer<LLHUDObject>& rhs) const;
00056 };
00057
00058
00059 bool hud_object_further_away::operator()(const LLPointer<LLHUDObject>& lhs, const LLPointer<LLHUDObject>& rhs) const
00060 {
00061 return (lhs->getDistance() > rhs->getDistance()) ? true : false;
00062 }
00063
00064
00065 LLHUDObject::LLHUDObject(const U8 type) :
00066 mPositionGlobal(),
00067 mSourceObject(NULL),
00068 mTargetObject(NULL)
00069 {
00070 mVisible = TRUE;
00071 mType = type;
00072 mDead = FALSE;
00073 mOnHUDAttachment = FALSE;
00074 }
00075
00076 LLHUDObject::~LLHUDObject()
00077 {
00078 }
00079
00080 void LLHUDObject::markDead()
00081 {
00082 mVisible = FALSE;
00083 mDead = TRUE;
00084 mSourceObject = NULL;
00085 mTargetObject = NULL;
00086 }
00087
00088 F32 LLHUDObject::getDistance() const
00089 {
00090 return 0.f;
00091 }
00092
00093 void LLHUDObject::setSourceObject(LLViewerObject* objectp)
00094 {
00095 if (objectp == mSourceObject)
00096 {
00097 return;
00098 }
00099
00100 mSourceObject = objectp;
00101 }
00102
00103 void LLHUDObject::setTargetObject(LLViewerObject* objectp)
00104 {
00105 if (objectp == mTargetObject)
00106 {
00107 return;
00108 }
00109
00110 mTargetObject = objectp;
00111 }
00112
00113 void LLHUDObject::setPositionGlobal(const LLVector3d &position_global)
00114 {
00115 mPositionGlobal = position_global;
00116 }
00117
00118 void LLHUDObject::setPositionAgent(const LLVector3 &position_agent)
00119 {
00120 mPositionGlobal = gAgent.getPosGlobalFromAgent(position_agent);
00121 }
00122
00123
00124 void LLHUDObject::cleanupHUDObjects()
00125 {
00126 LLHUDIcon::cleanupDeadIcons();
00127 hud_object_list_t::iterator object_it;
00128 for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); ++object_it)
00129 {
00130 (*object_it)->markDead();
00131 if ((*object_it)->getNumRefs() > 1)
00132 {
00133 llinfos << "LLHUDObject " << (LLHUDObject *)(*object_it) << " has " << (*object_it)->getNumRefs() << " refs!" << llendl;
00134 }
00135 }
00136 sHUDObjects.clear();
00137 }
00138
00139
00140 LLHUDObject *LLHUDObject::addHUDObject(const U8 type)
00141 {
00142 LLHUDObject *hud_objectp = NULL;
00143
00144 switch (type)
00145 {
00146 case LL_HUD_TEXT:
00147 hud_objectp = new LLHUDText(type);
00148 break;
00149 case LL_HUD_ICON:
00150 hud_objectp = new LLHUDIcon(type);
00151 break;
00152 default:
00153 llwarns << "Unknown type of hud object:" << (U32) type << llendl;
00154 }
00155 if (hud_objectp)
00156 {
00157 sHUDObjects.push_back(hud_objectp);
00158 }
00159 return hud_objectp;
00160 }
00161
00162 LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
00163 {
00164 LLHUDEffect *hud_objectp = NULL;
00165
00166 switch (type)
00167 {
00168 case LL_HUD_EFFECT_BEAM:
00169 hud_objectp = new LLHUDEffectSpiral(type);
00170 ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.7f);
00171 ((LLHUDEffectSpiral *)hud_objectp)->setVMag(0.f);
00172 ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
00173 ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.1f);
00174 ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.2f);
00175 ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
00176 ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
00177 ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.05f);
00178 ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.02f);
00179 ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
00180 break;
00181 case LL_HUD_EFFECT_GLOW:
00182
00183 break;
00184 case LL_HUD_EFFECT_POINT:
00185 hud_objectp = new LLHUDEffectSpiral(type);
00186 ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.5f);
00187 ((LLHUDEffectSpiral *)hud_objectp)->setVMag(1.f);
00188 ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
00189 ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.5f);
00190 ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(1.f);
00191 ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
00192 ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
00193 ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
00194 ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
00195 ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
00196 break;
00197 case LL_HUD_EFFECT_SPHERE:
00198 hud_objectp = new LLHUDEffectSpiral(type);
00199 ((LLHUDEffectSpiral *)hud_objectp)->setDuration(0.5f);
00200 ((LLHUDEffectSpiral *)hud_objectp)->setVMag(1.f);
00201 ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.f);
00202 ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(0.5f);
00203 ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.5f);
00204 ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(20.f);
00205 ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(0.f);
00206 ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
00207 ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
00208 ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
00209 break;
00210 case LL_HUD_EFFECT_SPIRAL:
00211 hud_objectp = new LLHUDEffectSpiral(type);
00212 ((LLHUDEffectSpiral *)hud_objectp)->setDuration(2.f);
00213 ((LLHUDEffectSpiral *)hud_objectp)->setVMag(-2.f);
00214 ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(0.5f);
00215 ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(1.f);
00216 ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(0.5f);
00217 ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(10.f);
00218 ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(20.f);
00219 ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.02f);
00220 ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.02f);
00221 ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
00222 break;
00223 case LL_HUD_EFFECT_EDIT:
00224 hud_objectp = new LLHUDEffectSpiral(type);
00225 ((LLHUDEffectSpiral *)hud_objectp)->setDuration(2.f);
00226 ((LLHUDEffectSpiral *)hud_objectp)->setVMag(2.f);
00227 ((LLHUDEffectSpiral *)hud_objectp)->setVOffset(-1.f);
00228 ((LLHUDEffectSpiral *)hud_objectp)->setInitialRadius(1.5f);
00229 ((LLHUDEffectSpiral *)hud_objectp)->setFinalRadius(1.f);
00230 ((LLHUDEffectSpiral *)hud_objectp)->setSpinRate(4.f);
00231 ((LLHUDEffectSpiral *)hud_objectp)->setFlickerRate(200.f);
00232 ((LLHUDEffectSpiral *)hud_objectp)->setScaleBase(0.1f);
00233 ((LLHUDEffectSpiral *)hud_objectp)->setScaleVar(0.1f);
00234 ((LLHUDEffectSpiral *)hud_objectp)->setColor(LLColor4U(255, 255, 255, 255));
00235 break;
00236 case LL_HUD_EFFECT_LOOKAT:
00237 hud_objectp = new LLHUDEffectLookAt(type);
00238 break;
00239 case LL_HUD_EFFECT_VOICE_VISUALIZER:
00240 hud_objectp = new LLVoiceVisualizer(type);
00241 break;
00242 case LL_HUD_EFFECT_POINTAT:
00243 hud_objectp = new LLHUDEffectPointAt(type);
00244 break;
00245 default:
00246 llwarns << "Unknown type of hud effect:" << (U32) type << llendl;
00247 }
00248
00249 if (hud_objectp)
00250 {
00251 sHUDObjects.push_back(hud_objectp);
00252 }
00253 return hud_objectp;
00254 }
00255
00256
00257 void LLHUDObject::updateAll()
00258 {
00259 LLFastTimer ftm(LLFastTimer::FTM_HUD_UPDATE);
00260 LLHUDText::updateAll();
00261 LLHUDIcon::updateAll();
00262 sortObjects();
00263 }
00264
00265
00266 void LLHUDObject::renderAll()
00267 {
00268 LLHUDObject *hud_objp;
00269
00270 hud_object_list_t::iterator object_it;
00271 for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); )
00272 {
00273 hud_object_list_t::iterator cur_it = object_it++;
00274 hud_objp = (*cur_it);
00275 if (hud_objp->getNumRefs() == 1)
00276 {
00277 sHUDObjects.erase(cur_it);
00278 }
00279 else if (hud_objp->isVisible())
00280 {
00281 hud_objp->render();
00282 }
00283 }
00284
00285 LLVertexBuffer::unbind();
00286 }
00287
00288
00289 void LLHUDObject::renderAllForSelect()
00290 {
00291 LLHUDObject *hud_objp;
00292
00293 hud_object_list_t::iterator object_it;
00294 for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); )
00295 {
00296 hud_object_list_t::iterator cur_it = object_it++;
00297 hud_objp = (*cur_it);
00298 if (hud_objp->getNumRefs() == 1)
00299 {
00300 sHUDObjects.erase(cur_it);
00301 }
00302 else if (hud_objp->isVisible())
00303 {
00304 hud_objp->renderForSelect();
00305 }
00306 }
00307 }
00308
00309
00310 void LLHUDObject::sortObjects()
00311 {
00312 sHUDObjects.sort(hud_object_further_away());
00313 }