diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
---|---|---|
committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/llvoavatar.h | |
parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/newview/llvoavatar.h')
-rw-r--r-- | indra/newview/llvoavatar.h | 2512 |
1 files changed, 1256 insertions, 1256 deletions
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index e5d232b792..b10675ac4e 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -1,1256 +1,1256 @@ -/** - * @file llvoavatar.h - * @brief Declaration of LLVOAvatar class which is a derivation of - * LLViewerObject - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_VOAVATAR_H -#define LL_VOAVATAR_H - -#include <map> -#include <deque> -#include <string> -#include <vector> - -#include <boost/signals2/trackable.hpp> - -#include "llavatarappearance.h" -#include "llchat.h" -#include "lldrawpoolalpha.h" -#include "llviewerobject.h" -#include "llcharacter.h" -#include "llcontrol.h" -#include "llviewerjointmesh.h" -#include "llviewerjointattachment.h" -#include "llrendertarget.h" -#include "llavatarappearancedefines.h" -#include "lltexglobalcolor.h" -#include "lldriverparam.h" -#include "llviewertexlayer.h" -#include "material_codes.h" // LL_MCODE_END -#include "llrigginginfo.h" -#include "llviewerstats.h" -#include "llvovolume.h" -#include "llavatarrendernotifier.h" -#include "llmodel.h" - -extern const LLUUID ANIM_AGENT_BODY_NOISE; -extern const LLUUID ANIM_AGENT_BREATHE_ROT; -extern const LLUUID ANIM_AGENT_PHYSICS_MOTION; -extern const LLUUID ANIM_AGENT_EDITING; -extern const LLUUID ANIM_AGENT_EYE; -extern const LLUUID ANIM_AGENT_FLY_ADJUST; -extern const LLUUID ANIM_AGENT_HAND_MOTION; -extern const LLUUID ANIM_AGENT_HEAD_ROT; -extern const LLUUID ANIM_AGENT_PELVIS_FIX; -extern const LLUUID ANIM_AGENT_TARGET; -extern const LLUUID ANIM_AGENT_WALK_ADJUST; - -class LLViewerWearable; -class LLVoiceVisualizer; -class LLHUDNameTag; -class LLHUDEffectSpiral; -class LLTexGlobalColor; - -struct LLAppearanceMessageContents; -class LLViewerJointMesh; - -const F32 MAX_AVATAR_LOD_FACTOR = 1.0f; - -extern U32 gFrameCount; - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// LLVOAvatar -// -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLVOAvatar : - public LLAvatarAppearance, - public LLViewerObject, - public boost::signals2::trackable -{ - LL_ALIGN_NEW; - LOG_CLASS(LLVOAvatar); - -public: - friend class LLVOAvatarSelf; - friend class LLAvatarCheckImpostorMode; - -/******************************************************************************** - ** ** - ** INITIALIZATION - **/ - -public: - LLVOAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); - virtual void markDead(); - static void initClass(); // Initialize data that's only init'd once per class. - static void cleanupClass(); // Cleanup data that's only init'd once per class. - virtual void initInstance(); // Called after construction to initialize the class. -protected: - virtual ~LLVOAvatar(); - -/** Initialization - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** INHERITED - **/ - - //-------------------------------------------------------------------- - // LLViewerObject interface and related - //-------------------------------------------------------------------- -public: - /*virtual*/ void updateGL(); - /*virtual*/ LLVOAvatar* asAvatar(); - - virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, - const EObjectUpdateType update_type, - LLDataPacker *dp); - virtual void idleUpdate(LLAgent &agent, const F64 &time); - /*virtual*/ bool updateLOD(); - bool updateJointLODs(); - void updateLODRiggedAttachments( void ); - /*virtual*/ bool isActive() const; // Whether this object needs to do an idleUpdate. - S32Bytes totalTextureMemForUUIDS(std::set<LLUUID>& ids); - bool allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const; - bool allLocalTexturesCompletelyDownloaded() const; - bool allBakedTexturesCompletelyDownloaded() const; - void bakedTextureOriginCounts(S32 &sb_count, S32 &host_count, - S32 &both_count, S32 &neither_count); - std::string bakedTextureOriginInfo(); - void collectLocalTextureUUIDs(std::set<LLUUID>& ids) const; - void collectBakedTextureUUIDs(std::set<LLUUID>& ids) const; - void collectTextureUUIDs(std::set<LLUUID>& ids); - void releaseOldTextures(); - /*virtual*/ void updateTextures(); - LLViewerFetchedTexture* getBakedTextureImage(const U8 te, const LLUUID& uuid); - /*virtual*/ S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. - /*virtual*/ void onShift(const LLVector4a& shift_vector); - /*virtual*/ U32 getPartitionType() const; - /*virtual*/ const LLVector3 getRenderPosition() const; - /*virtual*/ void updateDrawable(bool force_damped); - /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); - /*virtual*/ bool updateGeometry(LLDrawable *drawable); - /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent); - /*virtual*/ void updateRegion(LLViewerRegion *regionp); - /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax); - void calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); - /*virtual*/ bool lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, - S32 face = -1, // which face to check, -1 = ALL_SIDES - bool pick_transparent = false, - bool pick_rigged = false, - bool pick_unselectable = true, - S32* face_hit = NULL, // which face was hit - LLVector4a* intersection = NULL, // return the intersection point - LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point - LLVector4a* normal = NULL, // return the surface normal at the intersection point - LLVector4a* tangent = NULL); // return the surface tangent at the intersection point - virtual LLViewerObject* lineSegmentIntersectRiggedAttachments( - const LLVector4a& start, const LLVector4a& end, - S32 face = -1, // which face to check, -1 = ALL_SIDES - bool pick_transparent = false, - bool pick_rigged = false, - bool pick_unselectable = true, - S32* face_hit = NULL, // which face was hit - LLVector4a* intersection = NULL, // return the intersection point - LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point - LLVector4a* normal = NULL, // return the surface normal at the intersection point - LLVector4a* tangent = NULL); // return the surface tangent at the intersection point - - //-------------------------------------------------------------------- - // LLCharacter interface and related - //-------------------------------------------------------------------- -public: - /*virtual*/ LLVector3 getCharacterPosition(); - /*virtual*/ LLQuaternion getCharacterRotation(); - /*virtual*/ LLVector3 getCharacterVelocity(); - /*virtual*/ LLVector3 getCharacterAngularVelocity(); - - /*virtual*/ LLUUID remapMotionID(const LLUUID& id); - /*virtual*/ bool startMotion(const LLUUID& id, F32 time_offset = 0.f); - /*virtual*/ bool stopMotion(const LLUUID& id, bool stop_immediate = false); - virtual bool hasMotionFromSource(const LLUUID& source_id); - virtual void stopMotionFromSource(const LLUUID& source_id); - virtual void requestStopMotion(LLMotion* motion); - LLMotion* findMotion(const LLUUID& id) const; - void startDefaultMotions(); - void dumpAnimationState(); - - virtual LLJoint* getJoint(const std::string &name); - LLJoint* getJoint(S32 num); - - //if you KNOW joint_num is a valid animated joint index, use getSkeletonJoint for efficiency - inline LLJoint* getSkeletonJoint(S32 joint_num) { return mSkeleton[joint_num]; } - inline size_t getSkeletonJointCount() const { return mSkeleton.size(); } - - void notifyAttachmentMeshLoaded(); - void addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LLUUID>* meshes_seen = NULL, bool recursive = true); - void removeAttachmentOverridesForObject(const LLUUID& mesh_id); - void removeAttachmentOverridesForObject(LLViewerObject *vo); - bool jointIsRiggedTo(const LLJoint *joint) const; - void clearAttachmentOverrides(); - void rebuildAttachmentOverrides(); - void updateAttachmentOverrides(); - void showAttachmentOverrides(bool verbose = false) const; - void getAttachmentOverrideNames(std::set<std::string>& pos_names, - std::set<std::string>& scale_names) const; - - void getAssociatedVolumes(std::vector<LLVOVolume*>& volumes); - - // virtual - void updateRiggingInfo(); - // This encodes mesh id and LOD, so we can see whether display is up-to-date. - std::map<LLUUID,S32> mLastRiggingInfoKey; - - std::set<LLUUID> mActiveOverrideMeshes; - virtual void onActiveOverrideMeshesChanged(); - - /*virtual*/ const LLUUID& getID() const; - /*virtual*/ void addDebugText(const std::string& text); - /*virtual*/ F32 getTimeDilation(); - /*virtual*/ void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); - /*virtual*/ F32 getPixelArea() const; - /*virtual*/ LLVector3d getPosGlobalFromAgent(const LLVector3 &position); - /*virtual*/ LLVector3 getPosAgentFromGlobal(const LLVector3d &position); - virtual void updateVisualParams(); - -/** Inherited - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** STATE - **/ - -public: - virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent - - virtual bool isControlAvatar() const { return mIsControlAvatar; } // True if this avatar is a control av (no associated user) - virtual bool isUIAvatar() const { return mIsUIAvatar; } // True if this avatar is a supplemental av used in some UI views (no associated user) - virtual bool isBuddy() const; - - // If this is an attachment, return the avatar it is attached to. Otherwise NULL. - virtual const LLVOAvatar *getAttachedAvatar() const { return NULL; } - virtual LLVOAvatar *getAttachedAvatar() { return NULL; } - - -private: //aligned members - LL_ALIGN_16(LLVector4a mImpostorExtents[2]); - - //-------------------------------------------------------------------- - // Updates - //-------------------------------------------------------------------- -public: - void updateAppearanceMessageDebugText(); - void updateAnimationDebugText(); - virtual void updateDebugText(); - virtual bool computeNeedsUpdate(); - virtual bool updateCharacter(LLAgent &agent); - void updateFootstepSounds(); - void computeUpdatePeriod(); - void updateOrientation(LLAgent &agent, F32 speed, F32 delta_time); - void updateTimeStep(); - void updateRootPositionAndRotation(LLAgent &agent, F32 speed, bool was_sit_ground_constrained); - - void idleUpdateVoiceVisualizer(bool voice_enabled, const LLVector3 &position); - void idleUpdateMisc(bool detailed_update); - virtual void idleUpdateAppearanceAnimation(); - void idleUpdateLipSync(bool voice_enabled); - void idleUpdateLoadingEffect(); - void idleUpdateWindEffect(); - void idleUpdateNameTag(const LLVector3& root_pos_last); - void idleUpdateNameTagText(bool new_name); - void idleUpdateNameTagAlpha(bool new_name, F32 alpha); - LLColor4 getNameTagColor(bool is_friend); - void clearNameTag(); - static void invalidateNameTag(const LLUUID& agent_id); - // force all name tags to rebuild, useful when display names turned on/off - static void invalidateNameTags(); - void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses = false); - void idleUpdateRenderComplexity(); - void idleUpdateDebugInfo(); - void accountRenderComplexityForObject(LLViewerObject *attached_object, - const F32 max_attachment_complexity, - LLVOVolume::texture_cost_t& textures, - U32& cost, - hud_complexity_list_t& hud_complexity_list, - object_complexity_list_t& object_complexity_list); - void calculateUpdateRenderComplexity(); - static const U32 VISUAL_COMPLEXITY_UNKNOWN; - void updateVisualComplexity(); - - void placeProfileQuery(); - void readProfileQuery(S32 retries); - - // get the GPU time in ms of rendering this avatar including all attachments - // returns 0.f if this avatar has not been profiled using gPipeline.profileAvatar - // or the avatar is visually muted - F32 getGPURenderTime(); - - // get the total GPU render time in ms of all avatars that have been benched - static F32 getTotalGPURenderTime(); - - // get the max GPU render time in ms of all avatars that have been benched - static F32 getMaxGPURenderTime(); - - // get the average GPU render time in ms of all avatars that have been benched - static F32 getAverageGPURenderTime(); - - // get the CPU time in ms of rendering this avatar including all attachments - // return 0.f if this avatar has not been profiled using gPipeline.mProfileAvatar - F32 getCPURenderTime() { return mCPURenderTime; } - - - // avatar render cost - U32 getVisualComplexity() { return mVisualComplexity; }; - - // surface area calculation - F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; }; - - U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server - void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; }; - - S32 getUpdatePeriod() { return mUpdatePeriod; }; - const LLColor4 & getMutedAVColor() { return mMutedAVColor; }; - static void updateImpostorRendering(U32 newMaxNonImpostorsValue); - - void idleUpdateBelowWater(); - - static void updateNearbyAvatarCount(); - - LLVector3 idleCalcNameTagPosition(const LLVector3 &root_pos_last); - - //-------------------------------------------------------------------- - // Static preferences (controlled by user settings/menus) - //-------------------------------------------------------------------- -public: - static S32 sRenderName; - static bool sRenderGroupTitles; - static const U32 NON_IMPOSTORS_MAX_SLIDER; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors - * slider in panel_preferences_graphics1.xml */ - static U32 sMaxNonImpostors; // affected by control "RenderAvatarMaxNonImpostors" - static bool sLimitNonImpostors; // use impostors for far away avatars - static F32 sRenderDistance; // distance at which avatars will render. - static bool sShowAnimationDebug; // show animation debug info - static bool sShowCollisionVolumes; // show skeletal collision volumes - static bool sVisibleInFirstPerson; - static S32 sNumLODChangesThisFrame; - static S32 sNumVisibleChatBubbles; - static bool sDebugInvisible; - static bool sShowAttachmentPoints; - static F32 sLODFactor; // user-settable LOD factor - static F32 sPhysicsLODFactor; // user-settable physics LOD factor - static bool sJointDebug; // output total number of joints being touched for each avatar - - static LLPointer<LLViewerTexture> sCloudTexture; - - static std::vector<LLUUID> sAVsIgnoringARTLimit; - static S32 sAvatarsNearby; - - //-------------------------------------------------------------------- - // Region state - //-------------------------------------------------------------------- -public: - LLHost getObjectHost() const; - - //-------------------------------------------------------------------- - // Loading state - //-------------------------------------------------------------------- -public: - bool isFullyLoaded() const; - F32 getFirstDecloudTime() const {return mFirstDecloudTime;} - - // check and return current state relative to limits - // default will test only the geometry (combined=false). - // this allows us to disable shadows separately on complex avatars. - - inline bool isTooSlowWithoutShadows() const {return mTooSlowWithoutShadows;}; - bool isTooSlow() const; - - void updateTooSlow(); - - bool isTooComplex() const; - bool visualParamWeightsAreDefault(); - virtual bool getIsCloud() const; - bool isFullyTextured() const; - bool hasGray() const; - S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded. - void updateRezzedStatusTimers(S32 status); - - S32 mLastRezzedStatus; - - - void startPhase(const std::string& phase_name); - void stopPhase(const std::string& phase_name, bool err_check = true); - void clearPhases(); - void logPendingPhases(); - static void logPendingPhasesAllAvatars(); - void logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed); - - void calcMutedAVColor(); - -protected: - LLViewerStats::PhaseMap& getPhases() { return mPhases; } - bool updateIsFullyLoaded(); - bool processFullyLoadedChange(bool loading); - void updateRuthTimer(bool loading); - F32 calcMorphAmount(); - -private: - bool mFirstFullyVisible; - F32 mFirstDecloudTime; - LLFrameTimer mFirstAppearanceMessageTimer; - - bool mFullyLoaded; - bool mPreviousFullyLoaded; - bool mFullyLoadedInitialized; - S32 mFullyLoadedFrameCounter; - LLColor4 mMutedAVColor; - LLFrameTimer mFullyLoadedTimer; - LLFrameTimer mRuthTimer; - - // variables to hold "slowness" status - bool mTooSlow{false}; - bool mTooSlowWithoutShadows{false}; - - bool mTuned{false}; - -private: - LLViewerStats::PhaseMap mPhases; - -protected: - LLFrameTimer mInvisibleTimer; - -/** State - ** ** - *******************************************************************************/ -/******************************************************************************** - ** ** - ** SKELETON - **/ - -protected: - /*virtual*/ LLAvatarJoint* createAvatarJoint(); // Returns LLViewerJoint - /*virtual*/ LLAvatarJoint* createAvatarJoint(S32 joint_num); // Returns LLViewerJoint - /*virtual*/ LLAvatarJointMesh* createAvatarJointMesh(); // Returns LLViewerJointMesh -public: - void updateHeadOffset(); - void debugBodySize() const; - void postPelvisSetRecalc( void ); - - /*virtual*/ bool loadSkeletonNode(); - void initAttachmentPoints(bool ignore_hud_joints = false); - /*virtual*/ void buildCharacter(); - void resetVisualParams(); - void applyDefaultParams(); - void resetSkeleton(bool reset_animations); - - LLVector3 mCurRootToHeadOffset; - LLVector3 mTargetRootToHeadOffset; - - S32 mLastSkeletonSerialNum; - - -/** Skeleton - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** RENDERING - **/ - -public: - U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0); - bool isVisuallyMuted(); - bool isInMuteList() const; - - // states for RenderAvatarComplexityMode - enum ERenderComplexityMode - { - AV_RENDER_LIMIT_BY_COMPLEXITY = 0, - AV_RENDER_ALWAYS_SHOW_FRIENDS = 1, - AV_RENDER_ONLY_SHOW_FRIENDS = 2 - }; - - // Visual Mute Setting is an input. Does not necessarily determine - // what the avatar looks like, because it interacts with other - // settings like muting, complexity threshold. Should be private or protected. - enum VisualMuteSettings - { - AV_RENDER_NORMALLY = 0, - AV_DO_NOT_RENDER = 1, - AV_ALWAYS_RENDER = 2 - }; - void setVisualMuteSettings(VisualMuteSettings set); - -protected: - // If you think you need to access this outside LLVOAvatar, you probably want getOverallAppearance() - VisualMuteSettings getVisualMuteSettings() { return mVisuallyMuteSetting; }; - -public: - - // Overall Appearance is an output. Depending on whether the - // avatar is blocked/muted, whether it exceeds the complexity - // threshold, etc, avatar will want to be displayed in one of - // these ways. Rendering code that wants to know how to display an - // avatar should be looking at this value, NOT the visual mute - // settings - enum AvatarOverallAppearance - { - AOA_NORMAL, - AOA_JELLYDOLL, - AOA_INVISIBLE - }; - - AvatarOverallAppearance getOverallAppearance() const; - void setOverallAppearanceNormal(); - void setOverallAppearanceJellyDoll(); - void setOverallAppearanceInvisible(); - - void updateOverallAppearance(); - void updateOverallAppearanceAnimations(); - - std::set<LLUUID> mJellyAnims; - - U32 renderRigid(); - U32 renderSkinned(); - F32 getLastSkinTime() { return mLastSkinTime; } - U32 renderTransparent(bool first_pass); - void renderCollisionVolumes(); - void renderBones(const std::string &selected_joint = std::string()); - void renderJoints(); - static void deleteCachedImages(bool clearAll=true); - static void destroyGL(); - static void restoreGL(); - S32 mSpecialRenderMode; // special lighting - -private: - friend class LLPipeline; - AvatarOverallAppearance mOverallAppearance; - F32 mAttachmentSurfaceArea; //estimated surface area of attachments - U32 mAttachmentVisibleTriangleCount; - F32 mAttachmentEstTriangleCount; - bool shouldAlphaMask(); - - bool mNeedsSkin; // avatar has been animated and verts have not been updated - F32 mLastSkinTime; //value of gFrameTimeSeconds at last skin update - - S32 mUpdatePeriod; - S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer. - - // profile handle - U32 mGPUTimerQuery = 0; - - // profile results - - // GPU render time in ms - F32 mGPURenderTime = 0.f; - bool mGPUProfilePending = false; - - // CPU render time in ms - F32 mCPURenderTime = 0.f; - - // the isTooComplex method uses these mutable values to avoid recalculating too frequently - // DEPRECATED -- obsolete avatar render cost values - mutable U32 mVisualComplexity; - mutable bool mVisualComplexityStale; - U32 mReportedVisualComplexity; // from other viewers through the simulator - - mutable bool mCachedInMuteList; - mutable F64 mCachedMuteListUpdateTime; - - VisualMuteSettings mVisuallyMuteSetting; // Always or never visually mute this AV - - //-------------------------------------------------------------------- - // animated object status - //-------------------------------------------------------------------- -public: - bool mIsControlAvatar; - bool mIsUIAvatar; - bool mEnableDefaultMotions; - - //-------------------------------------------------------------------- - // Morph masks - //-------------------------------------------------------------------- -public: - /*virtual*/ void applyMorphMask(const U8* tex_data, S32 width, S32 height, S32 num_components, LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES); - bool morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES); - - - //-------------------------------------------------------------------- - // Global colors - //-------------------------------------------------------------------- -public: - /*virtual*/void onGlobalColorChanged(const LLTexGlobalColor* global_color); - - //-------------------------------------------------------------------- - // Visibility - //-------------------------------------------------------------------- -protected: - void updateVisibility(); -private: - U32 mVisibilityRank; - bool mVisible; - - //-------------------------------------------------------------------- - // Shadowing - //-------------------------------------------------------------------- -public: - void updateShadowFaces(); - LLDrawable* mShadow; -private: - LLFace* mShadow0Facep; - LLFace* mShadow1Facep; - LLPointer<LLViewerTexture> mShadowImagep; - - //-------------------------------------------------------------------- - // Impostors - //-------------------------------------------------------------------- -public: - virtual bool isImpostor(); - bool shouldImpostor(const F32 rank_factor = 1.0); - bool needsImpostorUpdate() const; - const LLVector3& getImpostorOffset() const; - const LLVector2& getImpostorDim() const; - void getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const; - void cacheImpostorValues(); - void setImpostorDim(const LLVector2& dim); - static void resetImpostors(); - static void updateImpostors(); - LLRenderTarget mImpostor; - bool mNeedsImpostorUpdate; - S32 mLastImpostorUpdateReason; - F32SecondsImplicit mLastImpostorUpdateFrameTime; - const LLVector3* getLastAnimExtents() const { return mLastAnimExtents; } - void setNeedsExtentUpdate(bool val) { mNeedsExtentUpdate = val; } - -private: - LLVector3 mImpostorOffset; - LLVector2 mImpostorDim; - // This becomes true in the constructor and false after the first - // idleUpdateMisc(). Not clear it serves any purpose. - bool mNeedsAnimUpdate; - bool mNeedsExtentUpdate; - LLVector3 mImpostorAngle; - F32 mImpostorDistance; - F32 mImpostorPixelArea; - LLVector3 mLastAnimExtents[2]; - LLVector3 mLastAnimBasePos; - - LLCachedControl<bool> mRenderUnloadedAvatar; - - //-------------------------------------------------------------------- - // Wind rippling in clothes - //-------------------------------------------------------------------- -public: - LLVector4 mWindVec; - F32 mRipplePhase; - bool mBelowWater; -private: - F32 mWindFreq; - LLFrameTimer mRippleTimer; - F32 mRippleTimeLast; - LLVector3 mRippleAccel; - LLVector3 mLastVel; - - //-------------------------------------------------------------------- - // Culling - //-------------------------------------------------------------------- -public: - static void cullAvatarsByPixelArea(); - bool isCulled() const { return mCulled; } -private: - bool mCulled; - - //-------------------------------------------------------------------- - // Constants - //-------------------------------------------------------------------- -public: - virtual LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR; } - virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED; } - virtual S32 getTexImageSize() const; - /*virtual*/ S32 getTexImageArea() const { return getTexImageSize()*getTexImageSize(); } - -/** Rendering - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** TEXTURES - **/ - - //-------------------------------------------------------------------- - // Loading status - //-------------------------------------------------------------------- -public: - virtual bool isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; - virtual bool isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const; - virtual bool isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const; - - bool isFullyBaked(); - static bool areAllNearbyInstancesBaked(S32& grey_avatars); - static void getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars); - static std::string rezStatusToString(S32 status); - - //-------------------------------------------------------------------- - // Baked textures - //-------------------------------------------------------------------- -public: - /*virtual*/ LLTexLayerSet* createTexLayerSet(); // Return LLViewerTexLayerSet - void releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY ! - -protected: - static void onBakedTextureMasksLoaded(bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata); - static void onInitialBakedTextureLoaded(bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata); - static void onBakedTextureLoaded(bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata); - virtual void removeMissingBakedTextures(); - void useBakedTexture(const LLUUID& id); - LLViewerTexLayerSet* getTexLayerSet(const U32 index) const { return dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet); } - - - LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ; - bool mLoadedCallbacksPaused; - S32 mLoadedCallbackTextures; // count of 'loaded' baked textures, filled from mCallbackTextureList - LLFrameTimer mLastTexCallbackAddedTime; - std::set<LLUUID> mTextureIDs; - //-------------------------------------------------------------------- - // Local Textures - //-------------------------------------------------------------------- -protected: - virtual void setLocalTexture(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture* tex, bool baked_version_exits, U32 index = 0); - virtual void addLocalTextureStats(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, bool rendered, bool covered_by_baked); - // MULTI-WEARABLE: make self-only? - virtual void setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, bool baked_version_exists, U32 index = 0); - - //-------------------------------------------------------------------- - // Texture accessors - //-------------------------------------------------------------------- -private: - virtual void setImage(const U8 te, LLViewerTexture *imagep, const U32 index); - virtual LLViewerTexture* getImage(const U8 te, const U32 index) const; - const std::string getImageURL(const U8 te, const LLUUID &uuid); - - virtual const LLTextureEntry* getTexEntry(const U8 te_num) const; - virtual void setTexEntry(const U8 index, const LLTextureEntry &te); - - void checkTextureLoading() ; - //-------------------------------------------------------------------- - // Layers - //-------------------------------------------------------------------- -protected: - void deleteLayerSetCaches(bool clearAll = true); - void addBakedTextureStats(LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level); - - //-------------------------------------------------------------------- - // Composites - //-------------------------------------------------------------------- -public: - virtual void invalidateComposite(LLTexLayerSet* layerset); - virtual void invalidateAll(); - virtual void setCompositeUpdatesEnabled(bool b) {} - virtual void setCompositeUpdatesEnabled(U32 index, bool b) {} - virtual bool isCompositeUpdateEnabled(U32 index) { return false; } - - //-------------------------------------------------------------------- - // Static texture/mesh/baked dictionary - //-------------------------------------------------------------------- -public: - static bool isIndexLocalTexture(LLAvatarAppearanceDefines::ETextureIndex i); - static bool isIndexBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i); - - //-------------------------------------------------------------------- - // Messaging - //-------------------------------------------------------------------- -public: - void onFirstTEMessageReceived(); -private: - bool mFirstTEMessageReceived; - bool mFirstAppearanceMessageReceived; - -/** Textures - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** MESHES - **/ - -public: - void debugColorizeSubMeshes(U32 i, const LLColor4& color); - virtual void updateMeshTextures(); - void updateSexDependentLayerSets(); - virtual void dirtyMesh(); // Dirty the avatar mesh - void updateMeshData(); - void updateMeshVisibility(); - LLViewerTexture* getBakedTexture(const U8 te); - - // Matrix palette cache entry - class alignas(16) MatrixPaletteCache - { - public: - // Last frame this entry was updated - U32 mFrame; - - // List of Matrix4a's for this entry - LLMeshSkinInfo::matrix_list_t mMatrixPalette; - - // Float array ready to be sent to GL - std::vector<F32> mGLMp; - - MatrixPaletteCache() : - mFrame(gFrameCount - 1) - { - } - }; - - // Accessor for Matrix Palette Cache - // Will do a map lookup for the entry associated with the given MeshSkinInfo - // Will update said entry if it hasn't been updated yet this frame - const MatrixPaletteCache& updateSkinInfoMatrixPalette(const LLMeshSkinInfo* skinInfo); - - // Map of LLMeshSkinInfo::mHash to MatrixPaletteCache - typedef std::unordered_map<U64, MatrixPaletteCache> matrix_palette_cache_t; - matrix_palette_cache_t mMatrixPaletteCache; - -protected: - void releaseMeshData(); - virtual void restoreMeshData(); -private: - virtual void dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority - LLViewerJoint* getViewerJoint(S32 idx); - S32 mDirtyMesh; // 0 -- not dirty, 1 -- morphed, 2 -- LOD - bool mMeshTexturesDirty; - - //-------------------------------------------------------------------- - // Destroy invisible mesh - //-------------------------------------------------------------------- -protected: - bool mMeshValid; - LLFrameTimer mMeshInvisibleTime; - -/** Meshes - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** APPEARANCE - **/ - - LLPointer<LLAppearanceMessageContents> mLastProcessedAppearance; - -public: - void parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& msg); - void processAvatarAppearance(LLMessageSystem* mesgsys); - void applyParsedAppearanceMessage(LLAppearanceMessageContents& contents, bool slam_params); - void hideHair(); - void hideSkirt(); - void startAppearanceAnimation(); - - //-------------------------------------------------------------------- - // Appearance morphing - //-------------------------------------------------------------------- -public: - bool getIsAppearanceAnimating() const { return mAppearanceAnimating; } - - // True if we are computing our appearance via local compositing - // instead of baked textures, as for example during wearable - // editing or when waiting for a subsequent server rebake. - /*virtual*/ bool isUsingLocalAppearance() const { return mUseLocalAppearance; } - - // True if we are currently in appearance editing mode. Often but - // not always the same as isUsingLocalAppearance(). - /*virtual*/ bool isEditingAppearance() const { return mIsEditingAppearance; } - - // FIXME review isUsingLocalAppearance uses, some should be isEditing instead. - -private: - bool mAppearanceAnimating; - LLFrameTimer mAppearanceMorphTimer; - F32 mLastAppearanceBlendTime; - bool mIsEditingAppearance; // flag for if we're actively in appearance editing mode - bool mUseLocalAppearance; // flag for if we're using a local composite - - //-------------------------------------------------------------------- - // Visibility - //-------------------------------------------------------------------- -public: - bool isVisible() const; - virtual bool shouldRenderRigged() const; - void setVisibilityRank(U32 rank); - U32 getVisibilityRank() const { return mVisibilityRank; } - static S32 sNumVisibleAvatars; // Number of instances of this class -/** Appearance - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** WEARABLES - **/ - - //-------------------------------------------------------------------- - // Attachments - //-------------------------------------------------------------------- -public: - void clampAttachmentPositions(); - virtual const LLViewerJointAttachment* attachObject(LLViewerObject *viewer_object); - virtual bool detachObject(LLViewerObject *viewer_object); - static bool getRiggedMeshID( LLViewerObject* pVO, LLUUID& mesh_id ); - void cleanupAttachedMesh( LLViewerObject* pVO ); - bool hasPendingAttachedMeshes(); - static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj); - /*virtual*/ bool isWearingWearableType(LLWearableType::EType type ) const; - LLViewerObject * findAttachmentByID( const LLUUID & target_id ) const; - LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object); - -protected: - void lazyAttach(); - void rebuildRiggedAttachments( void ); - - //-------------------------------------------------------------------- - // Map of attachment points, by ID - //-------------------------------------------------------------------- -public: - S32 getAttachmentCount() const; // Warning: order(N) not order(1) - typedef std::map<S32, LLViewerJointAttachment*> attachment_map_t; - attachment_map_t mAttachmentPoints; - std::vector<LLPointer<LLViewerObject> > mPendingAttachment; - - // List of attachments' ids with attach points from simulator. - // we need this info to know when all attachments are present. - std::map<LLUUID, S32> mSimAttachments; - S32 mLastCloudAttachmentCount; - LLFrameTimer mLastCloudAttachmentChangeTime; - - //-------------------------------------------------------------------- - // HUD functions - //-------------------------------------------------------------------- -public: - bool hasHUDAttachment() const; - LLBBox getHUDBBox() const; - void resetHUDAttachments(); - S32 getMaxAttachments() const; - bool canAttachMoreObjects(U32 n=1) const; - S32 getMaxAnimatedObjectAttachments() const; - bool canAttachMoreAnimatedObjects(U32 n=1) const; -protected: - U32 getNumAttachments() const; // O(N), not O(1) - U32 getNumAnimatedObjectAttachments() const; // O(N), not O(1) - -/** Wearables - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** ACTIONS - **/ - - //-------------------------------------------------------------------- - // Animations - //-------------------------------------------------------------------- -public: - bool isAnyAnimationSignaled(const LLUUID *anim_array, const S32 num_anims) const; - void processAnimationStateChanges(); -protected: - bool processSingleAnimationStateChange(const LLUUID &anim_id, bool start); - void resetAnimations(); -private: - LLTimer mAnimTimer; - F32 mTimeLast; - - //-------------------------------------------------------------------- - // Animation state data - //-------------------------------------------------------------------- -public: - typedef std::map<LLUUID, S32>::iterator AnimIterator; - std::map<LLUUID, S32> mSignaledAnimations; // requested state of Animation name/value - std::map<LLUUID, S32> mPlayingAnimations; // current state of Animation name/value - - typedef std::multimap<LLUUID, LLUUID> AnimationSourceMap; - typedef AnimationSourceMap::iterator AnimSourceIterator; - AnimationSourceMap mAnimationSources; // object ids that triggered anim ids - - //-------------------------------------------------------------------- - // Chat - //-------------------------------------------------------------------- -public: - void addChat(const LLChat& chat); - void clearChat(); - void startTyping() { mTyping = true; mTypingTimer.reset(); } - void stopTyping() { mTyping = false; } -private: - bool mVisibleChat; - - //-------------------------------------------------------------------- - // Lip synch morphs - //-------------------------------------------------------------------- -private: - bool mLipSyncActive; // we're morphing for lip sync - LLVisualParam* mOohMorph; // cached pointers morphs for lip sync - LLVisualParam* mAahMorph; // cached pointers morphs for lip sync - - //-------------------------------------------------------------------- - // Flight - //-------------------------------------------------------------------- -public: - bool mInAir; - LLFrameTimer mTimeInAir; - -/** Actions - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** PHYSICS - **/ - -private: - F32 mSpeedAccum; // measures speed (for diagnostics mostly). - bool mTurning; // controls hysteresis on avatar rotation - F32 mSpeed; // misc. animation repeated state - - //-------------------------------------------------------------------- - // Dimensions - //-------------------------------------------------------------------- -public: - void resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm); - bool distanceToGround( const LLVector3d &startPoint, LLVector3d &collisionPoint, F32 distToIntersectionAlongRay ); - void resolveHeightAgent(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm); - void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm); - void slamPosition(); // Slam position to transmitted position (for teleport); -protected: - - //-------------------------------------------------------------------- - // Material being stepped on - //-------------------------------------------------------------------- -private: - bool mStepOnLand; - U8 mStepMaterial; - LLVector3 mStepObjectVelocity; - -/** Physics - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** HIERARCHY - **/ - -public: - /*virtual*/ bool setParent(LLViewerObject* parent); - /*virtual*/ void addChild(LLViewerObject *childp); - /*virtual*/ void removeChild(LLViewerObject *childp); - - //-------------------------------------------------------------------- - // Sitting - //-------------------------------------------------------------------- -public: - void sitDown(bool bSitting); - bool isSitting(){return mIsSitting;} - void sitOnObject(LLViewerObject *sit_object); - void getOffObject(); -private: - // set this property only with LLVOAvatar::sitDown method - bool mIsSitting; - // position backup in case of missing data - LLVector3 mLastRootPos; - -/** Hierarchy - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** NAME - **/ - -public: - virtual std::string getFullname() const; // Returns "FirstName LastName" - std::string avString() const; // Frequently used string in log messages "Avatar '<full name'" -protected: - static void getAnimLabels(std::vector<std::string>* labels); - static void getAnimNames(std::vector<std::string>* names); -private: - bool mNameIsSet; - std::string mTitle; - bool mNameAway; - bool mNameDoNotDisturb; - bool mNameMute; - bool mNameAppearance; - bool mNameFriend; - bool mNameCloud; - F32 mNameAlpha; - bool mRenderGroupTitles; - - //-------------------------------------------------------------------- - // Display the name (then optionally fade it out) - //-------------------------------------------------------------------- -public: - LLFrameTimer mChatTimer; - LLPointer<LLHUDNameTag> mNameText; -private: - LLFrameTimer mTimeVisible; - std::deque<LLChat> mChats; - bool mTyping; - LLFrameTimer mTypingTimer; - -/** Name - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** SOUNDS - **/ - - //-------------------------------------------------------------------- - // Voice visualizer - //-------------------------------------------------------------------- -public: - // Responsible for detecting the user's voice signal (and when the - // user speaks, it puts a voice symbol over the avatar's head) and gesticulations - LLPointer<LLVoiceVisualizer> mVoiceVisualizer; - int mCurrentGesticulationLevel; - - //-------------------------------------------------------------------- - // Step sound - //-------------------------------------------------------------------- -protected: - const LLUUID& getStepSound() const; -private: - // Global table of sound ids per material, and the ground - const static LLUUID sStepSounds[LL_MCODE_END]; - const static LLUUID sStepSoundOnLand; - - //-------------------------------------------------------------------- - // Foot step state (for generating sounds) - //-------------------------------------------------------------------- -public: - void setFootPlane(const LLVector4 &plane) { mFootPlane = plane; } - LLVector4 mFootPlane; -private: - bool mWasOnGroundLeft; - bool mWasOnGroundRight; - -/** Sounds - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** DIAGNOSTICS - **/ - - //-------------------------------------------------------------------- - // General - //-------------------------------------------------------------------- -public: - void getSortedJointNames(S32 joint_type, std::vector<std::string>& result) const; - void dumpArchetypeXML(const std::string& prefix, bool group_by_wearables = false); - void dumpAppearanceMsgParams( const std::string& dump_prefix, - const LLAppearanceMessageContents& contents); - static void dumpBakedStatus(); - const std::string getBakedStatusForPrintout() const; - void dumpAvatarTEs(const std::string& context) const; - - static F32 sUnbakedTime; // Total seconds with >=1 unbaked avatars - static F32 sUnbakedUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) - static F32 sGreyTime; // Total seconds with >=1 grey avatars - static F32 sGreyUpdateTime; // Last time stats were updated (to prevent multiple updates per frame) -protected: - S32 getUnbakedPixelAreaRank(); - bool mHasGrey; -private: - F32 mMinPixelArea; - F32 mMaxPixelArea; - F32 mAdjustedPixelArea; - std::string mDebugText; - std::string mBakedTextureDebugText; - - - //-------------------------------------------------------------------- - // Avatar Rez Metrics - //-------------------------------------------------------------------- -public: - void debugAvatarRezTime(std::string notification_name, std::string comment = ""); - F32 debugGetExistenceTimeElapsedF32() const { return mDebugExistenceTimer.getElapsedTimeF32(); } - -protected: - LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez - LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory. - LLFrameTimer mLastAppearanceMessageTimer; // Time since last appearance message received. - - //-------------------------------------------------------------------- - // COF monitoring - //-------------------------------------------------------------------- - -public: - // COF version of last viewer-initiated appearance update request. For non-self avs, this will remain at default. - S32 mLastUpdateRequestCOFVersion; - - // COF version of last appearance message received for this av. - S32 mLastUpdateReceivedCOFVersion; - -/** Diagnostics - ** ** - *******************************************************************************/ - -/******************************************************************************** - ** ** - ** SUPPORT CLASSES - **/ - -protected: // Shared with LLVOAvatarSelf - - -/** Support classes - ** ** - *******************************************************************************/ - -}; // LLVOAvatar -extern const F32 SELF_ADDITIONAL_PRI; -extern const S32 MAX_TEXTURE_VIRTUAL_SIZE_RESET_INTERVAL; - -extern const F32 MAX_HOVER_Z; -extern const F32 MIN_HOVER_Z; - -std::string get_sequential_numbered_file_name(const std::string& prefix, - const std::string& suffix); -void dump_sequential_xml(const std::string outprefix, const LLSD& content); -void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value); - -#endif // LL_VOAVATAR_H - +/**
+ * @file llvoavatar.h
+ * @brief Declaration of LLVOAvatar class which is a derivation of
+ * LLViewerObject
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_VOAVATAR_H
+#define LL_VOAVATAR_H
+
+#include <map>
+#include <deque>
+#include <string>
+#include <vector>
+
+#include <boost/signals2/trackable.hpp>
+
+#include "llavatarappearance.h"
+#include "llchat.h"
+#include "lldrawpoolalpha.h"
+#include "llviewerobject.h"
+#include "llcharacter.h"
+#include "llcontrol.h"
+#include "llviewerjointmesh.h"
+#include "llviewerjointattachment.h"
+#include "llrendertarget.h"
+#include "llavatarappearancedefines.h"
+#include "lltexglobalcolor.h"
+#include "lldriverparam.h"
+#include "llviewertexlayer.h"
+#include "material_codes.h" // LL_MCODE_END
+#include "llrigginginfo.h"
+#include "llviewerstats.h"
+#include "llvovolume.h"
+#include "llavatarrendernotifier.h"
+#include "llmodel.h"
+
+extern const LLUUID ANIM_AGENT_BODY_NOISE;
+extern const LLUUID ANIM_AGENT_BREATHE_ROT;
+extern const LLUUID ANIM_AGENT_PHYSICS_MOTION;
+extern const LLUUID ANIM_AGENT_EDITING;
+extern const LLUUID ANIM_AGENT_EYE;
+extern const LLUUID ANIM_AGENT_FLY_ADJUST;
+extern const LLUUID ANIM_AGENT_HAND_MOTION;
+extern const LLUUID ANIM_AGENT_HEAD_ROT;
+extern const LLUUID ANIM_AGENT_PELVIS_FIX;
+extern const LLUUID ANIM_AGENT_TARGET;
+extern const LLUUID ANIM_AGENT_WALK_ADJUST;
+
+class LLViewerWearable;
+class LLVoiceVisualizer;
+class LLHUDNameTag;
+class LLHUDEffectSpiral;
+class LLTexGlobalColor;
+
+struct LLAppearanceMessageContents;
+class LLViewerJointMesh;
+
+const F32 MAX_AVATAR_LOD_FACTOR = 1.0f;
+
+extern U32 gFrameCount;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// LLVOAvatar
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLVOAvatar :
+ public LLAvatarAppearance,
+ public LLViewerObject,
+ public boost::signals2::trackable
+{
+ LL_ALIGN_NEW;
+ LOG_CLASS(LLVOAvatar);
+
+public:
+ friend class LLVOAvatarSelf;
+ friend class LLAvatarCheckImpostorMode;
+
+/********************************************************************************
+ ** **
+ ** INITIALIZATION
+ **/
+
+public:
+ LLVOAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
+ virtual void markDead();
+ static void initClass(); // Initialize data that's only init'd once per class.
+ static void cleanupClass(); // Cleanup data that's only init'd once per class.
+ virtual void initInstance(); // Called after construction to initialize the class.
+protected:
+ virtual ~LLVOAvatar();
+
+/** Initialization
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** INHERITED
+ **/
+
+ //--------------------------------------------------------------------
+ // LLViewerObject interface and related
+ //--------------------------------------------------------------------
+public:
+ /*virtual*/ void updateGL();
+ /*virtual*/ LLVOAvatar* asAvatar();
+
+ virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
+ void **user_data,
+ U32 block_num,
+ const EObjectUpdateType update_type,
+ LLDataPacker *dp);
+ virtual void idleUpdate(LLAgent &agent, const F64 &time);
+ /*virtual*/ bool updateLOD();
+ bool updateJointLODs();
+ void updateLODRiggedAttachments( void );
+ /*virtual*/ bool isActive() const; // Whether this object needs to do an idleUpdate.
+ S32Bytes totalTextureMemForUUIDS(std::set<LLUUID>& ids);
+ bool allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const;
+ bool allLocalTexturesCompletelyDownloaded() const;
+ bool allBakedTexturesCompletelyDownloaded() const;
+ void bakedTextureOriginCounts(S32 &sb_count, S32 &host_count,
+ S32 &both_count, S32 &neither_count);
+ std::string bakedTextureOriginInfo();
+ void collectLocalTextureUUIDs(std::set<LLUUID>& ids) const;
+ void collectBakedTextureUUIDs(std::set<LLUUID>& ids) const;
+ void collectTextureUUIDs(std::set<LLUUID>& ids);
+ void releaseOldTextures();
+ /*virtual*/ void updateTextures();
+ LLViewerFetchedTexture* getBakedTextureImage(const U8 te, const LLUUID& uuid);
+ /*virtual*/ S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim.
+ /*virtual*/ void onShift(const LLVector4a& shift_vector);
+ /*virtual*/ U32 getPartitionType() const;
+ /*virtual*/ const LLVector3 getRenderPosition() const;
+ /*virtual*/ void updateDrawable(bool force_damped);
+ /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
+ /*virtual*/ bool updateGeometry(LLDrawable *drawable);
+ /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
+ /*virtual*/ void updateRegion(LLViewerRegion *regionp);
+ /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax);
+ void calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax);
+ /*virtual*/ bool lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end,
+ S32 face = -1, // which face to check, -1 = ALL_SIDES
+ bool pick_transparent = false,
+ bool pick_rigged = false,
+ bool pick_unselectable = true,
+ S32* face_hit = NULL, // which face was hit
+ LLVector4a* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector4a* normal = NULL, // return the surface normal at the intersection point
+ LLVector4a* tangent = NULL); // return the surface tangent at the intersection point
+ virtual LLViewerObject* lineSegmentIntersectRiggedAttachments(
+ const LLVector4a& start, const LLVector4a& end,
+ S32 face = -1, // which face to check, -1 = ALL_SIDES
+ bool pick_transparent = false,
+ bool pick_rigged = false,
+ bool pick_unselectable = true,
+ S32* face_hit = NULL, // which face was hit
+ LLVector4a* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector4a* normal = NULL, // return the surface normal at the intersection point
+ LLVector4a* tangent = NULL); // return the surface tangent at the intersection point
+
+ //--------------------------------------------------------------------
+ // LLCharacter interface and related
+ //--------------------------------------------------------------------
+public:
+ /*virtual*/ LLVector3 getCharacterPosition();
+ /*virtual*/ LLQuaternion getCharacterRotation();
+ /*virtual*/ LLVector3 getCharacterVelocity();
+ /*virtual*/ LLVector3 getCharacterAngularVelocity();
+
+ /*virtual*/ LLUUID remapMotionID(const LLUUID& id);
+ /*virtual*/ bool startMotion(const LLUUID& id, F32 time_offset = 0.f);
+ /*virtual*/ bool stopMotion(const LLUUID& id, bool stop_immediate = false);
+ virtual bool hasMotionFromSource(const LLUUID& source_id);
+ virtual void stopMotionFromSource(const LLUUID& source_id);
+ virtual void requestStopMotion(LLMotion* motion);
+ LLMotion* findMotion(const LLUUID& id) const;
+ void startDefaultMotions();
+ void dumpAnimationState();
+
+ virtual LLJoint* getJoint(const std::string &name);
+ LLJoint* getJoint(S32 num);
+
+ //if you KNOW joint_num is a valid animated joint index, use getSkeletonJoint for efficiency
+ inline LLJoint* getSkeletonJoint(S32 joint_num) { return mSkeleton[joint_num]; }
+ inline size_t getSkeletonJointCount() const { return mSkeleton.size(); }
+
+ void notifyAttachmentMeshLoaded();
+ void addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LLUUID>* meshes_seen = NULL, bool recursive = true);
+ void removeAttachmentOverridesForObject(const LLUUID& mesh_id);
+ void removeAttachmentOverridesForObject(LLViewerObject *vo);
+ bool jointIsRiggedTo(const LLJoint *joint) const;
+ void clearAttachmentOverrides();
+ void rebuildAttachmentOverrides();
+ void updateAttachmentOverrides();
+ void showAttachmentOverrides(bool verbose = false) const;
+ void getAttachmentOverrideNames(std::set<std::string>& pos_names,
+ std::set<std::string>& scale_names) const;
+
+ void getAssociatedVolumes(std::vector<LLVOVolume*>& volumes);
+
+ // virtual
+ void updateRiggingInfo();
+ // This encodes mesh id and LOD, so we can see whether display is up-to-date.
+ std::map<LLUUID,S32> mLastRiggingInfoKey;
+
+ std::set<LLUUID> mActiveOverrideMeshes;
+ virtual void onActiveOverrideMeshesChanged();
+
+ /*virtual*/ const LLUUID& getID() const;
+ /*virtual*/ void addDebugText(const std::string& text);
+ /*virtual*/ F32 getTimeDilation();
+ /*virtual*/ void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm);
+ /*virtual*/ F32 getPixelArea() const;
+ /*virtual*/ LLVector3d getPosGlobalFromAgent(const LLVector3 &position);
+ /*virtual*/ LLVector3 getPosAgentFromGlobal(const LLVector3d &position);
+ virtual void updateVisualParams();
+
+/** Inherited
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** STATE
+ **/
+
+public:
+ virtual bool isSelf() const { return false; } // True if this avatar is for this viewer's agent
+
+ virtual bool isControlAvatar() const { return mIsControlAvatar; } // True if this avatar is a control av (no associated user)
+ virtual bool isUIAvatar() const { return mIsUIAvatar; } // True if this avatar is a supplemental av used in some UI views (no associated user)
+ virtual bool isBuddy() const;
+
+ // If this is an attachment, return the avatar it is attached to. Otherwise NULL.
+ virtual const LLVOAvatar *getAttachedAvatar() const { return NULL; }
+ virtual LLVOAvatar *getAttachedAvatar() { return NULL; }
+
+
+private: //aligned members
+ LL_ALIGN_16(LLVector4a mImpostorExtents[2]);
+
+ //--------------------------------------------------------------------
+ // Updates
+ //--------------------------------------------------------------------
+public:
+ void updateAppearanceMessageDebugText();
+ void updateAnimationDebugText();
+ virtual void updateDebugText();
+ virtual bool computeNeedsUpdate();
+ virtual bool updateCharacter(LLAgent &agent);
+ void updateFootstepSounds();
+ void computeUpdatePeriod();
+ void updateOrientation(LLAgent &agent, F32 speed, F32 delta_time);
+ void updateTimeStep();
+ void updateRootPositionAndRotation(LLAgent &agent, F32 speed, bool was_sit_ground_constrained);
+
+ void idleUpdateVoiceVisualizer(bool voice_enabled, const LLVector3 &position);
+ void idleUpdateMisc(bool detailed_update);
+ virtual void idleUpdateAppearanceAnimation();
+ void idleUpdateLipSync(bool voice_enabled);
+ void idleUpdateLoadingEffect();
+ void idleUpdateWindEffect();
+ void idleUpdateNameTag(const LLVector3& root_pos_last);
+ void idleUpdateNameTagText(bool new_name);
+ void idleUpdateNameTagAlpha(bool new_name, F32 alpha);
+ LLColor4 getNameTagColor(bool is_friend);
+ void clearNameTag();
+ static void invalidateNameTag(const LLUUID& agent_id);
+ // force all name tags to rebuild, useful when display names turned on/off
+ static void invalidateNameTags();
+ void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font, const bool use_ellipses = false);
+ void idleUpdateRenderComplexity();
+ void idleUpdateDebugInfo();
+ void accountRenderComplexityForObject(LLViewerObject *attached_object,
+ const F32 max_attachment_complexity,
+ LLVOVolume::texture_cost_t& textures,
+ U32& cost,
+ hud_complexity_list_t& hud_complexity_list,
+ object_complexity_list_t& object_complexity_list);
+ void calculateUpdateRenderComplexity();
+ static const U32 VISUAL_COMPLEXITY_UNKNOWN;
+ void updateVisualComplexity();
+
+ void placeProfileQuery();
+ void readProfileQuery(S32 retries);
+
+ // get the GPU time in ms of rendering this avatar including all attachments
+ // returns 0.f if this avatar has not been profiled using gPipeline.profileAvatar
+ // or the avatar is visually muted
+ F32 getGPURenderTime();
+
+ // get the total GPU render time in ms of all avatars that have been benched
+ static F32 getTotalGPURenderTime();
+
+ // get the max GPU render time in ms of all avatars that have been benched
+ static F32 getMaxGPURenderTime();
+
+ // get the average GPU render time in ms of all avatars that have been benched
+ static F32 getAverageGPURenderTime();
+
+ // get the CPU time in ms of rendering this avatar including all attachments
+ // return 0.f if this avatar has not been profiled using gPipeline.mProfileAvatar
+ F32 getCPURenderTime() { return mCPURenderTime; }
+
+
+ // avatar render cost
+ U32 getVisualComplexity() { return mVisualComplexity; };
+
+ // surface area calculation
+ F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; };
+
+ U32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server
+ void setReportedVisualComplexity(U32 value) { mReportedVisualComplexity = value; };
+
+ S32 getUpdatePeriod() { return mUpdatePeriod; };
+ const LLColor4 & getMutedAVColor() { return mMutedAVColor; };
+ static void updateImpostorRendering(U32 newMaxNonImpostorsValue);
+
+ void idleUpdateBelowWater();
+
+ static void updateNearbyAvatarCount();
+
+ LLVector3 idleCalcNameTagPosition(const LLVector3 &root_pos_last);
+
+ //--------------------------------------------------------------------
+ // Static preferences (controlled by user settings/menus)
+ //--------------------------------------------------------------------
+public:
+ static S32 sRenderName;
+ static bool sRenderGroupTitles;
+ static const U32 NON_IMPOSTORS_MAX_SLIDER; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors
+ * slider in panel_preferences_graphics1.xml */
+ static U32 sMaxNonImpostors; // affected by control "RenderAvatarMaxNonImpostors"
+ static bool sLimitNonImpostors; // use impostors for far away avatars
+ static F32 sRenderDistance; // distance at which avatars will render.
+ static bool sShowAnimationDebug; // show animation debug info
+ static bool sShowCollisionVolumes; // show skeletal collision volumes
+ static bool sVisibleInFirstPerson;
+ static S32 sNumLODChangesThisFrame;
+ static S32 sNumVisibleChatBubbles;
+ static bool sDebugInvisible;
+ static bool sShowAttachmentPoints;
+ static F32 sLODFactor; // user-settable LOD factor
+ static F32 sPhysicsLODFactor; // user-settable physics LOD factor
+ static bool sJointDebug; // output total number of joints being touched for each avatar
+
+ static LLPointer<LLViewerTexture> sCloudTexture;
+
+ static std::vector<LLUUID> sAVsIgnoringARTLimit;
+ static S32 sAvatarsNearby;
+
+ //--------------------------------------------------------------------
+ // Region state
+ //--------------------------------------------------------------------
+public:
+ LLHost getObjectHost() const;
+
+ //--------------------------------------------------------------------
+ // Loading state
+ //--------------------------------------------------------------------
+public:
+ bool isFullyLoaded() const;
+ F32 getFirstDecloudTime() const {return mFirstDecloudTime;}
+
+ // check and return current state relative to limits
+ // default will test only the geometry (combined=false).
+ // this allows us to disable shadows separately on complex avatars.
+
+ inline bool isTooSlowWithoutShadows() const {return mTooSlowWithoutShadows;};
+ bool isTooSlow() const;
+
+ void updateTooSlow();
+
+ bool isTooComplex() const;
+ bool visualParamWeightsAreDefault();
+ virtual bool getIsCloud() const;
+ bool isFullyTextured() const;
+ bool hasGray() const;
+ S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded.
+ void updateRezzedStatusTimers(S32 status);
+
+ S32 mLastRezzedStatus;
+
+
+ void startPhase(const std::string& phase_name);
+ void stopPhase(const std::string& phase_name, bool err_check = true);
+ void clearPhases();
+ void logPendingPhases();
+ static void logPendingPhasesAllAvatars();
+ void logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed);
+
+ void calcMutedAVColor();
+
+protected:
+ LLViewerStats::PhaseMap& getPhases() { return mPhases; }
+ bool updateIsFullyLoaded();
+ bool processFullyLoadedChange(bool loading);
+ void updateRuthTimer(bool loading);
+ F32 calcMorphAmount();
+
+private:
+ bool mFirstFullyVisible;
+ F32 mFirstDecloudTime;
+ LLFrameTimer mFirstAppearanceMessageTimer;
+
+ bool mFullyLoaded;
+ bool mPreviousFullyLoaded;
+ bool mFullyLoadedInitialized;
+ S32 mFullyLoadedFrameCounter;
+ LLColor4 mMutedAVColor;
+ LLFrameTimer mFullyLoadedTimer;
+ LLFrameTimer mRuthTimer;
+
+ // variables to hold "slowness" status
+ bool mTooSlow{false};
+ bool mTooSlowWithoutShadows{false};
+
+ bool mTuned{false};
+
+private:
+ LLViewerStats::PhaseMap mPhases;
+
+protected:
+ LLFrameTimer mInvisibleTimer;
+
+/** State
+ ** **
+ *******************************************************************************/
+/********************************************************************************
+ ** **
+ ** SKELETON
+ **/
+
+protected:
+ /*virtual*/ LLAvatarJoint* createAvatarJoint(); // Returns LLViewerJoint
+ /*virtual*/ LLAvatarJoint* createAvatarJoint(S32 joint_num); // Returns LLViewerJoint
+ /*virtual*/ LLAvatarJointMesh* createAvatarJointMesh(); // Returns LLViewerJointMesh
+public:
+ void updateHeadOffset();
+ void debugBodySize() const;
+ void postPelvisSetRecalc( void );
+
+ /*virtual*/ bool loadSkeletonNode();
+ void initAttachmentPoints(bool ignore_hud_joints = false);
+ /*virtual*/ void buildCharacter();
+ void resetVisualParams();
+ void applyDefaultParams();
+ void resetSkeleton(bool reset_animations);
+
+ LLVector3 mCurRootToHeadOffset;
+ LLVector3 mTargetRootToHeadOffset;
+
+ S32 mLastSkeletonSerialNum;
+
+
+/** Skeleton
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** RENDERING
+ **/
+
+public:
+ U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
+ bool isVisuallyMuted();
+ bool isInMuteList() const;
+
+ // states for RenderAvatarComplexityMode
+ enum ERenderComplexityMode
+ {
+ AV_RENDER_LIMIT_BY_COMPLEXITY = 0,
+ AV_RENDER_ALWAYS_SHOW_FRIENDS = 1,
+ AV_RENDER_ONLY_SHOW_FRIENDS = 2
+ };
+
+ // Visual Mute Setting is an input. Does not necessarily determine
+ // what the avatar looks like, because it interacts with other
+ // settings like muting, complexity threshold. Should be private or protected.
+ enum VisualMuteSettings
+ {
+ AV_RENDER_NORMALLY = 0,
+ AV_DO_NOT_RENDER = 1,
+ AV_ALWAYS_RENDER = 2
+ };
+ void setVisualMuteSettings(VisualMuteSettings set);
+
+protected:
+ // If you think you need to access this outside LLVOAvatar, you probably want getOverallAppearance()
+ VisualMuteSettings getVisualMuteSettings() { return mVisuallyMuteSetting; };
+
+public:
+
+ // Overall Appearance is an output. Depending on whether the
+ // avatar is blocked/muted, whether it exceeds the complexity
+ // threshold, etc, avatar will want to be displayed in one of
+ // these ways. Rendering code that wants to know how to display an
+ // avatar should be looking at this value, NOT the visual mute
+ // settings
+ enum AvatarOverallAppearance
+ {
+ AOA_NORMAL,
+ AOA_JELLYDOLL,
+ AOA_INVISIBLE
+ };
+
+ AvatarOverallAppearance getOverallAppearance() const;
+ void setOverallAppearanceNormal();
+ void setOverallAppearanceJellyDoll();
+ void setOverallAppearanceInvisible();
+
+ void updateOverallAppearance();
+ void updateOverallAppearanceAnimations();
+
+ std::set<LLUUID> mJellyAnims;
+
+ U32 renderRigid();
+ U32 renderSkinned();
+ F32 getLastSkinTime() { return mLastSkinTime; }
+ U32 renderTransparent(bool first_pass);
+ void renderCollisionVolumes();
+ void renderBones(const std::string &selected_joint = std::string());
+ void renderJoints();
+ static void deleteCachedImages(bool clearAll=true);
+ static void destroyGL();
+ static void restoreGL();
+ S32 mSpecialRenderMode; // special lighting
+
+private:
+ friend class LLPipeline;
+ AvatarOverallAppearance mOverallAppearance;
+ F32 mAttachmentSurfaceArea; //estimated surface area of attachments
+ U32 mAttachmentVisibleTriangleCount;
+ F32 mAttachmentEstTriangleCount;
+ bool shouldAlphaMask();
+
+ bool mNeedsSkin; // avatar has been animated and verts have not been updated
+ F32 mLastSkinTime; //value of gFrameTimeSeconds at last skin update
+
+ S32 mUpdatePeriod;
+ S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer.
+
+ // profile handle
+ U32 mGPUTimerQuery = 0;
+
+ // profile results
+
+ // GPU render time in ms
+ F32 mGPURenderTime = 0.f;
+ bool mGPUProfilePending = false;
+
+ // CPU render time in ms
+ F32 mCPURenderTime = 0.f;
+
+ // the isTooComplex method uses these mutable values to avoid recalculating too frequently
+ // DEPRECATED -- obsolete avatar render cost values
+ mutable U32 mVisualComplexity;
+ mutable bool mVisualComplexityStale;
+ U32 mReportedVisualComplexity; // from other viewers through the simulator
+
+ mutable bool mCachedInMuteList;
+ mutable F64 mCachedMuteListUpdateTime;
+
+ VisualMuteSettings mVisuallyMuteSetting; // Always or never visually mute this AV
+
+ //--------------------------------------------------------------------
+ // animated object status
+ //--------------------------------------------------------------------
+public:
+ bool mIsControlAvatar;
+ bool mIsUIAvatar;
+ bool mEnableDefaultMotions;
+
+ //--------------------------------------------------------------------
+ // Morph masks
+ //--------------------------------------------------------------------
+public:
+ /*virtual*/ void applyMorphMask(const U8* tex_data, S32 width, S32 height, S32 num_components, LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES);
+ bool morphMaskNeedsUpdate(LLAvatarAppearanceDefines::EBakedTextureIndex index = LLAvatarAppearanceDefines::BAKED_NUM_INDICES);
+
+
+ //--------------------------------------------------------------------
+ // Global colors
+ //--------------------------------------------------------------------
+public:
+ /*virtual*/void onGlobalColorChanged(const LLTexGlobalColor* global_color);
+
+ //--------------------------------------------------------------------
+ // Visibility
+ //--------------------------------------------------------------------
+protected:
+ void updateVisibility();
+private:
+ U32 mVisibilityRank;
+ bool mVisible;
+
+ //--------------------------------------------------------------------
+ // Shadowing
+ //--------------------------------------------------------------------
+public:
+ void updateShadowFaces();
+ LLDrawable* mShadow;
+private:
+ LLFace* mShadow0Facep;
+ LLFace* mShadow1Facep;
+ LLPointer<LLViewerTexture> mShadowImagep;
+
+ //--------------------------------------------------------------------
+ // Impostors
+ //--------------------------------------------------------------------
+public:
+ virtual bool isImpostor();
+ bool shouldImpostor(const F32 rank_factor = 1.0);
+ bool needsImpostorUpdate() const;
+ const LLVector3& getImpostorOffset() const;
+ const LLVector2& getImpostorDim() const;
+ void getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& distance) const;
+ void cacheImpostorValues();
+ void setImpostorDim(const LLVector2& dim);
+ static void resetImpostors();
+ static void updateImpostors();
+ LLRenderTarget mImpostor;
+ bool mNeedsImpostorUpdate;
+ S32 mLastImpostorUpdateReason;
+ F32SecondsImplicit mLastImpostorUpdateFrameTime;
+ const LLVector3* getLastAnimExtents() const { return mLastAnimExtents; }
+ void setNeedsExtentUpdate(bool val) { mNeedsExtentUpdate = val; }
+
+private:
+ LLVector3 mImpostorOffset;
+ LLVector2 mImpostorDim;
+ // This becomes true in the constructor and false after the first
+ // idleUpdateMisc(). Not clear it serves any purpose.
+ bool mNeedsAnimUpdate;
+ bool mNeedsExtentUpdate;
+ LLVector3 mImpostorAngle;
+ F32 mImpostorDistance;
+ F32 mImpostorPixelArea;
+ LLVector3 mLastAnimExtents[2];
+ LLVector3 mLastAnimBasePos;
+
+ LLCachedControl<bool> mRenderUnloadedAvatar;
+
+ //--------------------------------------------------------------------
+ // Wind rippling in clothes
+ //--------------------------------------------------------------------
+public:
+ LLVector4 mWindVec;
+ F32 mRipplePhase;
+ bool mBelowWater;
+private:
+ F32 mWindFreq;
+ LLFrameTimer mRippleTimer;
+ F32 mRippleTimeLast;
+ LLVector3 mRippleAccel;
+ LLVector3 mLastVel;
+
+ //--------------------------------------------------------------------
+ // Culling
+ //--------------------------------------------------------------------
+public:
+ static void cullAvatarsByPixelArea();
+ bool isCulled() const { return mCulled; }
+private:
+ bool mCulled;
+
+ //--------------------------------------------------------------------
+ // Constants
+ //--------------------------------------------------------------------
+public:
+ virtual LLViewerTexture::EBoostLevel getAvatarBoostLevel() const { return LLGLTexture::BOOST_AVATAR; }
+ virtual LLViewerTexture::EBoostLevel getAvatarBakedBoostLevel() const { return LLGLTexture::BOOST_AVATAR_BAKED; }
+ virtual S32 getTexImageSize() const;
+ /*virtual*/ S32 getTexImageArea() const { return getTexImageSize()*getTexImageSize(); }
+
+/** Rendering
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** TEXTURES
+ **/
+
+ //--------------------------------------------------------------------
+ // Loading status
+ //--------------------------------------------------------------------
+public:
+ virtual bool isTextureDefined(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const;
+ virtual bool isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, U32 index = 0) const;
+ virtual bool isTextureVisible(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerWearable *wearable) const;
+
+ bool isFullyBaked();
+ static bool areAllNearbyInstancesBaked(S32& grey_avatars);
+ static void getNearbyRezzedStats(std::vector<S32>& counts, F32& avg_cloud_time, S32& cloud_avatars);
+ static std::string rezStatusToString(S32 status);
+
+ //--------------------------------------------------------------------
+ // Baked textures
+ //--------------------------------------------------------------------
+public:
+ /*virtual*/ LLTexLayerSet* createTexLayerSet(); // Return LLViewerTexLayerSet
+ void releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY !
+
+protected:
+ static void onBakedTextureMasksLoaded(bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata);
+ static void onInitialBakedTextureLoaded(bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata);
+ static void onBakedTextureLoaded(bool success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, bool final, void* userdata);
+ virtual void removeMissingBakedTextures();
+ void useBakedTexture(const LLUUID& id);
+ LLViewerTexLayerSet* getTexLayerSet(const U32 index) const { return dynamic_cast<LLViewerTexLayerSet*>(mBakedTextureDatas[index].mTexLayerSet); }
+
+
+ LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
+ bool mLoadedCallbacksPaused;
+ S32 mLoadedCallbackTextures; // count of 'loaded' baked textures, filled from mCallbackTextureList
+ LLFrameTimer mLastTexCallbackAddedTime;
+ std::set<LLUUID> mTextureIDs;
+ //--------------------------------------------------------------------
+ // Local Textures
+ //--------------------------------------------------------------------
+protected:
+ virtual void setLocalTexture(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerTexture* tex, bool baked_version_exits, U32 index = 0);
+ virtual void addLocalTextureStats(LLAvatarAppearanceDefines::ETextureIndex type, LLViewerFetchedTexture* imagep, F32 texel_area_ratio, bool rendered, bool covered_by_baked);
+ // MULTI-WEARABLE: make self-only?
+ virtual void setBakedReady(LLAvatarAppearanceDefines::ETextureIndex type, bool baked_version_exists, U32 index = 0);
+
+ //--------------------------------------------------------------------
+ // Texture accessors
+ //--------------------------------------------------------------------
+private:
+ virtual void setImage(const U8 te, LLViewerTexture *imagep, const U32 index);
+ virtual LLViewerTexture* getImage(const U8 te, const U32 index) const;
+ const std::string getImageURL(const U8 te, const LLUUID &uuid);
+
+ virtual const LLTextureEntry* getTexEntry(const U8 te_num) const;
+ virtual void setTexEntry(const U8 index, const LLTextureEntry &te);
+
+ void checkTextureLoading() ;
+ //--------------------------------------------------------------------
+ // Layers
+ //--------------------------------------------------------------------
+protected:
+ void deleteLayerSetCaches(bool clearAll = true);
+ void addBakedTextureStats(LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level);
+
+ //--------------------------------------------------------------------
+ // Composites
+ //--------------------------------------------------------------------
+public:
+ virtual void invalidateComposite(LLTexLayerSet* layerset);
+ virtual void invalidateAll();
+ virtual void setCompositeUpdatesEnabled(bool b) {}
+ virtual void setCompositeUpdatesEnabled(U32 index, bool b) {}
+ virtual bool isCompositeUpdateEnabled(U32 index) { return false; }
+
+ //--------------------------------------------------------------------
+ // Static texture/mesh/baked dictionary
+ //--------------------------------------------------------------------
+public:
+ static bool isIndexLocalTexture(LLAvatarAppearanceDefines::ETextureIndex i);
+ static bool isIndexBakedTexture(LLAvatarAppearanceDefines::ETextureIndex i);
+
+ //--------------------------------------------------------------------
+ // Messaging
+ //--------------------------------------------------------------------
+public:
+ void onFirstTEMessageReceived();
+private:
+ bool mFirstTEMessageReceived;
+ bool mFirstAppearanceMessageReceived;
+
+/** Textures
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** MESHES
+ **/
+
+public:
+ void debugColorizeSubMeshes(U32 i, const LLColor4& color);
+ virtual void updateMeshTextures();
+ void updateSexDependentLayerSets();
+ virtual void dirtyMesh(); // Dirty the avatar mesh
+ void updateMeshData();
+ void updateMeshVisibility();
+ LLViewerTexture* getBakedTexture(const U8 te);
+
+ // Matrix palette cache entry
+ class alignas(16) MatrixPaletteCache
+ {
+ public:
+ // Last frame this entry was updated
+ U32 mFrame;
+
+ // List of Matrix4a's for this entry
+ LLMeshSkinInfo::matrix_list_t mMatrixPalette;
+
+ // Float array ready to be sent to GL
+ std::vector<F32> mGLMp;
+
+ MatrixPaletteCache() :
+ mFrame(gFrameCount - 1)
+ {
+ }
+ };
+
+ // Accessor for Matrix Palette Cache
+ // Will do a map lookup for the entry associated with the given MeshSkinInfo
+ // Will update said entry if it hasn't been updated yet this frame
+ const MatrixPaletteCache& updateSkinInfoMatrixPalette(const LLMeshSkinInfo* skinInfo);
+
+ // Map of LLMeshSkinInfo::mHash to MatrixPaletteCache
+ typedef std::unordered_map<U64, MatrixPaletteCache> matrix_palette_cache_t;
+ matrix_palette_cache_t mMatrixPaletteCache;
+
+protected:
+ void releaseMeshData();
+ virtual void restoreMeshData();
+private:
+ virtual void dirtyMesh(S32 priority); // Dirty the avatar mesh, with priority
+ LLViewerJoint* getViewerJoint(S32 idx);
+ S32 mDirtyMesh; // 0 -- not dirty, 1 -- morphed, 2 -- LOD
+ bool mMeshTexturesDirty;
+
+ //--------------------------------------------------------------------
+ // Destroy invisible mesh
+ //--------------------------------------------------------------------
+protected:
+ bool mMeshValid;
+ LLFrameTimer mMeshInvisibleTime;
+
+/** Meshes
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** APPEARANCE
+ **/
+
+ LLPointer<LLAppearanceMessageContents> mLastProcessedAppearance;
+
+public:
+ void parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& msg);
+ void processAvatarAppearance(LLMessageSystem* mesgsys);
+ void applyParsedAppearanceMessage(LLAppearanceMessageContents& contents, bool slam_params);
+ void hideHair();
+ void hideSkirt();
+ void startAppearanceAnimation();
+
+ //--------------------------------------------------------------------
+ // Appearance morphing
+ //--------------------------------------------------------------------
+public:
+ bool getIsAppearanceAnimating() const { return mAppearanceAnimating; }
+
+ // True if we are computing our appearance via local compositing
+ // instead of baked textures, as for example during wearable
+ // editing or when waiting for a subsequent server rebake.
+ /*virtual*/ bool isUsingLocalAppearance() const { return mUseLocalAppearance; }
+
+ // True if we are currently in appearance editing mode. Often but
+ // not always the same as isUsingLocalAppearance().
+ /*virtual*/ bool isEditingAppearance() const { return mIsEditingAppearance; }
+
+ // FIXME review isUsingLocalAppearance uses, some should be isEditing instead.
+
+private:
+ bool mAppearanceAnimating;
+ LLFrameTimer mAppearanceMorphTimer;
+ F32 mLastAppearanceBlendTime;
+ bool mIsEditingAppearance; // flag for if we're actively in appearance editing mode
+ bool mUseLocalAppearance; // flag for if we're using a local composite
+
+ //--------------------------------------------------------------------
+ // Visibility
+ //--------------------------------------------------------------------
+public:
+ bool isVisible() const;
+ virtual bool shouldRenderRigged() const;
+ void setVisibilityRank(U32 rank);
+ U32 getVisibilityRank() const { return mVisibilityRank; }
+ static S32 sNumVisibleAvatars; // Number of instances of this class
+/** Appearance
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** WEARABLES
+ **/
+
+ //--------------------------------------------------------------------
+ // Attachments
+ //--------------------------------------------------------------------
+public:
+ void clampAttachmentPositions();
+ virtual const LLViewerJointAttachment* attachObject(LLViewerObject *viewer_object);
+ virtual bool detachObject(LLViewerObject *viewer_object);
+ static bool getRiggedMeshID( LLViewerObject* pVO, LLUUID& mesh_id );
+ void cleanupAttachedMesh( LLViewerObject* pVO );
+ bool hasPendingAttachedMeshes();
+ static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj);
+ /*virtual*/ bool isWearingWearableType(LLWearableType::EType type ) const;
+ LLViewerObject * findAttachmentByID( const LLUUID & target_id ) const;
+ LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object);
+
+protected:
+ void lazyAttach();
+ void rebuildRiggedAttachments( void );
+
+ //--------------------------------------------------------------------
+ // Map of attachment points, by ID
+ //--------------------------------------------------------------------
+public:
+ S32 getAttachmentCount() const; // Warning: order(N) not order(1)
+ typedef std::map<S32, LLViewerJointAttachment*> attachment_map_t;
+ attachment_map_t mAttachmentPoints;
+ std::vector<LLPointer<LLViewerObject> > mPendingAttachment;
+
+ // List of attachments' ids with attach points from simulator.
+ // we need this info to know when all attachments are present.
+ std::map<LLUUID, S32> mSimAttachments;
+ S32 mLastCloudAttachmentCount;
+ LLFrameTimer mLastCloudAttachmentChangeTime;
+
+ //--------------------------------------------------------------------
+ // HUD functions
+ //--------------------------------------------------------------------
+public:
+ bool hasHUDAttachment() const;
+ LLBBox getHUDBBox() const;
+ void resetHUDAttachments();
+ S32 getMaxAttachments() const;
+ bool canAttachMoreObjects(U32 n=1) const;
+ S32 getMaxAnimatedObjectAttachments() const;
+ bool canAttachMoreAnimatedObjects(U32 n=1) const;
+protected:
+ U32 getNumAttachments() const; // O(N), not O(1)
+ U32 getNumAnimatedObjectAttachments() const; // O(N), not O(1)
+
+/** Wearables
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** ACTIONS
+ **/
+
+ //--------------------------------------------------------------------
+ // Animations
+ //--------------------------------------------------------------------
+public:
+ bool isAnyAnimationSignaled(const LLUUID *anim_array, const S32 num_anims) const;
+ void processAnimationStateChanges();
+protected:
+ bool processSingleAnimationStateChange(const LLUUID &anim_id, bool start);
+ void resetAnimations();
+private:
+ LLTimer mAnimTimer;
+ F32 mTimeLast;
+
+ //--------------------------------------------------------------------
+ // Animation state data
+ //--------------------------------------------------------------------
+public:
+ typedef std::map<LLUUID, S32>::iterator AnimIterator;
+ std::map<LLUUID, S32> mSignaledAnimations; // requested state of Animation name/value
+ std::map<LLUUID, S32> mPlayingAnimations; // current state of Animation name/value
+
+ typedef std::multimap<LLUUID, LLUUID> AnimationSourceMap;
+ typedef AnimationSourceMap::iterator AnimSourceIterator;
+ AnimationSourceMap mAnimationSources; // object ids that triggered anim ids
+
+ //--------------------------------------------------------------------
+ // Chat
+ //--------------------------------------------------------------------
+public:
+ void addChat(const LLChat& chat);
+ void clearChat();
+ void startTyping() { mTyping = true; mTypingTimer.reset(); }
+ void stopTyping() { mTyping = false; }
+private:
+ bool mVisibleChat;
+
+ //--------------------------------------------------------------------
+ // Lip synch morphs
+ //--------------------------------------------------------------------
+private:
+ bool mLipSyncActive; // we're morphing for lip sync
+ LLVisualParam* mOohMorph; // cached pointers morphs for lip sync
+ LLVisualParam* mAahMorph; // cached pointers morphs for lip sync
+
+ //--------------------------------------------------------------------
+ // Flight
+ //--------------------------------------------------------------------
+public:
+ bool mInAir;
+ LLFrameTimer mTimeInAir;
+
+/** Actions
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** PHYSICS
+ **/
+
+private:
+ F32 mSpeedAccum; // measures speed (for diagnostics mostly).
+ bool mTurning; // controls hysteresis on avatar rotation
+ F32 mSpeed; // misc. animation repeated state
+
+ //--------------------------------------------------------------------
+ // Dimensions
+ //--------------------------------------------------------------------
+public:
+ void resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm);
+ bool distanceToGround( const LLVector3d &startPoint, LLVector3d &collisionPoint, F32 distToIntersectionAlongRay );
+ void resolveHeightAgent(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm);
+ void resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm);
+ void slamPosition(); // Slam position to transmitted position (for teleport);
+protected:
+
+ //--------------------------------------------------------------------
+ // Material being stepped on
+ //--------------------------------------------------------------------
+private:
+ bool mStepOnLand;
+ U8 mStepMaterial;
+ LLVector3 mStepObjectVelocity;
+
+/** Physics
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** HIERARCHY
+ **/
+
+public:
+ /*virtual*/ bool setParent(LLViewerObject* parent);
+ /*virtual*/ void addChild(LLViewerObject *childp);
+ /*virtual*/ void removeChild(LLViewerObject *childp);
+
+ //--------------------------------------------------------------------
+ // Sitting
+ //--------------------------------------------------------------------
+public:
+ void sitDown(bool bSitting);
+ bool isSitting(){return mIsSitting;}
+ void sitOnObject(LLViewerObject *sit_object);
+ void getOffObject();
+private:
+ // set this property only with LLVOAvatar::sitDown method
+ bool mIsSitting;
+ // position backup in case of missing data
+ LLVector3 mLastRootPos;
+
+/** Hierarchy
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** NAME
+ **/
+
+public:
+ virtual std::string getFullname() const; // Returns "FirstName LastName"
+ std::string avString() const; // Frequently used string in log messages "Avatar '<full name'"
+protected:
+ static void getAnimLabels(std::vector<std::string>* labels);
+ static void getAnimNames(std::vector<std::string>* names);
+private:
+ bool mNameIsSet;
+ std::string mTitle;
+ bool mNameAway;
+ bool mNameDoNotDisturb;
+ bool mNameMute;
+ bool mNameAppearance;
+ bool mNameFriend;
+ bool mNameCloud;
+ F32 mNameAlpha;
+ bool mRenderGroupTitles;
+
+ //--------------------------------------------------------------------
+ // Display the name (then optionally fade it out)
+ //--------------------------------------------------------------------
+public:
+ LLFrameTimer mChatTimer;
+ LLPointer<LLHUDNameTag> mNameText;
+private:
+ LLFrameTimer mTimeVisible;
+ std::deque<LLChat> mChats;
+ bool mTyping;
+ LLFrameTimer mTypingTimer;
+
+/** Name
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** SOUNDS
+ **/
+
+ //--------------------------------------------------------------------
+ // Voice visualizer
+ //--------------------------------------------------------------------
+public:
+ // Responsible for detecting the user's voice signal (and when the
+ // user speaks, it puts a voice symbol over the avatar's head) and gesticulations
+ LLPointer<LLVoiceVisualizer> mVoiceVisualizer;
+ int mCurrentGesticulationLevel;
+
+ //--------------------------------------------------------------------
+ // Step sound
+ //--------------------------------------------------------------------
+protected:
+ const LLUUID& getStepSound() const;
+private:
+ // Global table of sound ids per material, and the ground
+ const static LLUUID sStepSounds[LL_MCODE_END];
+ const static LLUUID sStepSoundOnLand;
+
+ //--------------------------------------------------------------------
+ // Foot step state (for generating sounds)
+ //--------------------------------------------------------------------
+public:
+ void setFootPlane(const LLVector4 &plane) { mFootPlane = plane; }
+ LLVector4 mFootPlane;
+private:
+ bool mWasOnGroundLeft;
+ bool mWasOnGroundRight;
+
+/** Sounds
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** DIAGNOSTICS
+ **/
+
+ //--------------------------------------------------------------------
+ // General
+ //--------------------------------------------------------------------
+public:
+ void getSortedJointNames(S32 joint_type, std::vector<std::string>& result) const;
+ void dumpArchetypeXML(const std::string& prefix, bool group_by_wearables = false);
+ void dumpAppearanceMsgParams( const std::string& dump_prefix,
+ const LLAppearanceMessageContents& contents);
+ static void dumpBakedStatus();
+ const std::string getBakedStatusForPrintout() const;
+ void dumpAvatarTEs(const std::string& context) const;
+
+ static F32 sUnbakedTime; // Total seconds with >=1 unbaked avatars
+ static F32 sUnbakedUpdateTime; // Last time stats were updated (to prevent multiple updates per frame)
+ static F32 sGreyTime; // Total seconds with >=1 grey avatars
+ static F32 sGreyUpdateTime; // Last time stats were updated (to prevent multiple updates per frame)
+protected:
+ S32 getUnbakedPixelAreaRank();
+ bool mHasGrey;
+private:
+ F32 mMinPixelArea;
+ F32 mMaxPixelArea;
+ F32 mAdjustedPixelArea;
+ std::string mDebugText;
+ std::string mBakedTextureDebugText;
+
+
+ //--------------------------------------------------------------------
+ // Avatar Rez Metrics
+ //--------------------------------------------------------------------
+public:
+ void debugAvatarRezTime(std::string notification_name, std::string comment = "");
+ F32 debugGetExistenceTimeElapsedF32() const { return mDebugExistenceTimer.getElapsedTimeF32(); }
+
+protected:
+ LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez
+ LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory.
+ LLFrameTimer mLastAppearanceMessageTimer; // Time since last appearance message received.
+
+ //--------------------------------------------------------------------
+ // COF monitoring
+ //--------------------------------------------------------------------
+
+public:
+ // COF version of last viewer-initiated appearance update request. For non-self avs, this will remain at default.
+ S32 mLastUpdateRequestCOFVersion;
+
+ // COF version of last appearance message received for this av.
+ S32 mLastUpdateReceivedCOFVersion;
+
+/** Diagnostics
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** SUPPORT CLASSES
+ **/
+
+protected: // Shared with LLVOAvatarSelf
+
+
+/** Support classes
+ ** **
+ *******************************************************************************/
+
+}; // LLVOAvatar
+extern const F32 SELF_ADDITIONAL_PRI;
+extern const S32 MAX_TEXTURE_VIRTUAL_SIZE_RESET_INTERVAL;
+
+extern const F32 MAX_HOVER_Z;
+extern const F32 MIN_HOVER_Z;
+
+std::string get_sequential_numbered_file_name(const std::string& prefix,
+ const std::string& suffix);
+void dump_sequential_xml(const std::string outprefix, const LLSD& content);
+void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value);
+
+#endif // LL_VOAVATAR_H
+
|