From fe579d6e4bf34be5e317e8dca78b1dc9f7d3d5dc Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Wed, 15 Feb 2012 14:07:03 +0100 Subject: [PATCH] Activity/spam radar enhancement, from Avination --- indra/llaudio/llaudioengine.h | 10 +- indra/newview/llfloateravatarlist.cpp | 100 +++++++++++++++++- indra/newview/llfloateravatarlist.h | 26 +++++ indra/newview/llviewerobject.h | 3 +- indra/newview/llvoavatar.h | 3 + indra/newview/pipeline.cpp | 5 + .../skins/default/textures/avatar_gone.tga | Bin 0 -> 1042 bytes .../skins/default/textures/avatar_new.tga | Bin 0 -> 1042 bytes .../skins/default/textures/avatar_typing.tga | Bin 0 -> 1042 bytes .../skins/default/textures/particles_scan.tga | Bin 0 -> 953 bytes .../skins/default/xui/en-us/floater_radar.xml | 3 +- 11 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 indra/newview/skins/default/textures/avatar_gone.tga create mode 100644 indra/newview/skins/default/textures/avatar_new.tga create mode 100644 indra/newview/skins/default/textures/avatar_typing.tga create mode 100644 indra/newview/skins/default/textures/particles_scan.tga diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h index 7f07a5bc2..0edaff884 100644 --- a/indra/llaudio/llaudioengine.h +++ b/indra/llaudio/llaudioengine.h @@ -239,12 +239,15 @@ protected: // A list of all audio sources that are known to the viewer at this time. // This is most likely a superset of the ones that we actually have audio // data for, or are playing back. +public://Jay: IDGAF typedef std::map source_map; +protected: typedef std::map data_map; - + +public://Jay: IDGAF source_map mAllSources; +protected: data_map mAllData; - LLAudioChannel *mChannels[MAX_CHANNELS]; // Buffers needs to change into a different data structure, as the number of buffers @@ -351,6 +354,9 @@ public: protected: LLUUID mID; // The ID of the source is that of the object if it's attached to an object. LLUUID mOwnerID; // owner of the object playing the sound +public: + const LLUUID &getOwnerID() { return mOwnerID; } +protected: F32 mPriority; F32 mGain; bool mSourceMuted; diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index 398b4a846..747a6a329 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -57,6 +57,10 @@ #include "llsdutil.h" +#include "llaudioengine.h" + +#include "llstartup.h" + // #include "llviewermenu.h" // @@ -125,7 +129,8 @@ void chat_avatar_status(std::string name, LLUUID key, ERadarAlertType type, bool LLAvatarListEntry::LLAvatarListEntry(const LLUUID& id, const std::string &name, const LLVector3d &position) : mID(id), mName(name), mPosition(position), mDrawPosition(), mMarked(FALSE), mFocused(FALSE), mUpdateTimer(), mFrame(gFrameCount), mInSimFrame(U32_MAX), mInDrawFrame(U32_MAX), - mInChatFrame(U32_MAX), mInShoutFrame(U32_MAX) + mInChatFrame(U32_MAX), mInShoutFrame(U32_MAX), + mActivityType(ACTIVITY_NEW), mActivityTimer() { } @@ -214,6 +219,26 @@ BOOL LLAvatarListEntry::isDead() { return getEntryAgeSeconds() > DEAD_KEEP_TIME; } +const F32 ACTIVITY_TIMEOUT = 1.0f; +void LLAvatarListEntry::setActivity(ACTIVITY_TYPE activity) +{ + if ( activity >= mActivityType || mActivityTimer.getElapsedTimeF32() > ACTIVITY_TIMEOUT ) + { + mActivityType = activity; + mActivityTimer.start(); + } +} + +LLAvatarListEntry::ACTIVITY_TYPE LLAvatarListEntry::getActivity() +{ + if ( mActivityTimer.getElapsedTimeF32() > ACTIVITY_TIMEOUT ) + { + mActivityType = ACTIVITY_NONE; + } + if(isDead())return ACTIVITY_DEAD; + + return mActivityType; +} LLFloaterAvatarList* LLFloaterAvatarList::sInstance = NULL; @@ -359,10 +384,29 @@ BOOL LLFloaterAvatarList::postBuild() return TRUE; } +void updateParticleActivity(LLDrawable *drawablep) +{ + if (LLFloaterAvatarList::getInstance()) + { + LLViewerObject *vobj = drawablep->getVObj(); + if (vobj && vobj->isParticleSource()) + { + LLUUID id = vobj->mPartSourcep->getOwnerUUID(); + LLAvatarListEntry *ent = LLFloaterAvatarList::getInstance()->getAvatarEntry(id); + if ( NULL != ent ) + { + ent->setActivity(LLAvatarListEntry::ACTIVITY_PARTICLES); + } + } + } +} + void LLFloaterAvatarList::updateAvatarList() { if (sInstance != this) return; + //if(LLStartUp::getStartupState() < STATE_STARTED)return; + //llinfos << "radar refresh: updating map" << llendl; // Check whether updates are enabled @@ -377,6 +421,25 @@ void LLFloaterAvatarList::updateAvatarList() { mUpdate = TRUE; } + //moved to pipeline to prevent a crash + //gPipeline.forAllVisibleDrawables(updateParticleActivity); + + + //todo: make this less of a hacked up copypasta from dales 1.18. + if(gAudiop != NULL) + { + LLAudioEngine::source_map::iterator iter; + for (iter = gAudiop->mAllSources.begin(); iter != gAudiop->mAllSources.end(); ++iter) + { + LLAudioSource *sourcep = iter->second; + LLUUID uuid = sourcep->getOwnerID(); + LLAvatarListEntry *ent = getAvatarEntry(uuid); + if ( ent ) + { + ent->setActivity(LLAvatarListEntry::ACTIVITY_SOUND); + } + } + } LLVector3d mypos = gAgent.getPositionGlobal(); @@ -469,6 +532,7 @@ void LLFloaterAvatarList::updateAvatarList() // Avatar already in list, update position F32 dist = (F32)(position - mypos).magVec(); mAvatars[avid].setPosition(position, (avatarp->getRegion() == gAgent.getRegion()), true, dist < 20.0, dist < 100.0); + if(avatarp->isTyping())mAvatars[avid].setActivity(LLAvatarListEntry::ACTIVITY_TYPING); } else { @@ -813,6 +877,40 @@ void LLFloaterAvatarList::refreshAvatarList() snprintf(temp, sizeof(temp), "%d", (S32)position.mdV[VZ]); } element["columns"][LIST_ALTITUDE]["value"] = temp; + + element["columns"][LIST_ACTIVITY]["column"] = "activity"; + element["columns"][LIST_ACTIVITY]["type"] = "icon"; + + std::string activity_icon = ""; + switch(entry->getActivity()) + { + case LLAvatarListEntry::ACTIVITY_MOVING: + activity_icon = "inv_item_animation.tga"; + break; + case LLAvatarListEntry::ACTIVITY_GESTURING: + activity_icon = "inv_item_gesture.tga"; + break; + case LLAvatarListEntry::ACTIVITY_SOUND: + activity_icon = "inv_item_sound.tga"; + break; + case LLAvatarListEntry::ACTIVITY_REZZING: + activity_icon = "ff_edit_theirs.tga"; + break; + case LLAvatarListEntry::ACTIVITY_PARTICLES: + activity_icon = "particles_scan.tga"; + break; + case LLAvatarListEntry::ACTIVITY_NEW: + activity_icon = "avatar_new.tga"; + break; + case LLAvatarListEntry::ACTIVITY_TYPING: + activity_icon = "avatar_typing.tga"; + break; + default: + break; + } + + element["columns"][LIST_ACTIVITY]["value"] = activity_icon;//icon_image_id; //"icn_active-speakers-dot-lvl0.tga"; + //element["columns"][LIST_AVATAR_ACTIVITY]["color"] = icon_color.getValue(); element["columns"][LIST_CLIENT]["column"] = "client"; element["columns"][LIST_CLIENT]["type"] = "text"; diff --git a/indra/newview/llfloateravatarlist.h b/indra/newview/llfloateravatarlist.h index 3afd6929d..fa7f9b5f3 100644 --- a/indra/newview/llfloateravatarlist.h +++ b/indra/newview/llfloateravatarlist.h @@ -33,6 +33,18 @@ class LLAvatarListEntry { public: +enum ACTIVITY_TYPE +{ + ACTIVITY_NONE, /** Avatar not doing anything */ + ACTIVITY_MOVING, /** Changing position */ + ACTIVITY_GESTURING, /** Playing a gesture */ + ACTIVITY_REZZING, /** Rezzing objects */ + ACTIVITY_PARTICLES, /** Creating particles */ + ACTIVITY_TYPING, /** Typing */ + ACTIVITY_NEW, /** Avatar just appeared */ + ACTIVITY_SOUND, /** Playing a sound */ + ACTIVITY_DEAD /** Avatar isn't around anymore, and will be removed soon from the list */ +}; /** * @brief Initializes a list entry * @param id Avatar's key @@ -72,6 +84,13 @@ public: */ LLUUID getID() { return mID; } + void setActivity(ACTIVITY_TYPE activity); + + /** + * @brief Returns the activity type + */ + ACTIVITY_TYPE getActivity(); + /** * @brief Sets the 'focus' status on this entry (camera focused on this avatar) */ @@ -106,8 +125,13 @@ private: /** * @brief Timer to keep track of whether avatars are still there */ + LLTimer mUpdateTimer; + ACTIVITY_TYPE mActivityType; + + LLTimer mActivityTimer; + /** * @brief Last frame when this avatar was updated */ @@ -204,9 +228,11 @@ private: LIST_DISTANCE, LIST_POSITION, LIST_ALTITUDE, + LIST_ACTIVITY, LIST_CLIENT, }; + typedef void (*avlist_command_t)(const LLUUID &avatar, const std::string &name); /** diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index d1ee94a3e..fea65a635 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -676,8 +676,9 @@ protected: TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator // extra data sent from the sim...currently only used for tree species info U8* mData; - +public://Jay: IDGAF LLPointer mPartSourcep; // Particle source associated with this object. +protected: LLAudioSourceVO* mAudioSourcep; F32 mAudioGain; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 84bdda8fd..4ac8ffce1 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -992,6 +992,9 @@ private: LLFrameTimer mTimeVisible; std::deque mChats; BOOL mTyping; +public: + BOOL isTyping(){ return mTyping; } +private: LLFrameTimer mTypingTimer; static void on_avatar_name_response(const LLUUID& agent_id, const LLAvatarName& av_name, void *userdata); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 2d4fe26b5..3c113c0ac 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -3105,6 +3105,8 @@ void renderSoundHighlights(LLDrawable* drawablep) } } +void updateParticleActivity(LLDrawable *drawablep); + void LLPipeline::postSort(LLCamera& camera) { LLMemType mt(LLMemType::MTYPE_PIPELINE_POST_SORT); @@ -3235,6 +3237,9 @@ void LLPipeline::postSort(LLCamera& camera) std::sort(sCull->beginAlphaGroups(), sCull->endAlphaGroups(), LLSpatialGroup::CompareDepthGreater()); } llpushcallstacks ; + + forAllVisibleDrawables(updateParticleActivity); + // only render if the flag is set. The flag is only set if we are in edit mode or the toggle is set in the menus static const LLCachedControl beacons_visible("BeaconsVisible", false); if (beacons_visible && !sShadowRender) diff --git a/indra/newview/skins/default/textures/avatar_gone.tga b/indra/newview/skins/default/textures/avatar_gone.tga new file mode 100644 index 0000000000000000000000000000000000000000..e5c2c070bc2d150394e9e3da1ba028512bbbddf1 GIT binary patch literal 1042 zcmXw&TWnNS6o%Indarhjp<`?9joyHONF%YGsRR-OUXlWB(`ZFf1F6vvQ6!S+qYpm& zfN%O@VvLvc!6+m|4Fp0`v9y&^I=xP(o$1VUhPicSdgkoUH4mQT&)(T5|6Xf-Yi*Gt z`Tui@Q<};E!NeSk`NLI8K3(=ge zc}bIzM-Px5=UTK$Qq+jCt0ZPuiqEQ$glQM74%eTX{xlNVN~tHR@q&^IE$SYbUqkBa zu7~zFN3;97RyllX1<$Jn&r9GwfayO5jWr9VvH5yvc1iEZB*d}{c_4Sjk?NA=-j=-G-5s?q zf04Am`WA-HtW)d!o4U$%PL2e)dK=2yf41BnOk>@w>8!uDS>WN*_!UC7?oRNl^Wi^ADh*@m?HdUpCDXXOFclItWfbxxCM9Io15g3S$>;WKdQ^BKPR3C?~ProAmeyYl$pT%NJtR{8A9#P*9v z$scM>%;}$6qjU6ex r*|PLj;f}(a$|)6!0?K6_Q|#CLR5GVhR&qDFQ1D7J=o4avcZ>W7744~s literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/avatar_new.tga b/indra/newview/skins/default/textures/avatar_new.tga new file mode 100644 index 0000000000000000000000000000000000000000..854b70c326416a41f68f2c858d6d2f6b8a37e53d GIT binary patch literal 1042 zcmX|=?N6Ik7{*UqhJM^Xpc1lg#+Ug~vuT`wxEX_CY%yCD;-XSOgds2X1t_KLp#?;@ zfw0+@$>`_?fmi~A4XE45SacY=cBRlUAQW4$wD3HAd(P!4%e=pw`<$HLeXet#>kuL( z&tpH?PtsllKoI8l?E)#u+>Kz0lg7zo5yS(edPK+qY<(5tJ}t4L?2VMCC0dvfDn1zftn$lcTB+KNY}}Fy)gv z_B5}?)=61^dEWcFqp@l`2kuc18t2TA+f*nStxjkkcA&-G7cUws!>bi9g;+3a%T%#QI ze|A81w-JXm2Nzda&o?2YRQKt^=9M9;ePF=3Sq>}s2Lfx(UWkA|V{l_fEFIRMXuKT8 z4Rbt0`!3Jkm+T@URrEH-EdEinIy%LM=|;G)L<7$&Fn%et1TQw|4|g~ek1JuAzkp2L z2k|AwC)oXKuj)LewIR{8b|cm}Wk__)8WT+e?UZSwJSeTR*3*)SLgWt@quKQvl=c>y z&3)uqV7wneqW%5n+J?Wn(eJ-WEv`XanYW;I>O6H|5k72#yVH)s@iHhL8mNA;hn~26 zCh@W1n8FE47NQ$c{iG?a;JRwH_sJ;i{@I9iVGsu9o#v!}=DMMsJrAv;8y9?5RLz{D zZ>x^1A*pj~nKX@c<>~+URj{m#Vd&r67zm7r=EZBYYyJv)eKu0gzN)W2=Rv@g^gY4WGyev#O}Lv~d0!3IuC+OOFdVprsnC5)`0vFm%QmPc4fJ&9 znRSI#o%=Yvy2nPMkZtq-`&i-*ddZK|##i(s7ZseP#o1(O;kDNc!BVq&p`iP$Qr)jV zuto#V&IM$#uDToF&LqoNd`&OuNRbJUv4#QC_jrvf zk?zeEza7~z+x+{cMAQT#Rx8y|p!v3he^-{I>sSi0PvN6KQ9QQi#mo==A45jWU5bm} z9a#Txa!{iAoDemrRb5TJm6t$JCsa#llpe!geoAo5Ky2gA)G+4q-CN*lZ5toW6!w4m z;8Z`i(tu;v$hF>rtQDZLL@56Ql%D|BQ{}8KFe4@JT|J9?`MxhKUvqDEUO3vj`R+tN z@A*`9TBukSeCrM3YKc%=f~q`6QdyvSWmyrD^zM}t_+xnMm$g{GT_}p92S1q`>x&sc zP6*UJ51zM*z+Fb%ERkm~Qo~xLD6F&HUHa?VDDF>e|J;#*0jWL4`Va4#cNT6lomZ?u zsQ4Wv2Vcjuw3HE#{W>a-Z{eqJcfXt&ALwL}+i&mJ#B_e&#$S&1T%8@+n_M63#joQ# zs95+)T`KgX)5m*od8}Lherj)89NKwjI)CUhsF1lQxu6yE{b2tEoONhT**}W?mPJ!% z_Buy$T=}O F-T_bc2uA<_ literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/particles_scan.tga b/indra/newview/skins/default/textures/particles_scan.tga new file mode 100644 index 0000000000000000000000000000000000000000..008943981eab828714b26317fda9bf96b194dde3 GIT binary patch literal 953 zcmYjQO-NK>6g|&rbmq;xdE@*#GYS)wNi-IOP!tyF7z3e@qezoYCM0E~86hMjVfC={(Mi^P& z^uE^JsOpA~k0Fnz!r&7Bp5m*9VK4ma4#8htg5P%>X0!~`lGw|9T_MO+i3~TB8G|ru zuOQU&3+bDW5IuSlf#eaGCM&V3u5S^=I`YMT45mGdK;1Zk8{VVtvMQbWqqgQ>&mr74 zgg{(!f)3hKA*D?uI}v1P48ev9tlTW@Jxhr8|3-TL1>)zf!rnCjtI6RHvPZJ&@fb+i z06$K`+A@!D2b+D4_?eeTj926^=6#0v2){^Hf{hAX3udz$c6}DXEO{OxT7HYc>8+J?q}2mBl19$M+9(YBg>LjSQrA@V`g_W5T2$E`PgHT} zrz(%Gs;+@=%ZLtgSa%3^P(!6lNg|#yh2gG#(a8( zdY4kb%f)bw(+D+B(Rf}$MA$}wrMV^2aCO={7TKLedbkE=h|6NEK?I#hw>!gXBnQ@L z{qiuBM_Z7^E0Sw!D>GtKB)CW>?RH)+L*Fn^HJ - + +