llhudobject.cpp

Go to the documentation of this file.
00001 
00032 // llhudobject.cpp
00033 // Copyright 2002, Linden Research, Inc.
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 // statics
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 // static
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 // static
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                 // deprecated
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 // static
00257 void LLHUDObject::updateAll()
00258 {
00259         LLFastTimer ftm(LLFastTimer::FTM_HUD_UPDATE);
00260         LLHUDText::updateAll();
00261         LLHUDIcon::updateAll();
00262         sortObjects();
00263 }
00264 
00265 // static
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 // static
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 // static
00310 void LLHUDObject::sortObjects()
00311 {
00312         sHUDObjects.sort(hud_object_further_away());    
00313 }

Generated on Fri May 16 08:33:39 2008 for SecondLife by  doxygen 1.5.5