diff --git a/indra/cwdebug/debug.h b/indra/cwdebug/debug.h index 3c59db690..58e0c6ac9 100644 --- a/indra/cwdebug/debug.h +++ b/indra/cwdebug/debug.h @@ -392,6 +392,40 @@ void InstanceTracker::dump(void) } // namespace debug +template +class AIDebugInstanceCounter +{ + public: + static int sInstanceCount; + + protected: + static void print_count(char const* name, int count, bool destruction); + + AIDebugInstanceCounter() + { + print_count(typeid(T).name(), ++sInstanceCount, false); + } + AIDebugInstanceCounter(AIDebugInstanceCounter const&) + { + print_count(typeid(T).name(), ++sInstanceCount, false); + } + ~AIDebugInstanceCounter() + { + print_count(typeid(T).name(), --sInstanceCount, true); + } +}; + +//static +template +int AIDebugInstanceCounter::sInstanceCount; + +//static +template +void AIDebugInstanceCounter::print_count(char const* name, int count, bool destruction) +{ + Dout(dc::notice, (destruction ? "Destructed " : "Constructing ") << name << ", now " << count << " instance" << ((count == 1) ? "." : "s.")); +} + //! Debugging macro. // // Print "Entering " << \a data to channel \a cntrl and increment diff --git a/indra/libhacd/hacdHACD.h b/indra/libhacd/hacdHACD.h index 2ca9a4ae7..fd9fd4301 100644 --- a/indra/libhacd/hacdHACD.h +++ b/indra/libhacd/hacdHACD.h @@ -317,7 +317,7 @@ namespace HACD bool m_addFacesPoints; //>! specifies whether to add faces points or not bool m_addExtraDistPoints; //>! specifies whether to add extra points for concave shapes or not - friend HACD * const CreateHACD(HeapManager * heapManager = 0); + friend HACD * const CreateHACD(HeapManager * heapManager); friend void DestroyHACD(HACD * const hacd); }; inline HACD * const CreateHACD(HeapManager * heapManager) diff --git a/indra/llaudio/llaudiodecodemgr.h b/indra/llaudio/llaudiodecodemgr.h index 917511daa..3ff894dba 100644 --- a/indra/llaudio/llaudiodecodemgr.h +++ b/indra/llaudio/llaudiodecodemgr.h @@ -24,7 +24,7 @@ */ #ifndef LL_LLAUDIODECODEMGR_H -#define LL_LLAUDIODECODEMG_H +#define LL_LLAUDIODECODEMGR_H #include "stdtypes.h" diff --git a/indra/llcharacter/CMakeLists.txt b/indra/llcharacter/CMakeLists.txt index 6652333ef..8dda476d9 100644 --- a/indra/llcharacter/CMakeLists.txt +++ b/indra/llcharacter/CMakeLists.txt @@ -29,7 +29,6 @@ set(llcharacter_SOURCE_FILES lljointsolverrp3.cpp llkeyframefallmotion.cpp llkeyframemotion.cpp - llkeyframemotionparam.cpp llkeyframestandmotion.cpp llkeyframewalkmotion.cpp llmotion.cpp @@ -57,7 +56,6 @@ set(llcharacter_HEADER_FILES lljointstate.h llkeyframefallmotion.h llkeyframemotion.h - llkeyframemotionparam.h llkeyframestandmotion.h llkeyframewalkmotion.h llmotion.h diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp index 888c20cd4..12960ac01 100644 --- a/indra/llcharacter/llcharacter.cpp +++ b/indra/llcharacter/llcharacter.cpp @@ -136,7 +136,6 @@ LLMotion* LLCharacter::findMotion( const LLUUID &id ) //----------------------------------------------------------------------------- // createMotion() -// NOTE: Always assign the result to a LLPointer! //----------------------------------------------------------------------------- LLMotion* LLCharacter::createMotion( const LLUUID &id ) { @@ -195,11 +194,26 @@ void LLCharacter::updateMotions(e_update_t update_type) { if (update_type == HIDDEN_UPDATE) { + // + // Keep updating avatars that have at least one motion that is synchronized with a still running motion. + // This call tells the other controllers that we are in principle hidden. + // It returns false if we need to keep updating anyway. + if (!mMotionController.hidden(true)) + { + mMotionController.updateMotions(LLCharacter::NORMAL_UPDATE); + return; + } + // LLFastTimer t(FTM_UPDATE_HIDDEN_ANIMATION); mMotionController.updateMotionsMinimal(); } else { + // + // This call tells the other controllers that we are visible and that they need + // to keep updating if they are synchronized with us, even if they are hidden. + mMotionController.hidden(false); + // LLFastTimer t(FTM_UPDATE_ANIMATION); // unpause if the number of outstanding pause requests has dropped to the initial one if (mMotionController.isPaused() && mPauseRequest->getNumRefs() == 1) @@ -529,3 +543,17 @@ LLAnimPauseRequest LLCharacter::requestPause() return mPauseRequest; } +void LLCharacter::requestPause(std::vector& avatar_pause_handles) +{ + mMotionController.pauseAllMotions(); + avatar_pause_handles.push_back(mPauseRequest); +} + +void LLCharacter::pauseAllSyncedCharacters(std::vector& avatar_pause_handles) +{ + // Pause this avatar. + requestPause(avatar_pause_handles); + // Also pause all avatars with synchronized motions. + mMotionController.pauseAllSyncedCharacters(avatar_pause_handles); +} + diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index 2b872effa..f618b446f 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -146,6 +146,7 @@ public: // is this motion active? BOOL isMotionActive( const LLUUID& id ); + bool isMotionActive(U32 bit) const { return mMotionController.isactive(bit); } // Event handler for motion deactivation. // Called when a motion has completely stopped and has been deactivated. @@ -158,6 +159,8 @@ public: void updateMotions(e_update_t update_type); LLAnimPauseRequest requestPause(); + void requestPause(std::vector& avatar_pause_handles); + void pauseAllSyncedCharacters(std::vector& avatar_pause_handles); BOOL areAnimationsPaused() const { return mMotionController.isPaused(); } void setAnimTimeFactor(F32 factor) { mMotionController.setTimeFactor(factor); } void setTimeStep(F32 time_step) { mMotionController.setTimeStep(time_step); } diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp index c2a87d80a..d07f37779 100644 --- a/indra/llcharacter/lleditingmotion.cpp +++ b/indra/llcharacter/lleditingmotion.cpp @@ -49,7 +49,7 @@ S32 LLEditingMotion::sHandPosePriority = 3; // LLEditingMotion() // Class Constructor //----------------------------------------------------------------------------- -LLEditingMotion::LLEditingMotion( const LLUUID &id) : LLMotion(id) +LLEditingMotion::LLEditingMotion(LLUUID const& id, LLMotionController* controller) : AIMaskedMotion(id, controller, ANIM_AGENT_EDITING) { mCharacter = NULL; @@ -155,7 +155,7 @@ BOOL LLEditingMotion::onActivate() mShoulderJoint.setRotation( mShoulderState->getJoint()->getRotation() ); mElbowJoint.setRotation( mElbowState->getJoint()->getRotation() ); - return TRUE; + return AIMaskedMotion::onActivate(); } //----------------------------------------------------------------------------- @@ -256,12 +256,4 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask) return result; } -//----------------------------------------------------------------------------- -// LLEditingMotion::onDeactivate() -//----------------------------------------------------------------------------- -void LLEditingMotion::onDeactivate() -{ -} - - // End diff --git a/indra/llcharacter/lleditingmotion.h b/indra/llcharacter/lleditingmotion.h index 4a83d4b9f..bc95ff682 100644 --- a/indra/llcharacter/lleditingmotion.h +++ b/indra/llcharacter/lleditingmotion.h @@ -49,11 +49,11 @@ // class LLEditingMotion //----------------------------------------------------------------------------- class LLEditingMotion : - public LLMotion + public AIMaskedMotion { public: // Constructor - LLEditingMotion(const LLUUID &id); + LLEditingMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLEditingMotion(); @@ -65,7 +65,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLEditingMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLEditingMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -107,9 +107,6 @@ public: // must return FALSE when the motion is completed. virtual BOOL onUpdate(F32 time, U8* joint_mask); - // called when a motion is deactivated - virtual void onDeactivate(); - public: //------------------------------------------------------------------------- // joint states to be animated diff --git a/indra/llcharacter/llhandmotion.cpp b/indra/llcharacter/llhandmotion.cpp index 696dba0d9..be6dbb050 100644 --- a/indra/llcharacter/llhandmotion.cpp +++ b/indra/llcharacter/llhandmotion.cpp @@ -61,7 +61,7 @@ const F32 HAND_MORPH_BLEND_TIME = 0.2f; // LLHandMotion() // Class Constructor //----------------------------------------------------------------------------- -LLHandMotion::LLHandMotion(const LLUUID &id) : LLMotion(id) +LLHandMotion::LLHandMotion(LLUUID const& id, LLMotionController* controller) : AIMaskedMotion(id, controller, ANIM_AGENT_HAND_MOTION) { mCharacter = NULL; mLastTime = 0.f; @@ -112,7 +112,7 @@ BOOL LLHandMotion::onActivate() mCharacter->setVisualParamWeight(gHandPoseNames[mCurrentPose], 1.f); mCharacter->updateVisualParams(); } - return TRUE; + return AIMaskedMotion::onActivate(); } @@ -235,14 +235,6 @@ BOOL LLHandMotion::onUpdate(F32 time, U8* joint_mask) return TRUE; } - -//----------------------------------------------------------------------------- -// LLHandMotion::onDeactivate() -//----------------------------------------------------------------------------- -void LLHandMotion::onDeactivate() -{ -} - //----------------------------------------------------------------------------- // LLHandMotion::getHandPoseName() //----------------------------------------------------------------------------- diff --git a/indra/llcharacter/llhandmotion.h b/indra/llcharacter/llhandmotion.h index dcf169662..012c3c6be 100644 --- a/indra/llcharacter/llhandmotion.h +++ b/indra/llcharacter/llhandmotion.h @@ -45,7 +45,7 @@ // class LLHandMotion //----------------------------------------------------------------------------- class LLHandMotion : - public LLMotion + public AIMaskedMotion { public: typedef enum e_hand_pose @@ -68,7 +68,7 @@ public: } eHandPose; // Constructor - LLHandMotion(const LLUUID &id); + LLHandMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLHandMotion(); @@ -80,7 +80,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLHandMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLHandMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -122,9 +122,6 @@ public: // must return FALSE when the motion is completed. virtual BOOL onUpdate(F32 time, U8* joint_mask); - // called when a motion is deactivated - virtual void onDeactivate(); - virtual BOOL canDeprecate() { return FALSE; } static std::string getHandPoseName(eHandPose pose); diff --git a/indra/llcharacter/llheadrotmotion.cpp b/indra/llcharacter/llheadrotmotion.cpp index 0ee378f3b..79912f9d5 100644 --- a/indra/llcharacter/llheadrotmotion.cpp +++ b/indra/llcharacter/llheadrotmotion.cpp @@ -76,8 +76,8 @@ const F32 EYE_BLINK_TIME_DELTA = 0.005f; // time between one eye starting a blin // LLHeadRotMotion() // Class Constructor //----------------------------------------------------------------------------- -LLHeadRotMotion::LLHeadRotMotion(const LLUUID &id) : - LLMotion(id), +LLHeadRotMotion::LLHeadRotMotion(LLUUID const& id, LLMotionController* controller) : + AIMaskedMotion(id, controller, ANIM_AGENT_HEAD_ROT), mCharacter(NULL), mTorsoJoint(NULL), mHeadJoint(NULL) @@ -104,7 +104,10 @@ LLHeadRotMotion::~LLHeadRotMotion() LLMotion::LLMotionInitStatus LLHeadRotMotion::onInitialize(LLCharacter *character) { if (!character) + { + llwarns << "character is NULL." << llendl; return STATUS_FAILURE; + } mCharacter = character; mPelvisJoint = character->getJoint("mPelvis"); @@ -169,16 +172,6 @@ LLMotion::LLMotionInitStatus LLHeadRotMotion::onInitialize(LLCharacter *characte return STATUS_SUCCESS; } - -//----------------------------------------------------------------------------- -// LLHeadRotMotion::onActivate() -//----------------------------------------------------------------------------- -BOOL LLHeadRotMotion::onActivate() -{ - return TRUE; -} - - //----------------------------------------------------------------------------- // LLHeadRotMotion::onUpdate() //----------------------------------------------------------------------------- @@ -263,19 +256,11 @@ BOOL LLHeadRotMotion::onUpdate(F32 time, U8* joint_mask) } -//----------------------------------------------------------------------------- -// LLHeadRotMotion::onDeactivate() -//----------------------------------------------------------------------------- -void LLHeadRotMotion::onDeactivate() -{ -} - - //----------------------------------------------------------------------------- // LLEyeMotion() // Class Constructor //----------------------------------------------------------------------------- -LLEyeMotion::LLEyeMotion(const LLUUID &id) : LLMotion(id) +LLEyeMotion::LLEyeMotion(LLUUID const& id, LLMotionController* controller) : AIMaskedMotion(id, controller, ANIM_AGENT_EYE) { mCharacter = NULL; mEyeJitterTime = 0.f; @@ -343,16 +328,6 @@ LLMotion::LLMotionInitStatus LLEyeMotion::onInitialize(LLCharacter *character) return STATUS_SUCCESS; } - -//----------------------------------------------------------------------------- -// LLEyeMotion::onActivate() -//----------------------------------------------------------------------------- -BOOL LLEyeMotion::onActivate() -{ - return TRUE; -} - - //----------------------------------------------------------------------------- // LLEyeMotion::onUpdate() //----------------------------------------------------------------------------- @@ -533,6 +508,8 @@ void LLEyeMotion::onDeactivate() { joint->setRotation(LLQuaternion::DEFAULT); } + + AIMaskedMotion::onDeactivate(); } // End diff --git a/indra/llcharacter/llheadrotmotion.h b/indra/llcharacter/llheadrotmotion.h index 97e61eac1..5fa4610bf 100644 --- a/indra/llcharacter/llheadrotmotion.h +++ b/indra/llcharacter/llheadrotmotion.h @@ -46,11 +46,11 @@ // class LLHeadRotMotion //----------------------------------------------------------------------------- class LLHeadRotMotion : - public LLMotion + public AIMaskedMotion { public: // Constructor - LLHeadRotMotion(const LLUUID &id); + LLHeadRotMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLHeadRotMotion(); @@ -62,7 +62,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLHeadRotMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLHeadRotMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -94,19 +94,11 @@ public: // must return true to indicate success and be available for activation virtual LLMotionInitStatus onInitialize(LLCharacter *character); - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate(); - // called per time step // must return TRUE while it is active, and // must return FALSE when the motion is completed. virtual BOOL onUpdate(F32 time, U8* joint_mask); - // called when a motion is deactivated - virtual void onDeactivate(); - public: //------------------------------------------------------------------------- // joint states to be animated @@ -129,11 +121,11 @@ public: // class LLEyeMotion //----------------------------------------------------------------------------- class LLEyeMotion : - public LLMotion + public AIMaskedMotion { public: // Constructor - LLEyeMotion(const LLUUID &id); + LLEyeMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLEyeMotion(); @@ -145,7 +137,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create( const LLUUID &id) { return new LLEyeMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLEyeMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -177,11 +169,6 @@ public: // must return true to indicate success and be available for activation virtual LLMotionInitStatus onInitialize(LLCharacter *character); - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate(); - // called per time step // must return TRUE while it is active, and // must return FALSE when the motion is completed. diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h index fe14c1e44..cb55e6ca7 100644 --- a/indra/llcharacter/lljoint.h +++ b/indra/llcharacter/lljoint.h @@ -41,7 +41,7 @@ #include "lldarray.h" const S32 LL_CHARACTER_MAX_JOINTS_PER_MESH = 15; -const U32 LL_CHARACTER_MAX_JOINTS = 32; // must be divisible by 4! +const U32 LL_CHARACTER_MAX_JOINTS = 32; // must be divisible by 16! const U32 LL_HAND_JOINT_NUM = 31; const U32 LL_FACE_JOINT_NUM = 30; const S32 LL_CHARACTER_MAX_PRIORITY = 7; diff --git a/indra/llcharacter/llkeyframefallmotion.cpp b/indra/llcharacter/llkeyframefallmotion.cpp index 15ad1b9e9..336d79e65 100644 --- a/indra/llcharacter/llkeyframefallmotion.cpp +++ b/indra/llcharacter/llkeyframefallmotion.cpp @@ -49,7 +49,7 @@ // LLKeyframeFallMotion() // Class Constructor //----------------------------------------------------------------------------- -LLKeyframeFallMotion::LLKeyframeFallMotion(const LLUUID &id) : LLKeyframeMotion(id) +LLKeyframeFallMotion::LLKeyframeFallMotion(LLUUID const& id, LLMotionController* controller) : LLKeyframeMotion(id, controller) { mVelocityZ = 0.f; mCharacter = NULL; diff --git a/indra/llcharacter/llkeyframefallmotion.h b/indra/llcharacter/llkeyframefallmotion.h index 495be977f..0d2553ce3 100644 --- a/indra/llcharacter/llkeyframefallmotion.h +++ b/indra/llcharacter/llkeyframefallmotion.h @@ -47,7 +47,7 @@ class LLKeyframeFallMotion : { public: // Constructor - LLKeyframeFallMotion(const LLUUID &id); + LLKeyframeFallMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLKeyframeFallMotion(); @@ -59,7 +59,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLKeyframeFallMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLKeyframeFallMotion(id, controller); } public: //------------------------------------------------------------------------- diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 98906d3d4..711ac21e5 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -84,38 +84,55 @@ LLKeyframeMotion::JointMotionList::~JointMotionList() for_each(mJointMotionArray.begin(), mJointMotionArray.end(), DeletePointer()); } -U32 LLKeyframeMotion::JointMotionList::dumpDiagInfo() +//Singu: add parameter 'silent'. +U32 LLKeyframeMotion::JointMotionList::dumpDiagInfo(bool silent) const { S32 total_size = sizeof(JointMotionList); for (U32 i = 0; i < getNumJointMotions(); i++) { - LLKeyframeMotion::JointMotion* joint_motion_p = mJointMotionArray[i]; + LLKeyframeMotion::JointMotion const* joint_motion_p = mJointMotionArray[i]; - llinfos << "\tJoint " << joint_motion_p->mJointName << llendl; + if (!silent) + { + llinfos << "\tJoint " << joint_motion_p->mJointName << llendl; + } if (joint_motion_p->mUsage & LLJointState::SCALE) { - llinfos << "\t" << joint_motion_p->mScaleCurve.mNumKeys << " scale keys at " - << joint_motion_p->mScaleCurve.mNumKeys * sizeof(ScaleKey) << " bytes" << llendl; - + if (!silent) + { + llinfos << "\t" << joint_motion_p->mScaleCurve.mNumKeys << " scale keys at " + << joint_motion_p->mScaleCurve.mNumKeys * sizeof(ScaleKey) << " bytes" << llendl; + } total_size += joint_motion_p->mScaleCurve.mNumKeys * sizeof(ScaleKey); } if (joint_motion_p->mUsage & LLJointState::ROT) { - llinfos << "\t" << joint_motion_p->mRotationCurve.mNumKeys << " rotation keys at " - << joint_motion_p->mRotationCurve.mNumKeys * sizeof(RotationKey) << " bytes" << llendl; - + if (!silent) + { + llinfos << "\t" << joint_motion_p->mRotationCurve.mNumKeys << " rotation keys at " + << joint_motion_p->mRotationCurve.mNumKeys * sizeof(RotationKey) << " bytes" << llendl; + } total_size += joint_motion_p->mRotationCurve.mNumKeys * sizeof(RotationKey); } if (joint_motion_p->mUsage & LLJointState::POS) { - llinfos << "\t" << joint_motion_p->mPositionCurve.mNumKeys << " position keys at " - << joint_motion_p->mPositionCurve.mNumKeys * sizeof(PositionKey) << " bytes" << llendl; - + if (!silent) + { + llinfos << "\t" << joint_motion_p->mPositionCurve.mNumKeys << " position keys at " + << joint_motion_p->mPositionCurve.mNumKeys * sizeof(PositionKey) << " bytes" << llendl; + } total_size += joint_motion_p->mPositionCurve.mNumKeys * sizeof(PositionKey); } } - llinfos << "Size: " << total_size << " bytes" << llendl; + //Singu: Also add memory used by the constraints. + S32 constraints_size = mConstraints.size() * sizeof(constraint_list_t::value_type); + total_size += constraints_size; + if (!silent) + { + llinfos << "\t" << mConstraints.size() << " constraints at " << constraints_size << " bytes" << llendl; + llinfos << "Size: " << total_size << " bytes" << llendl; + } return total_size; } @@ -427,9 +444,8 @@ void LLKeyframeMotion::JointMotion::update(LLJointState* joint_state, F32 time, // LLKeyframeMotion() // Class Constructor //----------------------------------------------------------------------------- -LLKeyframeMotion::LLKeyframeMotion(const LLUUID &id) - : LLMotion(id), - mJointMotionList(NULL), +LLKeyframeMotion::LLKeyframeMotion(const LLUUID &id, LLMotionController* controller) + : LLMotion(id, controller), mPelvisp(NULL), mLastSkeletonSerialNum(0), mLastUpdateTime(0.f), @@ -452,9 +468,9 @@ LLKeyframeMotion::~LLKeyframeMotion() //----------------------------------------------------------------------------- // create() //----------------------------------------------------------------------------- -LLMotion *LLKeyframeMotion::create(const LLUUID &id) +LLMotion* LLKeyframeMotion::create(LLUUID const& id, LLMotionController* controller) { - return new LLKeyframeMotion(id); + return new LLKeyframeMotion(id, controller); } //----------------------------------------------------------------------------- @@ -517,6 +533,7 @@ LLMotion::LLMotionInitStatus LLKeyframeMotion::onInitialize(LLCharacter *charact case ASSET_FETCHED: return STATUS_HOLD; case ASSET_FETCH_FAILED: + llwarns << "Trying to initialize a motion that failed to be fetched." << llendl; return STATUS_FAILURE; case ASSET_LOADED: return STATUS_SUCCESS; @@ -526,7 +543,7 @@ LLMotion::LLMotionInitStatus LLKeyframeMotion::onInitialize(LLCharacter *charact break; } - LLKeyframeMotion::JointMotionList* joint_motion_list = LLKeyframeDataCache::getKeyframeData(getID()); + LLKeyframeMotion::JointMotionListPtr joint_motion_list = LLKeyframeDataCache::getKeyframeData(getID()); if(joint_motion_list) { @@ -801,7 +818,44 @@ void LLKeyframeMotion::onDeactivate() //----------------------------------------------------------------------------- // setStopTime() //----------------------------------------------------------------------------- -// time is in seconds since character creation +// +// Consider a looping animation of 20 frames, where the loop in point is at 3 frames +// and the loop out point at 16 frames: +// +// The first 3 frames of the animation would be the "loop in" animation. +// The last 4 frames of the animation would be the "loop out" animation. +// Frames 4 through 15 would be the looping animation frames. +// +// If the animation would not be looping, all frames would just be played once sequentially: +// +// mActivationTimestamp -. +// v +// 0 3 15 16 20 +// | | \| | +// --------------------- +// <--> <-- mLoopInPoint (relative to mActivationTimestamp) +// <--------------> <-- mLoopOutPoint (relative to mActivationTimestamp) +// <----mDuration------> +// +// When looping the animation would repeat frames 3 to 16 (loop) a few times, for example: +// +// 0 3 15 3 15 3 15 3 15 16 20 +// | | loop 1 \| loop 2 \| loop 3 \| loop 4 \| | +// ------------------------------------------------------------ +//LOOP^ ^ LOOP +// IN | <----->| OUT +// start_loop_time loop_fraction_time-' time +// +// The time at which the animation is started corresponds to frame 0 and is stored +// in mActivationTimestamp (in seconds since character creation). +// +// If setStopTime() is called with a time somewhere inside loop 4, +// then 'loop_fraction_time' is the time from the beginning of +// loop 4 till 'time'. Thus 'time - loop_fraction_time' is the first +// frame of loop 4, and '(time - loop_fraction_time) + +// (mJointMotionList->mDuration - mJointMotionList->mLoopInPoint)' +// would correspond to frame 20. +// void LLKeyframeMotion::setStopTime(F32 time) { LLMotion::setStopTime(time); @@ -819,6 +873,8 @@ void LLKeyframeMotion::setStopTime(F32 time) loop_fraction_time = fmod(time - start_loop_time, mJointMotionList->mLoopOutPoint - mJointMotionList->mLoopInPoint); } + // This sets mStopTimestamp to the time that corresponds to the end of the animation (ie, frame 20 in the above example) + // minus the ease out duration, so that the animation eases out during the loop out and finishes exactly at the end. mStopTimestamp = llmax(time, (time - loop_fraction_time) + (mJointMotionList->mDuration - mJointMotionList->mLoopInPoint) - getEaseOutDuration()); } @@ -1227,13 +1283,42 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8 } } +// Helper class. +template +struct AIAutoDestruct +{ + T* mPtr; + AIAutoDestruct() : mPtr(NULL) { } + ~AIAutoDestruct() { delete mPtr; } + void add(T* ptr) { mPtr = ptr; } +}; + //----------------------------------------------------------------------------- // deserialize() //----------------------------------------------------------------------------- BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) { BOOL old_version = FALSE; - mJointMotionList = new LLKeyframeMotion::JointMotionList; + + // + + // First add a new LLKeyframeMotion::JointMotionList to the cache, then assign a pointer + // to that to mJointMotionList. In LLs code the cache is never deleted again. Now it is + // is deleted when the last mJointMotionList pointer is destructed. + // + // It is possible that we get here for an already added animation, because animations can + // be requested multiple times (we get here from LLKeyframeMotion::onLoadComplete) when + // the animation was still downloading from a previous request for another LLMotionController + // object (avatar). In that case we just overwrite the old data while decoding it again. + mJointMotionList = LLKeyframeDataCache::getKeyframeData(getID()); + bool singu_new_joint_motion_list = !mJointMotionList; + if (singu_new_joint_motion_list) + { + // Create a new JointMotionList. + mJointMotionList = LLKeyframeDataCache::createKeyframeData(getID()); + } + + // //------------------------------------------------------------------------- // get base priority @@ -1396,8 +1481,10 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - mJointMotionList->mJointMotionArray.clear(); - mJointMotionList->mJointMotionArray.reserve(num_motions); + if (singu_new_joint_motion_list) + { + mJointMotionList->mJointMotionArray.reserve(num_motions); + } mJointStates.clear(); mJointStates.reserve(num_motions); @@ -1407,8 +1494,19 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) for(U32 i=0; i watcher; + JointMotion* joint_motion = new JointMotion; - mJointMotionList->mJointMotionArray.push_back(joint_motion); + if (singu_new_joint_motion_list) + { + // Pass ownership to mJointMotionList. + mJointMotionList->mJointMotionArray.push_back(joint_motion); + } + else + { + // Just delete this at the end. + watcher.add(joint_motion); + } std::string joint_name; if (!dp.unpackString(joint_name, "joint_name")) @@ -1836,7 +1934,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - mJointMotionList->mConstraints.push_front(constraintp); + AIAutoDestruct watcher; + if (singu_new_joint_motion_list) + { + mJointMotionList->mConstraints.push_front(constraintp); + } + else + { + watcher.add(constraintp); + } constraintp->mJointStateIndices = new S32[constraintp->mChainLength + 1]; // note: mChainLength is size-limited - comes from a byte @@ -1876,15 +1982,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) if (constraintp->mJointStateIndices[i] < 0 ) { llwarns << "No joint index for constraint " << i << llendl; - delete constraintp; return FALSE; } } } } - // *FIX: support cleanup of old keyframe data - LLKeyframeDataCache::addKeyframeData(getID(), mJointMotionList); mAssetStatus = ASSET_LOADED; setupPose(); @@ -2226,16 +2329,24 @@ void LLKeyframeMotion::onLoadComplete(LLVFS *vfs, //-------------------------------------------------------------------- // LLKeyframeDataCache::dumpDiagInfo() //-------------------------------------------------------------------- -void LLKeyframeDataCache::dumpDiagInfo() +// +// quiet = 0 : print everything in detail. +// 1 : print the UUIDs of all animations in the cache and the total memory usage. +// 2 : only print the total memory usage. +// +void LLKeyframeDataCache::dumpDiagInfo(int quiet) { // keep track of totals U32 total_size = 0; char buf[1024]; /* Flawfinder: ignore */ - llinfos << "-----------------------------------------------------" << llendl; - llinfos << " Global Motion Table (DEBUG only)" << llendl; - llinfos << "-----------------------------------------------------" << llendl; + if (quiet < 2) + { + llinfos << "-----------------------------------------------------" << llendl; + llinfos << " Global Motion Table" << llendl; + llinfos << "-----------------------------------------------------" << llendl; + } // print each loaded mesh, and it's memory usage for (keyframe_data_map_t::iterator map_it = sKeyframeDataMap.begin(); @@ -2243,30 +2354,46 @@ void LLKeyframeDataCache::dumpDiagInfo() { U32 joint_motion_kb; - LLKeyframeMotion::JointMotionList *motion_list_p = map_it->second; + LLKeyframeMotion::JointMotionList const* motion_list_p = map_it->get(); - llinfos << "Motion: " << map_it->first << llendl; + if (quiet < 2) + { + llinfos << "Motion: " << map_it->key() << llendl; + } - joint_motion_kb = motion_list_p->dumpDiagInfo(); - - total_size += joint_motion_kb; + if (motion_list_p) + { + joint_motion_kb = motion_list_p->dumpDiagInfo(quiet); + total_size += joint_motion_kb; + } } - llinfos << "-----------------------------------------------------" << llendl; + if (quiet < 2) + { + llinfos << "-----------------------------------------------------" << llendl; + } llinfos << "Motions\tTotal Size" << llendl; snprintf(buf, sizeof(buf), "%d\t\t%d bytes", (S32)sKeyframeDataMap.size(), total_size ); /* Flawfinder: ignore */ llinfos << buf << llendl; - llinfos << "-----------------------------------------------------" << llendl; + if (quiet < 2) + { + llinfos << "-----------------------------------------------------" << llendl; + } } //-------------------------------------------------------------------- -// LLKeyframeDataCache::addKeyframeData() +// LLKeyframeDataCache::createKeyframeData() //-------------------------------------------------------------------- -void LLKeyframeDataCache::addKeyframeData(const LLUUID& id, LLKeyframeMotion::JointMotionList* joint_motion_listp) +// This function replaces LLKeyframeDataCache::addKeyframeData and was rewritten to fix a memory leak (aka, the usage of AICachedPointer). +LLKeyframeMotion::JointMotionListPtr LLKeyframeDataCache::createKeyframeData(LLUUID const& id) { - sKeyframeDataMap[id] = joint_motion_listp; + std::pair result = + sKeyframeDataMap.insert(AICachedPointer(id, new LLKeyframeMotion::JointMotionList, &sKeyframeDataMap)); + llassert(result.second); // id may not already exist in the cache. + return &*result.first; // Construct and return a JointMotionListPt from a pointer to the actually inserted AICachedPointer. } +// //-------------------------------------------------------------------- // LLKeyframeDataCache::removeKeyframeData() @@ -2276,7 +2403,6 @@ void LLKeyframeDataCache::removeKeyframeData(const LLUUID& id) keyframe_data_map_t::iterator found_data = sKeyframeDataMap.find(id); if (found_data != sKeyframeDataMap.end()) { - delete found_data->second; sKeyframeDataMap.erase(found_data); } } @@ -2284,14 +2410,14 @@ void LLKeyframeDataCache::removeKeyframeData(const LLUUID& id) //-------------------------------------------------------------------- // LLKeyframeDataCache::getKeyframeData() //-------------------------------------------------------------------- -LLKeyframeMotion::JointMotionList* LLKeyframeDataCache::getKeyframeData(const LLUUID& id) +LLKeyframeMotion::JointMotionListPtr LLKeyframeDataCache::getKeyframeData(const LLUUID& id) { keyframe_data_map_t::iterator found_data = sKeyframeDataMap.find(id); if (found_data == sKeyframeDataMap.end()) { return NULL; } - return found_data->second; + return &*found_data; // Construct and return a JointMotionListPt from a pointer to the found AICachedPointer. } //-------------------------------------------------------------------- @@ -2307,7 +2433,6 @@ LLKeyframeDataCache::~LLKeyframeDataCache() //----------------------------------------------------------------------------- void LLKeyframeDataCache::clear() { - for_each(sKeyframeDataMap.begin(), sKeyframeDataMap.end(), DeletePairedPointer()); sKeyframeDataMap.clear(); } diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h index 50d9d0504..4c54d5500 100644 --- a/indra/llcharacter/llkeyframemotion.h +++ b/indra/llcharacter/llkeyframemotion.h @@ -5,6 +5,7 @@ * $LicenseInfo:firstyear=2001&license=viewergpl$ * * Copyright (c) 2001-2009, Linden Research, Inc. + * AICachedPointer and AICachedPointPtr copyright (c) 2013, Aleric Inglewood. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab @@ -48,10 +49,12 @@ #include "v3dmath.h" #include "v3math.h" #include "llbvhconsts.h" +#include class LLKeyframeDataCache; class LLVFS; class LLDataPacker; +class LLMotionController; #define MIN_REQUIRED_PIXEL_AREA_KEYFRAME (40.f) #define MAX_CHAIN_LENGTH (4) @@ -59,6 +62,112 @@ class LLDataPacker; const S32 KEYFRAME_MOTION_VERSION = 1; const S32 KEYFRAME_MOTION_SUBVERSION = 0; +//----------------------------------------------------------------------------- +// + +template +class AICachedPointer; + +template +void intrusive_ptr_add_ref(AICachedPointer const* p); + +template +void intrusive_ptr_release(AICachedPointer const* p); + +template +class AICachedPointer +{ + public: + typedef std::set > container_type; + + private: + KEY mKey; // The unique key. + LLPointer mData; // The actual data pointer. + container_type* mCache; // Pointer to the underlaying cache. + mutable int mRefCount; // Number of AICachedPointerPtr's pointing to this object. + + public: + // Construct a NULL pointer. This is needed when adding a new entry to a std::set, it is always first default constructed. + AICachedPointer(void) : mCache(NULL) { } + + // Copy constructor. This is needed to replace the std::set inserted instance with its actual value. + AICachedPointer(AICachedPointer const& cptr) : mKey(cptr.mKey), mData(cptr.mData), mCache(cptr.mCache), mRefCount(0) { } + + // Construct a AICachedPointer that points to 'ptr' with key 'key'. + AICachedPointer(KEY const& key, T* ptr, container_type* cache) : mKey(key), mData(ptr), mCache(cache), mRefCount(-1) { } + + // Construct a temporary NULL pointer that can be used in a search for a key. + AICachedPointer(KEY const& key) : mKey(key), mCache(NULL) { } + + // Accessors for key and data. + KEY const& key(void) const { return mKey; } + T const* get(void) const { return mData.get(); } + T* get(void) { return mData.get(); } + + // Order only by key. + friend bool operator<(AICachedPointer const& cp1, AICachedPointer const& cp2) { return cp1.mKey < cp2.mKey; } + + private: + friend void intrusive_ptr_add_ref<>(AICachedPointer const* p); + friend void intrusive_ptr_release<>(AICachedPointer const* p); + + private: + AICachedPointer& operator=(AICachedPointer const&); +}; + +template +void intrusive_ptr_add_ref(AICachedPointer const* p) +{ + llassert(p->mCache); + if (p->mCache) + { + p->mRefCount++; + } +} + +template +void intrusive_ptr_release(AICachedPointer const* p) +{ + llassert(p->mCache); + if (p->mCache) + { + if (--p->mRefCount == 0) + { + p->mCache->erase(p->mKey); + } + } +} + +template +class AICachedPointerPtr +{ + private: + boost::intrusive_ptr const> mPtr; + static int sCnt; + + public: + AICachedPointerPtr(void) { ++sCnt; } + AICachedPointerPtr(AICachedPointerPtr const& cpp) : mPtr(cpp.mPtr) { ++sCnt; } + AICachedPointerPtr(AICachedPointer const* cp) : mPtr(cp) { ++sCnt; } + ~AICachedPointerPtr() { --sCnt; } + + typedef boost::intrusive_ptr const> const AICachedPointerPtr::* const bool_type; + operator bool_type() const { return mPtr ? &AICachedPointerPtr::mPtr : NULL; } + + T const* operator->() const { return mPtr->get(); } + T* operator->() { return const_cast&>(*mPtr).get(); } + T const& operator*() const { return *mPtr->get(); } + T& operator*() { return *const_cast&>(*mPtr).get(); } + + AICachedPointerPtr& operator=(AICachedPointerPtr const& cpp) { mPtr = cpp.mPtr; return *this; } +}; + +template +int AICachedPointerPtr::sCnt; + +// +//----------------------------------------------------------------------------- + //----------------------------------------------------------------------------- // class LLKeyframeMotion //----------------------------------------------------------------------------- @@ -68,7 +177,7 @@ class LLKeyframeMotion : friend class LLKeyframeDataCache; public: // Constructor - LLKeyframeMotion(const LLUUID &id); + LLKeyframeMotion(const LLUUID &id, LLMotionController* controller); // Destructor virtual ~LLKeyframeMotion(); @@ -85,7 +194,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID& id); + static LLMotion* create(LLUUID const& id, LLMotionController* controller); public: //------------------------------------------------------------------------- @@ -158,7 +267,7 @@ public: U32 getFileSize(); BOOL serialize(LLDataPacker& dp) const; BOOL deserialize(LLDataPacker& dp); - BOOL isLoaded() { return mJointMotionList != NULL; } + BOOL isLoaded() { return !!mJointMotionList; } // setters for modifying a keyframe animation @@ -393,7 +502,7 @@ public: //------------------------------------------------------------------------- // JointMotionList //------------------------------------------------------------------------- - class JointMotionList + class JointMotionList : public LLRefCount { public: std::vector mJointMotionArray; @@ -416,19 +525,22 @@ public: public: JointMotionList(); ~JointMotionList(); - U32 dumpDiagInfo(); + U32 dumpDiagInfo(bool silent = false) const; JointMotion* getJointMotion(U32 index) const { llassert(index < mJointMotionArray.size()); return mJointMotionArray[index]; } U32 getNumJointMotions() const { return mJointMotionArray.size(); } }; + // Singu: Type of a pointer to the cached pointer (in LLKeyframeDataCache::sKeyframeDataMap) to a JointMotionList object. + typedef AICachedPointerPtr JointMotionListPtr; + protected: static LLVFS* sVFS; //------------------------------------------------------------------------- // Member Data //------------------------------------------------------------------------- - JointMotionList* mJointMotionList; + JointMotionListPtr mJointMotionList; // singu: automatically clean up cache entry when destructed. std::vector > mJointStates; LLJoint* mPelvisp; LLCharacter* mCharacter; @@ -442,21 +554,24 @@ protected: class LLKeyframeDataCache { -public: - // *FIX: implement this as an actual singleton member of LLKeyframeMotion +private: + friend class LLKeyframeMotion; LLKeyframeDataCache(){}; ~LLKeyframeDataCache(); - typedef std::map keyframe_data_map_t; +public: + typedef AICachedPointer::container_type keyframe_data_map_t; // singu: add automatic cache cleanup. static keyframe_data_map_t sKeyframeDataMap; - static void addKeyframeData(const LLUUID& id, LLKeyframeMotion::JointMotionList*); - static LLKeyframeMotion::JointMotionList* getKeyframeData(const LLUUID& id); + // + static LLKeyframeMotion::JointMotionListPtr createKeyframeData(LLUUID const& id); // id may not exist. + static LLKeyframeMotion::JointMotionListPtr getKeyframeData(LLUUID const& id); // id may or may not exists. Returns a NULL pointer when it doesn't exist. + // static void removeKeyframeData(const LLUUID& id); //print out diagnostic info - static void dumpDiagInfo(); + static void dumpDiagInfo(int quiet = 0); // singu: added param 'quiet'. static void clear(); }; diff --git a/indra/llcharacter/llkeyframemotionparam.cpp b/indra/llcharacter/llkeyframemotionparam.cpp deleted file mode 100644 index 4df1ef46b..000000000 --- a/indra/llcharacter/llkeyframemotionparam.cpp +++ /dev/null @@ -1,456 +0,0 @@ -/** - * @file llkeyframemotionparam.cpp - * @brief Implementation of LLKeyframeMotion class. - * - * $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$ - */ - -//----------------------------------------------------------------------------- -// Header Files -//----------------------------------------------------------------------------- -#include "linden_common.h" - -#include "llkeyframemotionparam.h" -#include "llcharacter.h" -#include "llmath.h" -#include "m3math.h" -#include "lldir.h" -#include "llanimationstates.h" - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam class -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam() -// Class Constructor -//----------------------------------------------------------------------------- -LLKeyframeMotionParam::LLKeyframeMotionParam( const LLUUID &id) : LLMotion(id) -{ - mDefaultKeyframeMotion = NULL; - mCharacter = NULL; - - mEaseInDuration = 0.f; - mEaseOutDuration = 0.f; - mDuration = 0.f; - mPriority = LLJoint::LOW_PRIORITY; -} - - -//----------------------------------------------------------------------------- -// ~LLKeyframeMotionParam() -// Class Destructor -//----------------------------------------------------------------------------- -LLKeyframeMotionParam::~LLKeyframeMotionParam() -{ - for (motion_map_t::iterator iter = mParameterizedMotions.begin(); - iter != mParameterizedMotions.end(); ++iter) - { - motion_list_t& motionList = iter->second; - for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2) - { - const ParameterizedMotion& paramMotion = *iter2; - delete paramMotion.mMotion; - } - motionList.clear(); - } - mParameterizedMotions.clear(); -} - -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam::onInitialize(LLCharacter *character) -//----------------------------------------------------------------------------- -LLMotion::LLMotionInitStatus LLKeyframeMotionParam::onInitialize(LLCharacter *character) -{ - mCharacter = character; - - if (!loadMotions()) - { - return STATUS_FAILURE; - } - - for (motion_map_t::iterator iter = mParameterizedMotions.begin(); - iter != mParameterizedMotions.end(); ++iter) - { - motion_list_t& motionList = iter->second; - for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2) - { - const ParameterizedMotion& paramMotion = *iter2; - LLMotion* motion = paramMotion.mMotion; - motion->onInitialize(character); - - if (motion->getDuration() > mEaseInDuration) - { - mEaseInDuration = motion->getEaseInDuration(); - } - - if (motion->getEaseOutDuration() > mEaseOutDuration) - { - mEaseOutDuration = motion->getEaseOutDuration(); - } - - if (motion->getDuration() > mDuration) - { - mDuration = motion->getDuration(); - } - - if (motion->getPriority() > mPriority) - { - mPriority = motion->getPriority(); - } - - LLPose *pose = motion->getPose(); - - mPoseBlender.addMotion(motion); - for (LLJointState *jsp = pose->getFirstJointState(); jsp; jsp = pose->getNextJointState()) - { - LLPose *blendedPose = mPoseBlender.getBlendedPose(); - blendedPose->addJointState(jsp); - } - } - } - - return STATUS_SUCCESS; -} - -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam::onActivate() -//----------------------------------------------------------------------------- -BOOL LLKeyframeMotionParam::onActivate() -{ - for (motion_map_t::iterator iter = mParameterizedMotions.begin(); - iter != mParameterizedMotions.end(); ++iter) - { - motion_list_t& motionList = iter->second; - for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2) - { - const ParameterizedMotion& paramMotion = *iter2; - paramMotion.mMotion->activate(mActivationTimestamp); - } - } - return TRUE; -} - - -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam::onUpdate() -//----------------------------------------------------------------------------- -BOOL LLKeyframeMotionParam::onUpdate(F32 time, U8* joint_mask) -{ - F32 weightFactor = 1.f / (F32)mParameterizedMotions.size(); - - // zero out all pose weights - for (motion_map_t::iterator iter = mParameterizedMotions.begin(); - iter != mParameterizedMotions.end(); ++iter) - { - motion_list_t& motionList = iter->second; - for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2) - { - const ParameterizedMotion& paramMotion = *iter2; -// llinfos << "Weight for pose " << paramMotion.mMotion->getName() << " is " << paramMotion.mMotion->getPose()->getWeight() << llendl; - paramMotion.mMotion->getPose()->setWeight(0.f); - } - } - - - for (motion_map_t::iterator iter = mParameterizedMotions.begin(); - iter != mParameterizedMotions.end(); ++iter) - { - const std::string& paramName = iter->first; - F32* paramValue = (F32 *)mCharacter->getAnimationData(paramName); - if (NULL == paramValue) // unexpected, but... - { - llwarns << "paramValue == NULL" << llendl; - continue; - } - - // DANGER! Do not modify mParameterizedMotions while using these pointers! - const ParameterizedMotion* firstMotion = NULL; - const ParameterizedMotion* secondMotion = NULL; - - motion_list_t& motionList = iter->second; - for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2) - { - const ParameterizedMotion& paramMotion = *iter2; - paramMotion.mMotion->onUpdate(time, joint_mask); - - F32 distToParam = paramMotion.mParam - *paramValue; - - if ( distToParam <= 0.f) - { - // keep track of the motion closest to the parameter value - firstMotion = ¶mMotion; - } - else - { - // we've passed the parameter value - // so store the first motion we find as the second one we want to blend... - if (firstMotion && !secondMotion ) - { - secondMotion = ¶mMotion; - } - //...or, if we've seen no other motion so far, make sure we blend to this only - else if (!firstMotion) - { - firstMotion = ¶mMotion; - secondMotion = ¶mMotion; - } - } - } - - LLPose *firstPose; - LLPose *secondPose; - - if (firstMotion) - firstPose = firstMotion->mMotion->getPose(); - else - firstPose = NULL; - - if (secondMotion) - secondPose = secondMotion->mMotion->getPose(); - else - secondPose = NULL; - - // now modify weight of the subanim (only if we are blending between two motions) - if (firstMotion && secondMotion) - { - if (firstMotion == secondMotion) - { - firstPose->setWeight(weightFactor); - } - else if (firstMotion->mParam == secondMotion->mParam) - { - firstPose->setWeight(0.5f * weightFactor); - secondPose->setWeight(0.5f * weightFactor); - } - else - { - F32 first_weight = 1.f - - ((llclamp(*paramValue - firstMotion->mParam, 0.f, (secondMotion->mParam - firstMotion->mParam))) / - (secondMotion->mParam - firstMotion->mParam)); - first_weight = llclamp(first_weight, 0.f, 1.f); - - F32 second_weight = 1.f - first_weight; - - firstPose->setWeight(first_weight * weightFactor); - secondPose->setWeight(second_weight * weightFactor); - -// llinfos << "Parameter " << *paramName << ": " << *paramValue << llendl; -// llinfos << "Weights " << firstPose->getWeight() << " " << secondPose->getWeight() << llendl; - } - } - else if (firstMotion && !secondMotion) - { - firstPose->setWeight(weightFactor); - } - } - - // blend poses - mPoseBlender.blendAndApply(); - - llinfos << "Param Motion weight " << mPoseBlender.getBlendedPose()->getWeight() << llendl; - - return TRUE; -} - -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam::onDeactivate() -//----------------------------------------------------------------------------- -void LLKeyframeMotionParam::onDeactivate() -{ - for (motion_map_t::iterator iter = mParameterizedMotions.begin(); - iter != mParameterizedMotions.end(); ++iter) - { - motion_list_t& motionList = iter->second; - for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2) - { - const ParameterizedMotion& paramMotion = *iter2; - paramMotion.mMotion->onDeactivate(); - } - } -} - -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam::addKeyframeMotion() -//----------------------------------------------------------------------------- -BOOL LLKeyframeMotionParam::addKeyframeMotion(char *name, const LLUUID &id, char *param, F32 value) -{ - LLMotion *newMotion = mCharacter->createMotion( id ); - - if (!newMotion) - { - return FALSE; - } - - newMotion->setName(name); - - // now add motion to this list - mParameterizedMotions[param].insert(ParameterizedMotion(newMotion, value)); - - return TRUE; -} - - -//----------------------------------------------------------------------------- -// LLKeyframeMotionParam::setDefaultKeyframeMotion() -//----------------------------------------------------------------------------- -void LLKeyframeMotionParam::setDefaultKeyframeMotion(char *name) -{ - for (motion_map_t::iterator iter = mParameterizedMotions.begin(); - iter != mParameterizedMotions.end(); ++iter) - { - motion_list_t& motionList = iter->second; - for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2) - { - const ParameterizedMotion& paramMotion = *iter2; - if (paramMotion.mMotion->getName() == name) - { - mDefaultKeyframeMotion = paramMotion.mMotion; - } - } - } -} - -//----------------------------------------------------------------------------- -// loadMotions() -//----------------------------------------------------------------------------- -BOOL LLKeyframeMotionParam::loadMotions() -{ - //------------------------------------------------------------------------- - // Load named file by concatenating the character prefix with the motion name. - // Load data into a buffer to be parsed. - //------------------------------------------------------------------------- - //std::string path = gDirUtilp->getExpandedFilename(LL_PATH_MOTIONS,mCharacter->getAnimationPrefix()) - // + "_" + getName() + ".llp"; - //RN: deprecated unused reference to "motion" directory - std::string path; - - - //------------------------------------------------------------------------- - // open the file - //------------------------------------------------------------------------- - S32 fileSize = 0; - LLAPRFile infile(path, LL_APR_R, &fileSize); - apr_file_t* fp = infile.getFileHandle() ; - if (!fp || fileSize == 0) - { - llinfos << "ERROR: can't open: " << path << llendl; - return FALSE; - } - - // allocate a text buffer - try - { - std::vector text(fileSize+1); - - //------------------------------------------------------------------------- - // load data from file into buffer - //------------------------------------------------------------------------- - bool error = false; - char *p = &text[0]; - while ( 1 ) - { - if (apr_file_eof(fp) == APR_EOF) - { - break; - } - if (apr_file_gets(p, 1024, fp) != APR_SUCCESS) - { - error = true; - break; - } - while ( *(++p) ) - ; - } - - //------------------------------------------------------------------------- - // close the file - //------------------------------------------------------------------------- - infile.close(); - - //------------------------------------------------------------------------- - // check for error - //------------------------------------------------------------------------- - llassert( p <= (&text[0] + fileSize) ); - - if ( error ) - { - llinfos << "ERROR: error while reading from " << path << llendl; - return FALSE; - } - - llinfos << "Loading parametric keyframe data for: " << getName() << llendl; - - //------------------------------------------------------------------------- - // parse the text and build keyframe data structures - //------------------------------------------------------------------------- - p = &text[0]; - S32 num; - char strA[80]; /* Flawfinder: ignore */ - char strB[80]; /* Flawfinder: ignore */ - F32 floatA = 0.0f; - - - //------------------------------------------------------------------------- - // get priority - //------------------------------------------------------------------------- - BOOL isFirstMotion = TRUE; - num = sscanf(p, "%79s %79s %f", strA, strB, &floatA); /* Flawfinder: ignore */ - - while(1) - { - if (num == 0 || num == EOF) break; - if ((num != 3)) - { - llinfos << "WARNING: can't read parametric motion" << llendl; - return FALSE; - } - - addKeyframeMotion(strA, gAnimLibrary.stringToAnimState(std::string(strA)), strB, floatA); - if (isFirstMotion) - { - isFirstMotion = FALSE; - setDefaultKeyframeMotion(strA); - } - - p = strstr(p, "\n"); - if (!p) - { - break; - } - - p++; - num = sscanf(p, "%79s %79s %f", strA, strB, &floatA); /* Flawfinder: ignore */ - } - - return TRUE; - } - catch(std::bad_alloc) - { - llinfos << "ERROR: Unable to allocate keyframe text buffer." << llendl; - return FALSE; - } -} - -// End diff --git a/indra/llcharacter/llkeyframemotionparam.h b/indra/llcharacter/llkeyframemotionparam.h deleted file mode 100644 index f74aea276..000000000 --- a/indra/llcharacter/llkeyframemotionparam.h +++ /dev/null @@ -1,176 +0,0 @@ -/** - * @file llkeyframemotionparam.h - * @brief Implementation of LLKeframeMotionParam class. - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLKEYFRAMEMOTIONPARAM_H -#define LL_LLKEYFRAMEMOTIONPARAM_H - -//----------------------------------------------------------------------------- -// Header files -//----------------------------------------------------------------------------- - -#include - -#include "llmotion.h" -#include "lljointstate.h" -#include "v3math.h" -#include "llquaternion.h" -#include "linked_lists.h" -#include "llkeyframemotion.h" - -//----------------------------------------------------------------------------- -// class LLKeyframeMotionParam -//----------------------------------------------------------------------------- -class LLKeyframeMotionParam : - public LLMotion -{ -public: - // Constructor - LLKeyframeMotionParam(const LLUUID &id); - - // Destructor - virtual ~LLKeyframeMotionParam(); - -public: - //------------------------------------------------------------------------- - // functions to support MotionController and MotionRegistry - //------------------------------------------------------------------------- - - // static constructor - // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLKeyframeMotionParam(id); } - -public: - //------------------------------------------------------------------------- - // animation callbacks to be implemented by subclasses - //------------------------------------------------------------------------- - - // motions must specify whether or not they loop - virtual BOOL getLoop() { - return TRUE; - } - - // motions must report their total duration - virtual F32 getDuration() { - return mDuration; - } - - // motions must report their "ease in" duration - virtual F32 getEaseInDuration() { - return mEaseInDuration; - } - - // motions must report their "ease out" duration. - virtual F32 getEaseOutDuration() { - return mEaseOutDuration; - } - - // motions must report their priority - virtual LLJoint::JointPriority getPriority() { - return mPriority; - } - - virtual LLMotionBlendType getBlendType() { return NORMAL_BLEND; } - - // called to determine when a motion should be activated/deactivated based on avatar pixel coverage - virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_KEYFRAME; } - - // run-time (post constructor) initialization, - // called after parameters have been set - // must return true to indicate success and be available for activation - virtual LLMotionInitStatus onInitialize(LLCharacter *character); - - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate(); - - // called per time step - // must return TRUE while it is active, and - // must return FALSE when the motion is completed. - virtual BOOL onUpdate(F32 time, U8* joint_mask); - - // called when a motion is deactivated - virtual void onDeactivate(); - - virtual LLPose* getPose() { return mPoseBlender.getBlendedPose();} - -protected: - //------------------------------------------------------------------------- - // new functions defined by this subclass - //------------------------------------------------------------------------- - struct ParameterizedMotion - { - ParameterizedMotion(LLMotion* motion, F32 param) : mMotion(motion), mParam(param) {} - LLMotion* mMotion; - F32 mParam; - }; - - // add a motion and associated parameter triplet - BOOL addKeyframeMotion(char *name, const LLUUID &id, char *param, F32 value); - - // set default motion for LOD and retrieving blend constants - void setDefaultKeyframeMotion(char *); - - BOOL loadMotions(); - -protected: - //------------------------------------------------------------------------- - // Member Data - //------------------------------------------------------------------------- - - struct compare_motions - { - bool operator() (const ParameterizedMotion& a, const ParameterizedMotion& b) const - { - if (a.mParam != b.mParam) - return (a.mParam < b.mParam); - else - return a.mMotion < b.mMotion; - } - }; - - typedef std::set < ParameterizedMotion, compare_motions > motion_list_t; - typedef std::map motion_map_t; - motion_map_t mParameterizedMotions; - LLMotion* mDefaultKeyframeMotion; - LLCharacter* mCharacter; - LLPoseBlender mPoseBlender; - - F32 mEaseInDuration; - F32 mEaseOutDuration; - F32 mDuration; - LLJoint::JointPriority mPriority; - - LLUUID mTransactionID; -}; - -#endif // LL_LLKEYFRAMEMOTIONPARAM_H diff --git a/indra/llcharacter/llkeyframestandmotion.cpp b/indra/llcharacter/llkeyframestandmotion.cpp index 1ae0ddeea..bccc714f1 100644 --- a/indra/llcharacter/llkeyframestandmotion.cpp +++ b/indra/llcharacter/llkeyframestandmotion.cpp @@ -50,7 +50,7 @@ const F32 POSITION_THRESHOLD = 0.1f; // LLKeyframeStandMotion() // Class Constructor //----------------------------------------------------------------------------- -LLKeyframeStandMotion::LLKeyframeStandMotion(const LLUUID &id) : LLKeyframeMotion(id) +LLKeyframeStandMotion::LLKeyframeStandMotion(LLUUID const& id, LLMotionController* controller) : LLKeyframeMotion(id, controller) { mFlipFeet = FALSE; mCharacter = NULL; diff --git a/indra/llcharacter/llkeyframestandmotion.h b/indra/llcharacter/llkeyframestandmotion.h index b0500dc8e..346df97f0 100644 --- a/indra/llcharacter/llkeyframestandmotion.h +++ b/indra/llcharacter/llkeyframestandmotion.h @@ -48,7 +48,7 @@ class LLKeyframeStandMotion : { public: // Constructor - LLKeyframeStandMotion(const LLUUID &id); + LLKeyframeStandMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLKeyframeStandMotion(); @@ -60,7 +60,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLKeyframeStandMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLKeyframeStandMotion(id, controller); } public: //------------------------------------------------------------------------- diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index f9c2e4766..21d6fce30 100644 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -55,8 +55,8 @@ const F32 SPEED_ADJUST_TIME_CONSTANT = 0.1f; // time constant for speed adjustm // LLKeyframeWalkMotion() // Class Constructor //----------------------------------------------------------------------------- -LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id) -: LLKeyframeMotion(id), +LLKeyframeWalkMotion::LLKeyframeWalkMotion(LLUUID const& id, LLMotionController* controller) +: LLKeyframeMotion(id, controller), mCharacter(NULL), mCyclePhase(0.0f), mRealTimeLast(0.0f), @@ -138,8 +138,8 @@ BOOL LLKeyframeWalkMotion::onUpdate(F32 time, U8* joint_mask) // LLWalkAdjustMotion() // Class Constructor //----------------------------------------------------------------------------- -LLWalkAdjustMotion::LLWalkAdjustMotion(const LLUUID &id) : - LLMotion(id), +LLWalkAdjustMotion::LLWalkAdjustMotion(LLUUID const& id, LLMotionController* controller) : + AIMaskedMotion(id, controller, ANIM_AGENT_WALK_ADJUST), mLastTime(0.f), mAnimSpeed(0.f), mAdjustedSpeed(0.f), @@ -193,7 +193,7 @@ BOOL LLWalkAdjustMotion::onActivate() F32 rightAnkleOffset = (mRightAnkleJoint->getWorldPosition() - mCharacter->getCharacterPosition()).magVec(); mAnkleOffset = llmax(leftAnkleOffset, rightAnkleOffset); - return TRUE; + return AIMaskedMotion::onActivate(); } //----------------------------------------------------------------------------- @@ -325,13 +325,14 @@ BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask) void LLWalkAdjustMotion::onDeactivate() { mCharacter->removeAnimationData("Walk Speed"); + AIMaskedMotion::onDeactivate(); } //----------------------------------------------------------------------------- // LLFlyAdjustMotion::LLFlyAdjustMotion() //----------------------------------------------------------------------------- -LLFlyAdjustMotion::LLFlyAdjustMotion(const LLUUID &id) - : LLMotion(id), +LLFlyAdjustMotion::LLFlyAdjustMotion(LLUUID const& id, LLMotionController* controller) + : AIMaskedMotion(id, controller, ANIM_AGENT_FLY_ADJUST), mRoll(0.f) { mName = "fly_adjust"; @@ -368,7 +369,7 @@ BOOL LLFlyAdjustMotion::onActivate() mPelvisState->setPosition(LLVector3::zero); mPelvisState->setRotation(LLQuaternion::DEFAULT); mRoll = 0.f; - return TRUE; + return AIMaskedMotion::onActivate(); } //----------------------------------------------------------------------------- diff --git a/indra/llcharacter/llkeyframewalkmotion.h b/indra/llcharacter/llkeyframewalkmotion.h index b507e9423..653c2b539 100644 --- a/indra/llcharacter/llkeyframewalkmotion.h +++ b/indra/llcharacter/llkeyframewalkmotion.h @@ -52,7 +52,7 @@ class LLKeyframeWalkMotion : friend class LLWalkAdjustMotion; public: // Constructor - LLKeyframeWalkMotion(const LLUUID &id); + LLKeyframeWalkMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLKeyframeWalkMotion(); @@ -64,7 +64,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLKeyframeWalkMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLKeyframeWalkMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -86,11 +86,11 @@ public: S32 mDownFoot; }; -class LLWalkAdjustMotion : public LLMotion +class LLWalkAdjustMotion : public AIMaskedMotion { public: // Constructor - LLWalkAdjustMotion(const LLUUID &id); + LLWalkAdjustMotion(LLUUID const& id, LLMotionController* controller); public: //------------------------------------------------------------------------- @@ -99,7 +99,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLWalkAdjustMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLWalkAdjustMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -136,11 +136,11 @@ public: F32 mAnkleOffset; }; -class LLFlyAdjustMotion : public LLMotion +class LLFlyAdjustMotion : public AIMaskedMotion { public: // Constructor - LLFlyAdjustMotion(const LLUUID &id); + LLFlyAdjustMotion(LLUUID const& id, LLMotionController* controller); public: //------------------------------------------------------------------------- @@ -149,7 +149,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLFlyAdjustMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLFlyAdjustMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -157,7 +157,6 @@ public: //------------------------------------------------------------------------- virtual LLMotionInitStatus onInitialize(LLCharacter *character); virtual BOOL onActivate(); - virtual void onDeactivate() {}; virtual BOOL onUpdate(F32 time, U8* joint_mask); virtual LLJoint::JointPriority getPriority(){return LLJoint::HIGHER_PRIORITY;} virtual BOOL getLoop() { return TRUE; } diff --git a/indra/llcharacter/llmotion.cpp b/indra/llcharacter/llmotion.cpp index ce926a38a..526341d20 100644 --- a/indra/llcharacter/llmotion.cpp +++ b/indra/llcharacter/llmotion.cpp @@ -37,6 +37,125 @@ #include "llmotion.h" #include "llcriticaldamp.h" +#include "llmotioncontroller.h" + +// +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// AISyncClientMotion class +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- + +AISyncKey* AISyncClientMotion::createSyncKey(AISyncKey const* from_key) const +{ + // The const cast is needed because getDuration() is non-const while it should have been. + AISyncClientMotion* self = const_cast(this); + // Only synchronize motions with the same duration and loop value. + return new AISyncKeyMotion(from_key, self->getDuration(), self->getLoop()); +} + +void AISyncClientMotion::aisync_loading(void) +{ + // Register the motion for (possible) synchronization: this marks the time at which is should have started. + unregister_client(); // In case it is already registered. Getting here means we are being (re)started now, we need to synchronize with other motions that start now. + register_client(); +} + +void AISyncClientMotion::aisync_loaded(void) +{ + AISyncServer* server = this->server(); + if (!server) + { + // Already expired without being synchronized (no other motion was started at the same time). + return; + } + AISyncKey const& key = server->key(); // The allocation of this is owned by server. + // There is no need to resync if there was not another motion started at the same time and the key already expired. + bool need_resync = !(server->never_synced() && key.expired()); + AISyncKey* new_key = NULL; + if (need_resync) + { + // Create a new key using the old start time. + new_key = createSyncKey(&key); + } + server->remove(this); // This resets mServer and might even delete server. + if (need_resync) + { + // Add the client to another server (based on the new key). This takes ownership of the key allocation. + AISyncServerMap::instance().register_client(this, new_key); + } +} + +F32 LLMotion::getRuntime(void) const +{ + llassert(mActive); + return mController->getAnimTime() - mActivationTimestamp; +} + +F32 LLMotion::getAnimTime(void) const +{ + return mController->getAnimTime(); +} + +F32 LLMotion::syncActivationTime(F32 time) +{ + AISyncServer* server = this->server(); + if (!server) + { + register_client(); + server = this->server(); + } + AISyncServer::client_list_t const& clients = server->getClients(); + if (clients.size() > 1) + { + // Look for the client with the smallest runtime. + AISyncClientMotion* motion_with_smallest_runtime = NULL; + F32 runtime = 1e10; + // Run over all motions in this to be synchronized group. + for (AISyncServer::client_list_t::const_iterator client = clients.begin(); client != clients.end(); ++client) + { + if ((client->mReadyEvents & 2)) // Is this motion active? Motions that aren't loaded yet are not active. + { + // Currently, if event 2 is set then this is an LLMotion. + llassert(dynamic_cast(client->mClientPtr)); + AISyncClientMotion* motion = static_cast(client->mClientPtr); + // Deactivated motions should have been deregistered, certainly not have event 2 set. + llassert(static_cast(motion)->isActive()); + if (motion->getRuntime() < runtime) + { + // This is a bit fuzzy since theoretically the runtime of all active motions in the list should be the same. + // Just use the smallest value to get rid of some randomness. We might even synchronizing with ourselves + // in which case 'time' would be set to a value such that mActivationTimestamp won't change. + // In practise however, this list will contain only two clients: this, being inactive, and our partner. + runtime = motion->getRuntime(); + motion_with_smallest_runtime = motion; + } + } + } + //----------------------------------------------------------------------------------------- + // Here is where the actual synchronization takes place. + // Current we only synchronize looped motions. + if (getLoop()) + { + if (motion_with_smallest_runtime) + { + // Pretend the motion was started in the past at the same time as the other motion(s). + time = getAnimTime() - runtime; + } + } + //----------------------------------------------------------------------------------------- + } + + return time; +} + +void AISyncClientMotion::deregistered(void) +{ +#ifdef SHOW_ASSERT + mReadyEvents = 0; +#endif +} +// //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -48,10 +167,11 @@ // LLMotion() // Class Constructor //----------------------------------------------------------------------------- -LLMotion::LLMotion( const LLUUID &id ) : +LLMotion::LLMotion(LLUUID const& id, LLMotionController* controller) : mStopped(TRUE), mActive(FALSE), mID(id), + mController(controller), mActivationTimestamp(0.f), mStopTimestamp(0.f), mSendStopTimestamp(F32_MAX), @@ -147,6 +267,19 @@ void LLMotion::activate(F32 time) { mActivationTimestamp = time; mStopped = FALSE; + // + if (mController && !mController->syncing_disabled()) // Avoid being registered when syncing is disabled for this motion. + { + if (mActive) + { + // If the motion is already active then we are being restarted. + // Unregister it first (if it is registered) so that the call to ready will cause it to be registered + // and be synchronized with other motions that are started at this moment. + unregister_client(); + } + ready(6, 2 | (mController->isHidden() ? 0 : 4)); // Signal that mActivationTimestamp is set/valid (2), and that this server has a visible motion (4) (or not). + } + // mActive = TRUE; onActivate(); } @@ -159,6 +292,14 @@ void LLMotion::deactivate() mActive = FALSE; mPose.setWeight(0.f); + // + if (server()) // Only when this motion is already registered. + { + ready(6, 0); // Signal that mActivationTimestamp is no longer valid. + unregister_client(); // No longer running, so no longer a part of this sync group. + } + // + if (mDeactivateCallback) { (*mDeactivateCallback)(mDeactivateCallbackUserData); @@ -174,4 +315,19 @@ BOOL LLMotion::canDeprecate() return TRUE; } +//----------------------------------------------------------------------------- +// AIMaskedMotion +//----------------------------------------------------------------------------- + +BOOL AIMaskedMotion::onActivate() +{ + mController->activated(mMaskBit); + return TRUE; +} + +void AIMaskedMotion::onDeactivate() +{ + mController->deactivated(mMaskBit); +} + // End diff --git a/indra/llcharacter/llmotion.h b/indra/llcharacter/llmotion.h index d6628fd99..a246b08c7 100644 --- a/indra/llcharacter/llmotion.h +++ b/indra/llcharacter/llmotion.h @@ -38,16 +38,85 @@ //----------------------------------------------------------------------------- #include +#include "aisyncclient.h" #include "llerror.h" #include "llpose.h" #include "lluuid.h" class LLCharacter; +class LLMotionController; + +//----------------------------------------------------------------------------- +// class AISync* stuff +//----------------------------------------------------------------------------- + +class AISyncKeyMotion : public AISyncKey +{ + private: + F32 mDuration; + bool mLoop; + + public: + AISyncKeyMotion(AISyncKey const* from_key, F32 duration, bool loop) : AISyncKey(from_key), mDuration(duration), mLoop(loop) { } + + // Virtual functions of AISyncKey. + public: + /*virtual*/ synckeytype_t getkeytype(void) const + { + // Return a unique identifier for this class, where the low 8 bits represent the syncgroup. + return synckeytype_motion; + } + + /*virtual*/ bool equals(AISyncKey const& key) const + { + switch (key.getkeytype()) + { + case synckeytype_motion: + { + // The other key is of the same type. + AISyncKeyMotion const& motion_key = static_cast(key); + return mLoop == motion_key.mLoop && is_approx_equal(mDuration, motion_key.mDuration); + } + default: + // The keys must be in the same syncgroup. + break; + } + return false; + } +}; + +class AISyncClientMotion : public AISyncClient +{ + protected: + // Make sure that clients that are destroyed are first unregistered. + // This is needed, for example, when loading fails or when excess motions are being purged. + /*virtual*/ ~AISyncClientMotion() { unregister_client(); } + + // AISyncClient events. + /*virtual*/ AISyncKey* createSyncKey(AISyncKey const* from_key = NULL) const; + /*virtual*/ void event1_ready(void) { } + /*virtual*/ void event1_not_ready(void) { } + /*virtual*/ void deregistered(void); + + protected: + // This is called when the server sent us a message that it wants us to play this animation, but we can't because it isn't fully downloaded yet. + void aisync_loading(void); + // This is called when that motion is successfully loaded and it has to be re-registered because now the duration etc is known. + void aisync_loaded(void); + + public: + // Virtual functions of AISyncClientMotion. + // These are defined by classes derived from LLMotion (which is derived from this class). + virtual BOOL getLoop() = 0; + virtual F32 getDuration() = 0; + virtual F32 getAnimTime(void) const = 0; + virtual F32 getRuntime(void) const = 0; +}; //----------------------------------------------------------------------------- // class LLMotion //----------------------------------------------------------------------------- -class LLMotion +class LLMotion : public AISyncClientMotion { friend class LLMotionController; @@ -66,7 +135,7 @@ public: }; // Constructor - LLMotion(const LLUUID &id); + LLMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLMotion(); @@ -114,7 +183,22 @@ protected: BOOL isActive() { return mActive; } public: void activate(F32 time); - + + // + // Returns the time that this motion has been running. + virtual F32 getRuntime(void) const; + + // Return the current time (in seconds since creation of the controller). + virtual F32 getAnimTime(void) const; + + // This is called when a motion is to be activated, but might need synchronization. + // It adjusts the start time to match that of other motions in the same synchronization group that were already started. + F32 syncActivationTime(F32 time); + + // Accessor. + LLMotionController* getController(void) const { return mController; } + // + public: //------------------------------------------------------------------------- // animation callbacks to be implemented by subclasses @@ -181,6 +265,9 @@ protected: //------------------------------------------------------------------------- std::string mName; // instance name assigned by motion controller LLUUID mID; + // + LLMotionController* mController; + // F32 mActivationTimestamp; // time when motion was activated F32 mStopTimestamp; // time when motion was told to stop @@ -199,9 +286,9 @@ protected: class LLTestMotion : public LLMotion { public: - LLTestMotion(const LLUUID &id) : LLMotion(id){} + LLTestMotion(LLUUID const& id, LLMotionController* controller) : LLMotion(id, controller){} ~LLTestMotion() {} - static LLMotion *create(const LLUUID& id) { return new LLTestMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLTestMotion(id, controller); } BOOL getLoop() { return FALSE; } F32 getDuration() { return 0.0f; } F32 getEaseInDuration() { return 0.0f; } @@ -223,9 +310,9 @@ public: class LLNullMotion : public LLMotion { public: - LLNullMotion(const LLUUID &id) : LLMotion(id) {} + LLNullMotion(LLUUID const& id, LLMotionController* controller) : LLMotion(id, controller) {} ~LLNullMotion() {} - static LLMotion *create(const LLUUID &id) { return new LLNullMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLNullMotion(id, controller); } // motions must specify whether or not they loop /*virtual*/ BOOL getLoop() { return TRUE; } @@ -266,5 +353,41 @@ public: // called when a motion is deactivated /*virtual*/ void onDeactivate() {} }; + + +//----------------------------------------------------------------------------- +// AIMaskedMotion +//----------------------------------------------------------------------------- + +// These motions have a bit assigned in LLMotionController::mActiveMask +// that is set and uset upon activation/deactivation. + +// This must be in the same order as ANIM_AGENT_BODY_NOISE_ID through ANIM_AGENT_WALK_ADJUST_ID in llvoavatar.cpp. +U32 const ANIM_AGENT_BODY_NOISE = 0x001; +U32 const ANIM_AGENT_BREATHE_ROT = 0x002; +U32 const ANIM_AGENT_PHYSICS_MOTION = 0x004; +U32 const ANIM_AGENT_EDITING = 0x008; +U32 const ANIM_AGENT_EYE = 0x010; +U32 const ANIM_AGENT_FLY_ADJUST = 0x020; +U32 const ANIM_AGENT_HAND_MOTION = 0x040; +U32 const ANIM_AGENT_HEAD_ROT = 0x080; +U32 const ANIM_AGENT_PELVIS_FIX = 0x100; +U32 const ANIM_AGENT_TARGET = 0x200; +U32 const ANIM_AGENT_WALK_ADJUST = 0x400; + +class AIMaskedMotion : public LLMotion +{ +private: + U32 mMaskBit; + +public: + AIMaskedMotion(LLUUID const& id, LLMotionController* controller, U32 mask_bit) : LLMotion(id, controller), mMaskBit(mask_bit) { } + + /*virtual*/ BOOL onActivate(); + /*virtual*/ void onDeactivate(); + + U32 getMaskBit(void) const { return mMaskBit; } +}; + #endif // LL_LLMOTION_H diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 35dcc1057..d12b3ddb6 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -97,7 +97,7 @@ void LLMotionRegistry::markBad( const LLUUID& id ) //----------------------------------------------------------------------------- // createMotion() //----------------------------------------------------------------------------- -LLMotion *LLMotionRegistry::createMotion( const LLUUID &id ) +LLMotion* LLMotionRegistry::createMotion(LLUUID const& id, LLMotionController* controller) { LLMotionConstructor constructor = get_if_there(mMotionTable, id, LLMotionConstructor(NULL)); LLMotion* motion = NULL; @@ -105,11 +105,11 @@ LLMotion *LLMotionRegistry::createMotion( const LLUUID &id ) if ( constructor == NULL ) { // *FIX: need to replace with a better default scheme. RN - motion = LLKeyframeMotion::create(id); + motion = LLKeyframeMotion::create(id, controller); } else { - motion = constructor(id); + motion = constructor(id, controller); } return motion; @@ -126,18 +126,22 @@ LLMotion *LLMotionRegistry::createMotion( const LLUUID &id ) // Class Constructor //----------------------------------------------------------------------------- LLMotionController::LLMotionController() - : mTimeFactor(sCurrentTimeFactor), + : mIsSelf(FALSE), + mTimeFactor(sCurrentTimeFactor), mCharacter(NULL), - mAnimTime(0.f), + mActiveMask(0), + mDisableSyncing(0), + mHidden(false), + mHaveVisibleSyncedMotions(false), mPrevTimerElapsed(0.f), + mAnimTime(0.f), mLastTime(0.0f), mHasRunOnce(FALSE), mPaused(FALSE), mPauseTime(0.f), mTimeStep(0.f), mTimeStepCount(0), - mLastInterp(0.f), - mIsSelf(FALSE) + mLastInterp(0.f) { } @@ -168,7 +172,15 @@ void LLMotionController::deleteAllMotions() mLoadingMotions.clear(); mLoadedMotions.clear(); mActiveMotions.clear(); - + // + mActiveMask = 0; + for_each(mDeprecatedMotions.begin(), mDeprecatedMotions.end(), DeletePointer()); + mDeprecatedMotions.clear(); + for (motion_map_t::iterator iter = mAllMotions.begin(); iter != mAllMotions.end(); ++iter) + { + iter->second->unregister_client(); + } + // for_each(mAllMotions.begin(), mAllMotions.end(), DeletePairedPointer()); mAllMotions.clear(); } @@ -178,26 +190,19 @@ void LLMotionController::deleteAllMotions() //----------------------------------------------------------------------------- void LLMotionController::purgeExcessMotions() { - if (mLoadedMotions.size() > MAX_MOTION_INSTANCES) + // + // The old code attempted to remove non-active motions from mDeprecatedMotions, + // but that is nonsense: there are no motions in mDeprecatedMotions that are not active. + if (mLoadedMotions.size() <= MAX_MOTION_INSTANCES) { - // clean up deprecated motions - for (motion_set_t::iterator deprecated_motion_it = mDeprecatedMotions.begin(); - deprecated_motion_it != mDeprecatedMotions.end(); ) - { - motion_set_t::iterator cur_iter = deprecated_motion_it++; - LLMotion* cur_motionp = *cur_iter; - if (!isMotionActive(cur_motionp)) - { - // Motion is deprecated so we know it's not cannonical, - // we can safely remove the instance - removeMotionInstance(cur_motionp); // modifies mDeprecatedMotions - mDeprecatedMotions.erase(cur_iter); - } - } + // Speed up, no need to create motions_to_kill. + return; } + // std::set motions_to_kill; - if (mLoadedMotions.size() > MAX_MOTION_INSTANCES) + + if (1) // Singu: leave indentation alone... { // too many motions active this frame, kill all blenders mPoseBlender.clearBlenders(); @@ -308,24 +313,44 @@ BOOL LLMotionController::registerMotion( const LLUUID& id, LLMotionConstructor c void LLMotionController::removeMotion( const LLUUID& id) { LLMotion* motionp = findMotion(id); - mAllMotions.erase(id); - removeMotionInstance(motionp); + // + // If a motion is erased from mAllMotions, it must be deleted. + if (motionp) + { + mAllMotions.erase(id); + removeMotionInstance(motionp); + delete motionp; + } + // } // removes instance of a motion from all runtime structures, but does // not erase entry by ID, as this could be a duplicate instance -// use removeMotion(id) to remove all references to a given motion by id. +// use removeMotion(id) to remove a reference to a given motion by id +// (that will not remove (active) deprecated motions). void LLMotionController::removeMotionInstance(LLMotion* motionp) { if (motionp) { llassert(findMotion(motionp->getID()) != motionp); - if (motionp->isActive()) - motionp->deactivate(); mLoadingMotions.erase(motionp); mLoadedMotions.erase(motionp); mActiveMotions.remove(motionp); - delete motionp; + // + // Deactivation moved here. Only delete motionp when it is being removed from mDeprecatedMotions. + if (motionp->isActive()) + { + motionp->deactivate(); + // If a motion is deactivated, it must be removed from mDeprecatedMotions if there. + motion_set_t::iterator found_it = mDeprecatedMotions.find(motionp); + if (found_it != mDeprecatedMotions.end()) + { + mDeprecatedMotions.erase(found_it); + // If a motion is erased from mDeprecatedMotions, it must be deleted. + delete motionp; + } + } + // } } @@ -341,7 +366,7 @@ LLMotion* LLMotionController::createMotion( const LLUUID &id ) if (!motion) { // look up constructor and create it - motion = sRegistry.createMotion(id); + motion = sRegistry.createMotion(id, this); if (!motion) { return NULL; @@ -393,6 +418,7 @@ BOOL LLMotionController::startMotion(const LLUUID &id, F32 start_offset) if (motion && !mPaused && motion->canDeprecate() + && motion->isActive() // singu: do not deprecate motions that are not active. && motion->getFadeWeight() > 0.01f // not LOD-ed out && (motion->isBlending() || motion->getStopTime() != 0.f)) { @@ -418,7 +444,19 @@ BOOL LLMotionController::startMotion(const LLUUID &id, F32 start_offset) } // llinfos << "Starting motion " << name << llendl; - return activateMotionInstance(motion, mAnimTime - start_offset); + // + F32 start_time = mAnimTime - start_offset; + if (!mDisableSyncing) + { + start_time = motion->syncActivationTime(start_time); + } + ++mDisableSyncing; + // + BOOL res = activateMotionInstance(motion, start_time); + // + --mDisableSyncing; + // + return res; } @@ -774,7 +812,19 @@ void LLMotionController::updateLoadingMotions() // this motion should be playing if (!motionp->isStopped()) { - activateMotionInstance(motionp, mAnimTime); + // + F32 start_time = mAnimTime; + if (!mDisableSyncing) + { + motionp->aisync_loaded(); + start_time = motionp->syncActivationTime(start_time); + } + ++mDisableSyncing; + // + activateMotionInstance(motionp, start_time); + // + --mDisableSyncing; + // } } else if (status == LLMotion::STATUS_FAILURE) @@ -782,12 +832,15 @@ void LLMotionController::updateLoadingMotions() llinfos << "Motion " << motionp->getID() << " init failed." << llendl; sRegistry.markBad(motionp->getID()); mLoadingMotions.erase(curiter); - motion_set_t::iterator found_it = mDeprecatedMotions.find(motionp); - if (found_it != mDeprecatedMotions.end()) - { - mDeprecatedMotions.erase(found_it); - } + // Singu note: a motion in mLoadingMotions will not be in mActiveMotions + // and therefore not be in mDeprecatedMotions. So, we don't have to + // check for it's existence there. + llassert(mDeprecatedMotions.find(motionp) == mDeprecatedMotions.end()); mAllMotions.erase(motionp->getID()); + // + // Make sure we're not registered anymore. + motionp->unregister_client(); + // delete motionp; } } @@ -821,8 +874,15 @@ void LLMotionController::updateMotions(bool force_update) { F32 time_interval = fmodf(update_time, mTimeStep); - // always animate *ahead* of actual time - S32 quantum_count = llmax(0, llfloor((update_time - time_interval) / mTimeStep)) + 1; + // + // This old code is nonsense. + //S32 quantum_count = llmax(0, llround((update_time - time_interval) / mTimeStep)) + 1; + // (update_time - time_interval) / mTimeStep is an integer! We need llround to get rid of floating point errors, not llfloor. + // Moreover, just rounding off to the nearest integer with llround(update_time / mTimeStep) makes a lot more sense: + // it is the best we can do to get as close to what we should draw as possible. + // However, mAnimTime may only be incremented; therefore make sure of that with the llmax. + S32 quantum_count = llmax(llround(update_time / mTimeStep), llceil(mAnimTime / mTimeStep)); + // if (quantum_count == mTimeStepCount) { // we're still in same time quantum as before, so just interpolate and exit @@ -848,7 +908,8 @@ void LLMotionController::updateMotions(bool force_update) } else { - mAnimTime = update_time; + // Singu note: mAnimTime may never be set back in time. + mAnimTime = llmax(mAnimTime, update_time); } } @@ -915,6 +976,12 @@ BOOL LLMotionController::activateMotionInstance(LLMotion *motion, F32 time) if (mLoadingMotions.find(motion) != mLoadingMotions.end()) { + // + if (!syncing_disabled()) + { + motion->aisync_loading(); + } + // // we want to start this motion, but we can't yet, so flag it as started motion->setStopped(FALSE); // report pending animations as activated @@ -970,18 +1037,16 @@ BOOL LLMotionController::activateMotionInstance(LLMotion *motion, F32 time) //----------------------------------------------------------------------------- BOOL LLMotionController::deactivateMotionInstance(LLMotion *motion) { - motion->deactivate(); - motion_set_t::iterator found_it = mDeprecatedMotions.find(motion); if (found_it != mDeprecatedMotions.end()) { // deprecated motions need to be completely excised - removeMotionInstance(motion); - mDeprecatedMotions.erase(found_it); + removeMotionInstance(motion); // singu note: this deactivates motion and removes it from mDeprecatedMotions. } else { // for motions that we are keeping, simply remove from active queue + motion->deactivate(); // singu note: moved here from the top of the function. mActiveMotions.remove(motion); } @@ -1049,11 +1114,26 @@ void LLMotionController::dumpMotions() state_string += std::string("L"); if (std::find(mActiveMotions.begin(), mActiveMotions.end(), motion)!=mActiveMotions.end()) state_string += std::string("A"); - if (mDeprecatedMotions.find(motion) != mDeprecatedMotions.end()) - state_string += std::string("D"); + llassert(mDeprecatedMotions.find(motion) == mDeprecatedMotions.end()); // singu: it's impossible that a motion is in mAllMotions and mDeprecatedMotions at the same time. llinfos << gAnimLibrary.animationName(id) << " " << state_string << llendl; - } + // + // Also dump the deprecated motions. + for (motion_set_t::iterator iter = mDeprecatedMotions.begin(); + iter != mDeprecatedMotions.end(); ++iter) + { + std::string state_string; + LLMotion* motion = *iter; + LLUUID id = motion->getID(); + llassert(mLoadingMotions.find(motion) == mLoadingMotions.end()); + if (mLoadedMotions.find(motion) != mLoadedMotions.end()) + state_string += std::string("L"); + if (std::find(mActiveMotions.begin(), mActiveMotions.end(), motion)!=mActiveMotions.end()) + state_string += std::string("A"); + state_string += "D"; + llinfos << gAnimLibrary.animationName(id) << " " << state_string << llendl; + } + // } //----------------------------------------------------------------------------- @@ -1061,11 +1141,11 @@ void LLMotionController::dumpMotions() //----------------------------------------------------------------------------- void LLMotionController::deactivateAllMotions() { - for (motion_map_t::iterator iter = mAllMotions.begin(); - iter != mAllMotions.end(); iter++) + // Singu note: this must run over mActiveMotions: other motions are not active, + // and running over mAllMotions will miss the ones in mDeprecatedMotions. + for (motion_list_t::iterator iter = mActiveMotions.begin(); iter != mActiveMotions.end();) { - LLMotion* motionp = iter->second; - deactivateMotionInstance(motionp); + deactivateMotionInstance(*iter++); // This might invalidate iter by erasing it from mActiveMotions. } } @@ -1086,8 +1166,7 @@ void LLMotionController::flushAllMotions() active_motions.push_back(std::make_pair(motionp->getID(),dtime)); motionp->deactivate(); // don't call deactivateMotionInstance() because we are going to reactivate it } - mActiveMotions.clear(); - + // delete all motion instances deleteAllMotions(); @@ -1096,13 +1175,136 @@ void LLMotionController::flushAllMotions() mCharacter->removeAnimationData("Hand Pose"); // restart motions + // + // Because we called motionp->deactivate() above, instead of deactivateMotionInstance(), + // prevent calling AISyncClientMotion::activateInstance in startMotion below. + disable_syncing(); + // for (std::vector >::iterator iter = active_motions.begin(); iter != active_motions.end(); ++iter) { startMotion(iter->first, iter->second); } + // + enable_syncing(); + // } +// +//----------------------------------------------------------------------------- +// toggle_hidden() +//----------------------------------------------------------------------------- +void LLMotionController::toggle_hidden(void) +{ + mHaveVisibleSyncedMotions = mHidden; // Default is false if we just became invisible (otherwise this value isn't used). + mHidden = !mHidden; + synceventset_t const visible = mHidden ? 0 : 4; + + // Run over all motions. + for (motion_list_t::iterator iter = mActiveMotions.begin(); iter != mActiveMotions.end(); ++iter) + { + LLMotion* motionp = *iter; + AISyncServer* server = motionp->server(); + if (server && !server->never_synced() && motionp->isActive()) // Skip motions that aren't synchronized at all or that are not active. + { + bool visible_before = server->events_with_at_least_one_client_ready() & 4; + server->ready(4, visible, motionp); // Mark that now we are visible or no longer visible. + bool visible_after = server->events_with_at_least_one_client_ready() & 4; + if (visible_after) // Are there any synchronized motions (left) that ARE visible? + { + mHaveVisibleSyncedMotions = true; + } + if (visible_before != visible_after) + { + // The group as a whole now might need to change whether or not it is animated. + AISyncServer::client_list_t const& clients = server->getClients(); + for (AISyncServer::client_list_t::const_iterator client = clients.begin(); client != clients.end(); ++client) + { + LLMotion* motion = dynamic_cast(client->mClientPtr); + if (!motion) + { + continue; + } + LLMotionController* controller = motion->getController(); + if (controller == this) + { + continue; + } + if (visible_after) + { + // Us becoming visible means that all synchronized avatars need to be animated again too. + controller->setHaveVisibleSyncedMotions(); + } + else + { + // Us becoming hidden means that all synchronized avatars might stop animating. + controller->refresh_hidden(); // It is extremely unlikely, but harmless, to call this twice on the same controller. + } + } + } + } + } +} + +void LLMotionController::refresh_hidden(void) +{ + mHaveVisibleSyncedMotions = !mHidden; + + // Run over all motions. + for (motion_list_t::iterator iter = mActiveMotions.begin(); iter != mActiveMotions.end(); ++iter) + { + LLMotion* motionp = *iter; + AISyncServer* server = motionp->server(); + if (server && !server->never_synced() && motionp->isActive()) // Skip motions that aren't synchronized at all or that are not active. + { + bool visible_after = server->events_with_at_least_one_client_ready() & 4; + if (visible_after) // Are there any synchronized motions (left) that ARE visible? + { + mHaveVisibleSyncedMotions = true; + } + } + } +} + +void LLMotionController::pauseAllSyncedCharacters(std::vector& avatar_pause_handles) +{ + // Run over all motions. + for (motion_list_t::iterator iter = mActiveMotions.begin(); iter != mActiveMotions.end(); ++iter) + { + LLMotion* motionp = *iter; + AISyncServer* server = motionp->server(); + if (server && !server->never_synced() && motionp->isActive()) // Skip motions that aren't synchronized at all or that are not active. + { + // Run over all clients of the found servers. + AISyncServer::client_list_t const& clients = server->getClients(); + for (AISyncServer::client_list_t::const_iterator client = clients.begin(); client != clients.end(); ++client) + { + LLMotion* motion = dynamic_cast(client->mClientPtr); + if (!motion) + { + continue; + } + LLMotionController* controller = motion->getController(); + if (controller == this) + { + continue; + } + controller->requestPause(avatar_pause_handles); + } + } + } +} + +void LLMotionController::requestPause(std::vector& avatar_pause_handles) +{ + if (mCharacter) + { + mCharacter->requestPause(avatar_pause_handles); + } +} + +// + //----------------------------------------------------------------------------- // pause() //----------------------------------------------------------------------------- diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h index 2de13aa36..054f1c2f9 100644 --- a/indra/llcharacter/llmotioncontroller.h +++ b/indra/llcharacter/llmotioncontroller.h @@ -51,11 +51,14 @@ // This is necessary because llcharacter.h includes this file. //----------------------------------------------------------------------------- class LLCharacter; +class LLMotionController; +class LLPauseRequestHandle; +typedef LLPointer LLAnimPauseRequest; //----------------------------------------------------------------------------- // LLMotionRegistry //----------------------------------------------------------------------------- -typedef LLMotion*(*LLMotionConstructor)(const LLUUID &id); +typedef LLMotion* (*LLMotionConstructor)(LLUUID const& id, LLMotionController*); class LLMotionRegistry { @@ -72,7 +75,7 @@ public: // creates a new instance of a named motion // returns NULL motion is not registered - LLMotion *createMotion( const LLUUID &id ); + LLMotion* createMotion(LLUUID const& id, LLMotionController* controller); // initialization of motion failed, don't try to create this motion again void markBad( const LLUUID& id ); @@ -115,7 +118,6 @@ public: // unregisters a motion with the controller // (actually just forwards call to motion registry) - // returns true if successfull void removeMotion( const LLUUID& id ); // start motion @@ -150,10 +152,20 @@ public: //Flush is a liar. void deactivateAllMotions(); + // + void activated(U32 bit) { mActiveMask |= bit; } + void deactivated(U32 bit) { mActiveMask &= ~bit; } + bool isactive(U32 bit) const { return (mActiveMask & bit) != 0; } + // + // pause and continue all motions void pauseAllMotions(); void unpauseAllMotions(); BOOL isPaused() const { return mPaused; } + // + void requestPause(std::vector& avatar_pause_handles); + void pauseAllSyncedCharacters(std::vector& avatar_pause_handles); + // void setTimeStep(F32 step); @@ -180,7 +192,10 @@ protected: // internal operations act on motion instances directly // as there can be duplicate motions per id during blending overlap void deleteAllMotions(); + // singu: LLMotion needs access to activateMotionInstance. +public: BOOL activateMotionInstance(LLMotion *motion, F32 time); +protected: BOOL deactivateMotionInstance(LLMotion *motion); void deprecateMotionInstance(LLMotion* motion); BOOL stopMotionInstance(LLMotion *motion, BOOL stop_imemdiate); @@ -205,10 +220,13 @@ protected: // Life cycle of an animation: // // Animations are instantiated and immediately put in the mAllMotions map for their entire lifetime. +// Singu note: that is not true, they are moved to mDeprecatedMotions (often) for the last part of their lifetime. // If the animations depend on any asset data, the appropriate data is fetched from the data server, // and the animation is put on the mLoadingMotions list. // Once an animations is loaded, it will be initialized and put on the mLoadedMotions list. // Any animation that is currently playing also sits in the mActiveMotions list. +// Singu note: animations are only put in mDeprecatedMotions if and while they are playing, +// therefore animations in mDeprecatedMotions will be (must be) active and in mActiveMotions. typedef std::map motion_map_t; motion_map_t mAllMotions; @@ -217,7 +235,13 @@ protected: motion_set_t mLoadedMotions; motion_list_t mActiveMotions; motion_set_t mDeprecatedMotions; - + + // + U32 mActiveMask; + int mDisableSyncing; // Set while LLMotion::onActivate (and onDeactivate) are called for this controller. + bool mHidden; // The value of the last call to hidden(). + bool mHaveVisibleSyncedMotions; // Set when we are synchronized with one or more motions of a controller that is not hidden. + // LLFrameTimer mTimer; F32 mPrevTimerElapsed; F32 mAnimTime; @@ -230,6 +254,26 @@ protected: F32 mLastInterp; U8 mJointSignature[2][LL_CHARACTER_MAX_JOINTS]; + + // +public: + // Internal administration for AISync. + void disable_syncing(void) { mDisableSyncing += 100; } + void enable_syncing(void) { mDisableSyncing -= 100; } + bool syncing_disabled(void) const { return mDisableSyncing >= 100; } + + // Accessors needed for synchronization. + F32 getAnimTime(void) const { return mAnimTime; } + bool isHidden(void) const { return mHidden; } + + // Called often. Should return false if we still need to keep updating our motions even if we're not visible. + bool hidden(bool not_visible) { if (mHidden != not_visible) toggle_hidden(); return !mHaveVisibleSyncedMotions; } + +private: + void toggle_hidden(void); + void refresh_hidden(void); + void setHaveVisibleSyncedMotions(void) { mHaveVisibleSyncedMotions = true; } + // }; //----------------------------------------------------------------------------- diff --git a/indra/llcharacter/lltargetingmotion.cpp b/indra/llcharacter/lltargetingmotion.cpp index a330b2265..05b0fdfe8 100644 --- a/indra/llcharacter/lltargetingmotion.cpp +++ b/indra/llcharacter/lltargetingmotion.cpp @@ -52,7 +52,7 @@ const F32 TORSO_ROT_FRACTION = 0.5f; // LLTargetingMotion() // Class Constructor //----------------------------------------------------------------------------- -LLTargetingMotion::LLTargetingMotion(const LLUUID &id) : LLMotion(id) +LLTargetingMotion::LLTargetingMotion(LLUUID const& id, LLMotionController* controller) : AIMaskedMotion(id, controller, ANIM_AGENT_TARGET) { mCharacter = NULL; mName = "targeting"; @@ -99,14 +99,6 @@ LLMotion::LLMotionInitStatus LLTargetingMotion::onInitialize(LLCharacter *charac return STATUS_SUCCESS; } -//----------------------------------------------------------------------------- -// LLTargetingMotion::onActivate() -//----------------------------------------------------------------------------- -BOOL LLTargetingMotion::onActivate() -{ - return TRUE; -} - //----------------------------------------------------------------------------- // LLTargetingMotion::onUpdate() //----------------------------------------------------------------------------- @@ -166,12 +158,4 @@ BOOL LLTargetingMotion::onUpdate(F32 time, U8* joint_mask) return result; } -//----------------------------------------------------------------------------- -// LLTargetingMotion::onDeactivate() -//----------------------------------------------------------------------------- -void LLTargetingMotion::onDeactivate() -{ -} - - // End diff --git a/indra/llcharacter/lltargetingmotion.h b/indra/llcharacter/lltargetingmotion.h index 1ec9f80d6..f7b08ee69 100644 --- a/indra/llcharacter/lltargetingmotion.h +++ b/indra/llcharacter/lltargetingmotion.h @@ -48,11 +48,11 @@ // class LLTargetingMotion //----------------------------------------------------------------------------- class LLTargetingMotion : - public LLMotion + public AIMaskedMotion { public: // Constructor - LLTargetingMotion(const LLUUID &id); + LLTargetingMotion(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLTargetingMotion(); @@ -64,7 +64,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLTargetingMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLTargetingMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -96,19 +96,11 @@ public: // must return true to indicate success and be available for activation virtual LLMotionInitStatus onInitialize(LLCharacter *character); - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate(); - // called per time step // must return TRUE while it is active, and // must return FALSE when the motion is completed. virtual BOOL onUpdate(F32 time, U8* joint_mask); - // called when a motion is deactivated - virtual void onDeactivate(); - public: LLCharacter *mCharacter; diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index be045f100..fd0e8208c 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -20,6 +20,7 @@ set(llcommon_SOURCE_FILES aialert.cpp aifile.cpp aiframetimer.cpp + aisyncclient.cpp aithreadid.cpp imageids.cpp indra_constants.cpp @@ -112,11 +113,13 @@ set(llcommon_HEADER_FILES aifile.h aiframetimer.h airecursive.h + aisyncclient.h aithreadid.h aithreadsafe.h bitpack.h ctype_workaround.h doublelinkedlist.h + fix_macros.h imageids.h indra_constants.h linden_common.h diff --git a/indra/llcommon/aisyncclient.cpp b/indra/llcommon/aisyncclient.cpp new file mode 100644 index 000000000..c62d88efb --- /dev/null +++ b/indra/llcommon/aisyncclient.cpp @@ -0,0 +1,698 @@ +/** + * @file aisyncclient.cpp + * + * Copyright (c) 2013, Aleric Inglewood. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution. + * + * CHANGELOG + * and additional copyright holders. + * + * 13/12/2013 + * - Initial version, written by Aleric Inglewood @ SL + */ + +/* + * AISyncClient : the base class of a client object (LLMotion) that needs to be informed + * of the state of other such objects and/or to poll a server object about the state of + * other such objects, in order to be and stay synchronized with those other objects. + * In the case of an LLMotion (animation), all clients would be started and stopped at + * the same time, as long as they are part of the same synchronization group (AISyncServer). + * + * AISyncKey: object that determines what synchronization group a client belongs to. + * When a new client is created, a new AISyncKey is created too, using information from + * the client, the current frame number and the current frame time. If two AISyncKey + * compare equal, using operator==(AISyncKey const& key1, AISyncKey const& key2), + * then the clients that created them need to be synchronized. + * + * AISyncServer: object that represents a group of clients that need to be synchronized: + * it's a wrapper around a std::list with pointers to all the clients + * that need to be synchronized. It also stores the AISyncKey of the first (oldest) client + * that was added. Clients with keys that compare equal to that will be added. + * If a client is added with a synckeytype_t that is larger then it always replaces + * the existing key however. + * + * AISyncServerMap: A wrapper around std::list > + * that stores pointers to all currently existing AISyncServer objects. New entries + * are added at the end, so the oldest key is at the front. + * + * AISyncServerMap list + - - - - - - + - - - - - - + ... The AISyncServerMap is + * | | | a list with refcounted + * V V V pointers to AISyncServers. + * AISyncClient +--> AISyncServer + * | <--- list key ---> AISyncKey Each AISyncServer is a + * DerivedClient . list of normal pointers + * . AISyncClients and one + * <--- . pointer to a AISyncKey. + * Each AISyncClient is the + * base class of a DerivedClient + * and pointers back to the + * server with a refcounted + * pointer. + * + * A new client is passed to the AISyncServerMap to be stored in a new or existing AISyncServer + * object, using the key that the client produces. A boost::intrusive_ptr member + * of the client is set to point to this server. + * + * The lifetime of the server objects is determined by the intrusive_ptr objects that + * point to it: all the clients (which have an externally determined lifetime) and one + * pointer in the AISyncServerMap. However, regularly a check is done on all servers in + * the list to find expired servers: objects with keys older than two frames and older + * than 0.1 seconds; if such a server is found and it has zero or one client, then the + * client is unregistered and the pointer (and thus the server) removed from the + * AISyncServerMap. If it has two or more clients then the entry is kept until both + * clients are removed, which therefore can only be detected in intrusive_ptr_release + * which only has access to the server object. The server then is removed from the list + * by searching through it for the pointer to the server. + */ + +#include "sys.h" +#include "aisyncclient.h" +#include +#include +#include "debug.h" + +bool operator==(AISyncKey const& key1, AISyncKey const& key2) +{ + // Test if these keys match based on time. + if (std::abs((S32)(key1.mStartFrameCount - key2.mStartFrameCount)) > 1 && + std::abs(key1.mFrameTimer.getStartTime() - key2.mFrameTimer.getStartTime()) >= sSyncKeyExpirationTime) + { + return false; + } + // Time matches, let the derived classes determine if they also match otherwise. + return key1.equals(key2); +} + +#ifdef CWDEBUG +struct SyncEventSet { + synceventset_t mBits; + SyncEventSet(synceventset_t bits) : mBits(bits) { } +}; + +std::ostream& operator<<(std::ostream& os, SyncEventSet const& ses) +{ + for (int b = sizeof(ses.mBits) * 8 - 1; b >= 0; --b) + { + int m = 1 << b; + os << ((ses.mBits & m) ? '1' : '0'); + } + return os; +} + +void print_clients(AISyncServer const* server, AISyncServer::client_list_t const& client_list) +{ + Dout(dc::notice, "Clients of server " << server << ": "); + for (AISyncServer::client_list_t::const_iterator iter = client_list.begin(); iter != client_list.end(); ++ iter) + { + llassert(iter->mClientPtr->mReadyEvents == iter->mReadyEvents); + Dout(dc::notice, "-> " << iter->mClientPtr << " : " << SyncEventSet(iter->mReadyEvents)); + } +} +#endif + +void AISyncServerMap::register_client(AISyncClient* client, AISyncKey* new_key) +{ + // client must always be a new client that has to be stored somewhere. + llassert(client->server() == NULL); + // Obviously the client can't be ready for anything when it isn't registered yet. + llassert(!client->mReadyEvents); + + // Find if a server with this key already exists. + AISyncServer* server = NULL; + for (server_list_t::iterator iter = mServers.begin(); iter != mServers.end();) + { + boost::intrusive_ptr& server_ptr = *iter++; // Immediately increment iter because the call to unregister_last_client will erase it. + AISyncKey const& server_key(server_ptr->key()); + if (server_key.is_older_than(*new_key)) // This means that the server key is expired: a new key will never match. + { + if (server_ptr->never_synced()) // This means that it contains one or zero clients and will never contain more. + { + // Get rid of this server. + server_ptr->unregister_last_client(); // This will cause the server to be deleted, and erased from mServers. + } + continue; + } + if (*new_key == server_key) + { + server = server_ptr.get(); + // mServers stores new servers in strict order of the creation time of the keys, + // so once we find a server with a key that is equal, none of the remaining servers + // will have expired if they were never synced and we're done with the loop. + // Servers that synced might have been added later, but we don't unregister + // clients from those anyway because their sync partner might still show up. + break; + } + } + + if (server) + { + // A server already exists. + // Keep the oldest key, unless this new key has a synckeytype_t that is larger! + if (new_key->getkeytype() > server->key().getkeytype()) + { + server->swapkey(new_key); + } + delete new_key; + } + else + { + // Create a new server for this client. Transfers the ownership of the key allocation to the server. + server = new AISyncServer(new_key); + // Add it to mServers, before the last server that is younger then the new key. + server_list_t::iterator where = mServers.end(); // Insert the new server before 'where', + server_list_t::iterator new_where = where; + while (where != mServers.begin()) // unless there exists a server before that + { + --new_where; + if (new_key->getCreationTime() > (*new_where)->key().getCreationTime()) // and the new key is not younger then that, + { + break; + } + where = new_where; // then insert it before that element (etc). + } + // This method causes a single call to intrusive_ptr_add_ref and none to intrusive_ptr_release. + server_ptr_t server_ptr = server; + mServers.insert(where, server_ptr_t())->swap(server_ptr); + } + + // Add the client to the server. + server->add(client); +} + +#ifdef SYNC_TESTSUITE +void AISyncServer::sanity_check(void) const +{ + synceventset_t ready_events = (synceventset_t)-1; // All clients are ready. + client_list_t::const_iterator client_iter = mClients.begin(); + while (client_iter != mClients.end()) + { + ready_events &= client_iter->mReadyEvents; + ++client_iter; + } + synceventset_t pending_events = 0; // At least one client is ready. + client_iter = mClients.begin(); + while (client_iter != mClients.end()) + { + pending_events |= client_iter->mReadyEvents; + ++client_iter; + } + llassert(ready_events == mReadyEvents); + llassert(pending_events == mPendingEvents); +} +#endif + +void AISyncServer::add(AISyncClient* client) +{ +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif + + // The client can't already be ready when it isn't even added to a server yet. + llassert(!client->mReadyEvents); + synceventset_t old_ready_events = mReadyEvents; + // A new client is not ready for anything. + mReadyEvents = 0; + // Set mSynchronized if after adding client we'll have more than 1 client (that prevents the + // server from being deleted unless all clients are actually destructed or explicitly unregistered). + if (!mSynchronized && mClients.size() > 0) + { + mSynchronized = true; + } + // Trigger the existing clients to be not-ready anymore (if we were before). + trigger(old_ready_events); + // Only then add the new client (so that it didn't get not-ready trigger). + mClients.push_back(client); + client->mServer = this; + +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif +} + +void AISyncServer::remove(AISyncClient* client) +{ +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif + + client_list_t::iterator client_iter = mClients.begin(); + synceventset_t remaining_ready_events = (synceventset_t)-1; // All clients are ready. + synceventset_t remaining_pending_events = 0; // At least one client is ready (waiting for the other clients thus). + client_list_t::iterator found_client = mClients.end(); + while (client_iter != mClients.end()) + { + if (client_iter->mClientPtr == client) + { + found_client = client_iter; + } + else + { + remaining_ready_events &= client_iter->mReadyEvents; + remaining_pending_events |= client_iter->mReadyEvents; + } + ++client_iter; + } + llassert(found_client != mClients.end()); + // This must be the same as client->mReadyEvents. + llassert(found_client->mReadyEvents == client->mReadyEvents); + mClients.erase(found_client); + synceventset_t old_ready_events = mReadyEvents; + mReadyEvents = remaining_ready_events; + mPendingEvents = remaining_pending_events; + trigger(old_ready_events); + client->mServer.reset(); + client->deregistered(); + +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif +} + +void AISyncServer::unregister_last_client(void) +{ +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif + + // This function may only be called for servers with exactly one client that was never (potentially) synchronized. + llassert(!mSynchronized && mClients.size() == 1); + AISyncClient* client = mClients.begin()->mClientPtr; + mClients.clear(); + client->mServer.reset(); + llassert(mReadyEvents == client->mReadyEvents); + llassert(mPendingEvents == mReadyEvents); + // No need to update mReadyEvents/mPendingEvents because the server is going to be deleted, + // but inform the client that is no longer has a server. + client->deregistered(); + +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif +} + +void AISyncServer::trigger(synceventset_t old_ready_events) +{ + // If event 1 changed, informat all clients about it. + if (((old_ready_events ^ mReadyEvents) & 1)) + { + for (client_list_t::iterator client_iter = mClients.begin(); client_iter != mClients.end(); ++client_iter) + { + if ((mReadyEvents & 1)) + { + client_iter->mClientPtr->event1_ready(); + } + else + { + client_iter->mClientPtr->event1_not_ready(); + } + } + } +} + +void AISyncServer::ready(synceventset_t events, synceventset_t yesno, AISyncClient* client) +{ +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif + + synceventset_t added_events = events & yesno; + synceventset_t removed_events = events & ~yesno; + + // Run over all clients to find the client and calculate the current state. + synceventset_t remaining_ready_events = (synceventset_t)-1; // All clients are ready. + synceventset_t remaining_pending_events = 0; // At least one client is ready (waiting for the other clients thus). + client_list_t::iterator found_client = mClients.end(); + for (client_list_t::iterator client_iter = mClients.begin(); client_iter != mClients.end(); ++client_iter) + { + if (client_iter->mClientPtr == client) + { + found_client = client_iter; + } + else + { + remaining_ready_events &= client_iter->mReadyEvents; + remaining_pending_events |= client_iter->mReadyEvents; + } + } + + llassert(mReadyEvents == (remaining_ready_events & found_client->mReadyEvents)); + llassert(mPendingEvents == (remaining_pending_events | found_client->mReadyEvents)); + + found_client->mReadyEvents &= ~removed_events; + found_client->mReadyEvents |= added_events; +#ifdef SHOW_ASSERT + client->mReadyEvents = found_client->mReadyEvents; +#endif + + synceventset_t old_ready_events = mReadyEvents; + + mReadyEvents = remaining_ready_events & found_client->mReadyEvents; + mPendingEvents = remaining_pending_events | found_client->mReadyEvents; + + trigger(old_ready_events); + +#ifdef SYNC_TESTSUITE + sanity_check(); +#endif +} + +void intrusive_ptr_add_ref(AISyncServer* server) +{ + server->mRefCount++; +} + +void intrusive_ptr_release(AISyncServer* server) +{ + llassert(server->mRefCount > 0); + server->mRefCount--; + if (server->mRefCount == 0) + { + delete server; + } + else if (server->mRefCount == 1) + { + // If the the last pointer to this server is in the the AISyncServerMap, then delete that too. + AISyncServerMap::instance().remove_server(server); + } +} + +void AISyncServerMap::remove_server(AISyncServer* server) +{ + for (server_list_t::iterator iter = mServers.begin(); iter != mServers.end(); ++iter) + { + if (server == iter->get()) + { + mServers.erase(iter); // This causes server to be deleted too. + return; + } + } + // The server must be found: this function is only called from intrusive_ptr_release for servers + // with just a single server_ptr_t left, which must be the one in mServers (otherwise it wasn't + // even registered properly!) + llassert(false); +} + + +//============================================================================= +// SYNC_TESTSUITE +//============================================================================= + +#ifdef SYNC_TESTSUITE +#include +#include +#include +#include + +//static +U32 LLFrameTimer::sFrameCount; + +double innerloop_count = 0; + +double LLFrameTimer::getCurrentTime() +{ + return innerloop_count * 0.001; +} + +template +class TestsuiteKey : public AISyncKey +{ + private: + int mIndex; + + public: + TestsuiteKey(int index) : mIndex(index) { } + + int getIndex(void) const { return mIndex; } + + // Virtual functions of AISyncKey. + public: + /*virtual*/ synckeytype_t getkeytype(void) const + { + // Return a unique identifier for this class, where the low 8 bits represent the syncgroup. + return synckeytype; + } + + /*virtual*/ bool equals(AISyncKey const& key) const + { + synckeytype_t const theotherkey = (synckeytype_t)(synckeytype ^ 0x100); + switch (key.getkeytype()) + { + case synckeytype: + { + // The other key is of the same type. + TestsuiteKey const& test_key = static_cast const&>(key); + return (mIndex & 1) == (test_key.mIndex & 1); + } + case theotherkey: + { + TestsuiteKey const& test_key = static_cast const&>(key); + return (mIndex & 2) == (test_key.getIndex() & 2); + } + default: + // The keys must be in the same syncgroup. + break; + } + return false; + } +}; + +template +class TestsuiteClient : public AISyncClient +{ + // AISyncClient events. + protected: + /*virtual*/ AISyncKey* createSyncKey(void) const + { + return new TestsuiteKey(mIndex); + } + + private: + int mIndex; + bool mRequestedRegistered; + synceventset_t mRequestedReady; + bool mActualReady1; + + public: + TestsuiteClient() : mIndex(-1), mRequestedRegistered(false), mRequestedReady(0), mActualReady1(false) { } + ~TestsuiteClient() { if (is_registered()) this->ready(mRequestedReady, (synceventset_t)0); } + + void setIndex(int index) { mIndex = index; } + + protected: + /*virtual*/ void event1_ready(void) + { +#ifdef DEBUG_SYNCOUTPUT + Dout(dc::notice, "Calling TestsuiteClient<" << synckeytype << ">::event1_ready() (mIndex = " << mIndex << ") of client " << this); +#endif + llassert(!mActualReady1); + mActualReady1 = true; + } + + /*virtual*/ void event1_not_ready(void) + { +#ifdef DEBUG_SYNCOUTPUT + Dout(dc::notice, "Calling TestsuiteClient<" << synckeytype << ">::event1_not_ready() (mIndex = " << mIndex << ") of client " << this); +#endif + llassert(mActualReady1); + mActualReady1 = false; + } + + // This is called when the server expired and we're the only client on it. + /*virtual*/ void deregistered(void) + { +#ifdef DEBUG_SYNCOUTPUT + DoutEntering(dc::notice, "TestsuiteClient<" << synckeytype << ">::deregistered(), with this = " << this); +#endif + mRequestedRegistered = false; + mRequestedReady = 0; + mActualReady1 = false; + this->mReadyEvents = 0; + } + + private: + bool is_registered(void) const { return this->server(); } + + public: + void change_state(unsigned long r); + bool getRequestedRegistered(void) const { return mRequestedRegistered; } + synceventset_t getRequestedReady(void) const { return mRequestedReady; } +}; + +TestsuiteClient* client1ap; +TestsuiteClient* client1bp; +TestsuiteClient* client2ap; +TestsuiteClient* client2bp; + +int const number_of_clients_per_syncgroup = 8; + +template +void TestsuiteClient::change_state(unsigned long r) +{ + bool change_registered = r & 1; + r >>= 1; + synceventset_t toggle_events = r & 15; + r >>= 4; + if (change_registered) + { + if (mRequestedRegistered && !mRequestedReady) + { + mRequestedRegistered = false; + this->unregister_client(); + } + } + else if (toggle_events) + { + mRequestedReady ^= toggle_events; + mRequestedRegistered = true; + this->ready(toggle_events, mRequestedReady & toggle_events); + } + llassert(mRequestedRegistered == is_registered()); + AISyncServer* server = this->server(); + if (mRequestedRegistered) + { + synceventset_t all_ready = synceventset_t(-1); + synceventset_t any_ready = 0; + int nr = 0; + for (int cl = 0; cl < number_of_clients_per_syncgroup; ++cl) + { + switch ((synckeytype & 0xff)) + { + case syncgroup_test1: + { + if (client1ap[cl].server() == server) + { + if (client1ap[cl].getRequestedRegistered()) + { + ++nr; + all_ready &= client1ap[cl].getRequestedReady(); + any_ready |= client1ap[cl].getRequestedReady(); + } + } + if (client1bp[cl].server() == server) + { + if (client1bp[cl].getRequestedRegistered()) + { + ++nr; + all_ready &= client1bp[cl].getRequestedReady(); + any_ready |= client1bp[cl].getRequestedReady(); + } + } + break; + } + case syncgroup_test2: + { + if (client2ap[cl].server() == server) + { + if (client2ap[cl].getRequestedRegistered()) + { + ++nr; + all_ready &= client2ap[cl].getRequestedReady(); + any_ready |= client2ap[cl].getRequestedReady(); + } + } + if (client2bp[cl].server() == server) + { + if (client2bp[cl].getRequestedRegistered()) + { + ++nr; + all_ready &= client2bp[cl].getRequestedReady(); + any_ready |= client2bp[cl].getRequestedReady(); + } + } + break; + } + } + } + llassert(nr == server->getClients().size()); + llassert(!!(all_ready & 1) == mActualReady1); + llassert(this->server()->events_with_all_clients_ready() == all_ready); + llassert(this->server()->events_with_at_least_one_client_ready() == any_ready); + llassert(nr == 0 || (any_ready & all_ready) == all_ready); + } + llassert(mRequestedReady == this->mReadyEvents); +} + +int main() +{ + Debug(libcw_do.on()); + Debug(dc::notice.on()); + Debug(libcw_do.set_ostream(&std::cout)); + Debug(list_channels_on(libcw_do)); + + unsigned short seed16v[3] = { 0x1234, 0xfedc, 0x7091 }; + + for (int k = 0;; ++k) + { + std::cout << "Loop: " << k << "; SEED: " << std::hex << seed16v[0] << ", " << seed16v[1] << ", " << seed16v[2] << std::dec << std::endl; + ++LLFrameTimer::sFrameCount; + + seed48(seed16v); + seed16v[0] = lrand48() & 0xffff; + seed16v[1] = lrand48() & 0xffff; + seed16v[2] = lrand48() & 0xffff; + + TestsuiteClient client1a[number_of_clients_per_syncgroup]; + TestsuiteClient client1b[number_of_clients_per_syncgroup]; + TestsuiteClient client2a[number_of_clients_per_syncgroup]; + TestsuiteClient client2b[number_of_clients_per_syncgroup]; + client1ap = client1a; + client1bp = client1b; + client2ap = client2a; + client2bp = client2b; + + for (int i = 0; i < number_of_clients_per_syncgroup; ++i) + { + client1a[i].setIndex(i); + client1b[i].setIndex(i); + client2a[i].setIndex(i); + client2b[i].setIndex(i); + } + + for (int j = 0; j < 1000000; ++j) + { + innerloop_count += 1; + +#ifdef DEBUG_SYNCOUTPUT + Dout(dc::notice, "Innerloop: " << j); +#endif + unsigned long r = lrand48(); + synckeytype_t keytype = (r & 1) ? ((r & 2) ? synckeytype_test1a : synckeytype_test1b) : ((r & 2) ? synckeytype_test2a : synckeytype_test2b); + r >>= 2; + int cl = (r & 255) % number_of_clients_per_syncgroup; + r >>= 8; + switch (keytype) + { + case synckeytype_test1a: + client1a[cl].change_state(r); + break; + case synckeytype_test1b: + client1b[cl].change_state(r); + break; + case synckeytype_test2a: + client2a[cl].change_state(r); + break; + case synckeytype_test2b: + client2b[cl].change_state(r); + break; + } + } + } +} + +#endif diff --git a/indra/llcommon/aisyncclient.h b/indra/llcommon/aisyncclient.h new file mode 100644 index 000000000..0f5237f99 --- /dev/null +++ b/indra/llcommon/aisyncclient.h @@ -0,0 +1,304 @@ +/** + * @file aisyncclient.h + * @brief Declaration of AISyncClient. + * + * Copyright (c) 2013, Aleric Inglewood. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution. + * + * CHANGELOG + * and additional copyright holders. + * + * 12/12/2013 + * Initial version, written by Aleric Inglewood @ SL + */ + +#ifndef AI_SYNC_CLIENT_H +#define AI_SYNC_CLIENT_H + +#ifdef SYNC_TESTSUITE +/* + * To compile the testsuite, run: + * + * cd indra/llcommon + * g++ -O3 -DCWDEBUG -DSYNC_TESTSUITE -I. -I../cwdebug aisyncclient.cpp -lcwd + */ + +#include +#include +typedef uint32_t U32; +typedef int32_t S32; +typedef uint64_t U64; +typedef float F32; +typedef double F64; +#define LL_COMMON_API +#define SHOW_ASSERT +#define ASSERT_ONLY_COMMA(...) , __VA_ARGS__ +#define llassert assert + +struct LLFrameTimer +{ + double mStartTime; + double mExpiry; + static double getCurrentTime(void); + static U32 sFrameCount; + static U32 getFrameCount() { return sFrameCount; } + F64 getStartTime() const { return mStartTime; } + void reset(double expiration) { mStartTime = getCurrentTime(); mExpiry = mStartTime + expiration; } + bool hasExpired(void) const { return getCurrentTime() > mExpiry; } +}; + +template +struct LLSingleton +{ + static T sInstance; + static T& instance(void) { return sInstance; } +}; + +template +T LLSingleton::sInstance; + +#else // !SYNC_TESTSUITE +#include "llsingleton.h" +#include "llframetimer.h" +#endif +#include +#include + +//--------------------------------------------------------------------------------------------------------------------- +// Keys with a different syncgroup are never equal (so they are never synchronized). +enum syncgroups +{ +#ifdef SYNC_TESTSUITE + syncgroup_test1, + syncgroup_test2, +#else + syncgroup_motions, // Syncgroup used for animations. +#endif + syncgroup_size +}; + +// Each key type must return a unique identifier that exists of its syncgroup (the least significant 8 bit) plus a few bit to make it unique (bit 9 and higher). +enum synckeytype_t +{ +#ifdef SYNC_TESTSUITE + synckeytype_test1a = 0x000 + syncgroup_test1, + synckeytype_test1b = 0x100 + syncgroup_test1, + synckeytype_test2a = 0x000 + syncgroup_test2, + synckeytype_test2b = 0x100 + syncgroup_test2, +#else + synckeytype_motion = syncgroup_motions // There is currently only one key type in the syncgroup_motions group: AISyncKeyMotion. +#endif +}; + +typedef U32 synceventset_t; // A mask where each bit represents a ready state. + +static F32 const sSyncKeyExpirationTime = 0.25; // In seconds. + +class LL_COMMON_API AISyncKey +{ + private: + LLFrameTimer mFrameTimer; // This timer is started at the moment the sync key is created. + U32 mStartFrameCount; // The frame count at which the timer was started. + + public: + // Constructor. + AISyncKey(AISyncKey const* from_key) : mStartFrameCount(from_key ? from_key->mStartFrameCount : LLFrameTimer::getFrameCount()) + { + if (from_key) + { + mFrameTimer.copy(from_key->mFrameTimer); + } + else + { + mFrameTimer.reset(sSyncKeyExpirationTime); + } + } + + // Destructor. + virtual ~AISyncKey() { } + + // Return true if this key expired. + bool expired(void) const + { + // The key has expired when sSyncKeyExpirationTime seconds have elapsed AND at least two frames have passed. + return mFrameTimer.getFrameCount() > mStartFrameCount + 1 && mFrameTimer.hasExpired(); + } + + // Returns true if this object and key would not compare equal based on time because this object is too old. + bool is_older_than(AISyncKey const& key) const + { + return key.mStartFrameCount > mStartFrameCount + 1 && key.mFrameTimer.getStartTime() > mFrameTimer.getStartTime() + sSyncKeyExpirationTime; + } + + // Return the creation time of this key (in number of seconds since application start). + F64 getCreationTime(void) const { return mFrameTimer.getStartTime(); } + + // Returns true if the two keys match, meaning that they should be synchronized. + friend bool operator==(AISyncKey const& key1, AISyncKey const& key2); + + // Returns an ID that uniquely identifies the derived type. + // Currently the only derived type is AISyncKeyMotion with ID synckeytype_motion. + virtual synckeytype_t getkeytype(void) const = 0; + + // Returns true if the data in the derived objects match, meaning that they should be synchronized. + virtual bool equals(AISyncKey const& key) const = 0; +}; + +// Forward declaration. +class AISyncClient; +class AISyncServer; +LL_COMMON_API extern void intrusive_ptr_add_ref(AISyncServer* server); +LL_COMMON_API extern void intrusive_ptr_release(AISyncServer* server); + +struct LL_COMMON_API AISyncClientData +{ + AISyncClient* mClientPtr; + synceventset_t mReadyEvents; + + AISyncClientData(AISyncClient* client) : mClientPtr(client), mReadyEvents(0) { } +}; + +class LL_COMMON_API AISyncServer +{ + public: + typedef std::list client_list_t; + + private: + int mRefCount; // Number of boost::intrusive_ptr objects pointing to this object. + AISyncKey* mKey; // The key of the first client that was added. + client_list_t mClients; // A list with pointers to all registered clients. + bool mSynchronized; // Set when a server gets more than one client, and not reset anymore after that. + synceventset_t mReadyEvents; // 0xFFFFFFFF bitwise-AND-ed with all clients. + synceventset_t mPendingEvents; // The bitwise-OR of all clients. + + public: + AISyncServer(AISyncKey* key) : mRefCount(0), mKey(key), mSynchronized(false), mReadyEvents((synceventset_t)-1), mPendingEvents(0) { } + ~AISyncServer() { delete mKey; } + + // Add a new client to this server. + void add(AISyncClient* client); + + // Remove a client from this server. + void remove(AISyncClient* client); + + // Return the key associated to this server (which is the key produced by the first client of the largest synckeytype_t that was added). + AISyncKey const& key(void) const { return *mKey; } + // Replace they key with another key (of larger synckeytype_t). + void swapkey(AISyncKey*& key_ptr) { AISyncKey* tmp = key_ptr; key_ptr = mKey; mKey = tmp; } + + // Returns true if this server never had more than one client. + bool never_synced(void) const { return !mSynchronized; } + + // Set readiness of all events at once. + void ready(synceventset_t events, synceventset_t yesno, AISyncClient* client); + + // Unregister the (only) client because it's own its own and will never need synchronization. + void unregister_last_client(void); + + // Return the events that all clients for. + synceventset_t events_with_all_clients_ready(void) const { return mReadyEvents; } + + // Return events that at least one client is ready for. + synceventset_t events_with_at_least_one_client_ready(void) const { return mPendingEvents; } + + // Return a list of all registered clients. + client_list_t const& getClients(void) const { return mClients; } + + private: + // Call event1_ready() or event1_not_ready() on all clients if the least significant bit of mReadyEvents changed. + void trigger(synceventset_t old_ready_events); + +#ifdef SYNC_TESTSUITE + void sanity_check(void) const; +#endif + + private: + friend LL_COMMON_API void intrusive_ptr_add_ref(AISyncServer* server); + friend LL_COMMON_API void intrusive_ptr_release(AISyncServer* server); +}; + +class LL_COMMON_API AISyncServerMap : public LLSingleton +{ + public: + typedef boost::intrusive_ptr server_ptr_t; // The type of a (stored) pointer to the server objects. + typedef std::list server_list_t; // The type of the list with pointers to the server objects. + + private: + server_list_t mServers; // A list with pointers to all server objects. + + public: + // Find or create a server object that the client belongs to and store the client in it. + // If a new server is created, it is stored in mServers. + void register_client(AISyncClient* client, AISyncKey* new_key); + + private: + friend LL_COMMON_API void intrusive_ptr_release(AISyncServer* server); + // Remove a server from the map, only called by intrusive_ptr_release when there is one pointer left; + // therefore, the server should not have any clients. + void remove_server(AISyncServer* server); +}; + +class LL_COMMON_API AISyncClient +{ + private: + friend class AISyncServer; + boost::intrusive_ptr mServer; // The server this client was registered with, or NULL when unregistered. + + public: +#ifdef SHOW_ASSERT + synceventset_t mReadyEvents; + AISyncClient(void) : mReadyEvents(0) { } +#endif + virtual ~AISyncClient() { llassert(!mServer); /* If this fails then you need to add unregister_client() to the top of the destructor of the derived class that implements deregistered(). */ } + virtual AISyncKey* createSyncKey(AISyncKey const* from_key = NULL) const = 0; + + virtual void event1_ready(void) = 0; + virtual void event1_not_ready(void) = 0; + + // Only client. Client was forcefully deregistered from expired server because it was the only client. + virtual void deregistered(void) + { +#ifdef SHOW_ASSERT + mReadyEvents = 0; +#endif + } + + AISyncServer* server(void) const { return mServer.get(); } + + // Add this client to a server with matching sync key. Optionally the server is first created. + void register_client(void) { AISyncServerMap::instance().register_client(this, createSyncKey()); } + + // Remove this client from its server, if any. + void unregister_client(void) { if (mServer) mServer->remove(this); } + + // Call 'ready' when you are ready (or not) to get a call to start(). + // Returns true if that call was made (immediately), otherwise it may happen later. + + // Set readiness of all events at once. + void ready(synceventset_t events, synceventset_t yesno) + { + if (!mServer) + { + register_client(); + } + mServer->ready(events, yesno, this); + } +}; + +#endif diff --git a/indra/llcommon/fix_macros.h b/indra/llcommon/fix_macros.h new file mode 100644 index 000000000..ef959decf --- /dev/null +++ b/indra/llcommon/fix_macros.h @@ -0,0 +1,25 @@ +/** + * @file fix_macros.h + * @author Nat Goodspeed + * @date 2012-11-16 + * @brief The Mac system headers seem to #define macros with obnoxiously + * generic names, preventing any library from using those names. We've + * had to fix these in so many places that it's worth making a header + * file to handle it. + * + * $LicenseInfo:firstyear=2012&license=viewerlgpl$ + * Copyright (c) 2012, Linden Research, Inc. + * $/LicenseInfo$ + */ + +// DON'T use an #include guard: every time we encounter this header, #undef +// these macros all over again. + +// who injects MACROS with such generic names?! Grr. +#ifdef equivalent +#undef equivalent +#endif + +#ifdef check +#undef check +#endif diff --git a/indra/llcommon/llframetimer.h b/indra/llcommon/llframetimer.h index 2813150c5..30bc58dd9 100644 --- a/indra/llcommon/llframetimer.h +++ b/indra/llcommon/llframetimer.h @@ -47,6 +47,10 @@ public: // Create an LLFrameTimer and start it. After creation it is running and in the state expired (hasExpired will return true). LLFrameTimer(void) : mExpiry(0), mRunning(true), mPaused(false) { if (!sGlobalMutex) global_initialization(); setAge(0.0); } + // + void copy(LLFrameTimer const& timer) { mStartTime = timer.mStartTime; mExpiry = timer.mExpiry; mRunning = timer.mRunning; mPaused = timer.mPaused; } + // + // Atomic reads of static variables. // Return the number of seconds since the start of the application. @@ -142,6 +146,9 @@ public: bool hasExpired() const { return getElapsedSeconds() >= mExpiry; } F32 getElapsedTimeF32() const { llassert(mRunning); return mPaused ? (F32)mStartTime : (F32)(getElapsedSeconds() - mStartTime); } bool getStarted() const { return mRunning; } + // + F64 getStartTime() const { llassert(!mPaused); return mStartTime; } + // // return the seconds since epoch when this timer will expire. F64 expiresAt() const; diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 36d691a5d..b16b086a0 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -669,25 +669,31 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) return false; } +const S32& LLAvatarNameCache::phoenix_name_system() +{ + static const LLCachedControl name_system("PhoenixNameSystem", 0); + return name_system; +} + // Return true when name has been set to Phoenix Name System Name, if not return false. -bool LLAvatarNameCache::getPNSName(const LLUUID& agent_id, std::string& name) +bool LLAvatarNameCache::getPNSName(const LLUUID& agent_id, std::string& name, const S32& name_system) { LLAvatarName avatar_name; if (get(agent_id, &avatar_name)) - getPNSName(avatar_name, name); + getPNSName(avatar_name, name, name_system); else return false; return true; } // get() with callback compatible version of getPNSName -void LLAvatarNameCache::getPNSName(const LLAvatarName& avatar_name, std::string& name) +void LLAvatarNameCache::getPNSName(const LLAvatarName& avatar_name, std::string& name, const S32& name_system) { - static LLCachedControl phoenix_name_system("PhoenixNameSystem", 0); - switch (phoenix_name_system) + switch (name_system) { case 0 : name = avatar_name.getLegacyName(); break; case 1 : name = avatar_name.getCompleteName(); break; case 2 : name = avatar_name.mDisplayName; break; + case 3 : name = avatar_name.getLegacyName() + (avatar_name.mIsDisplayNameDefault ? "" : " (" + avatar_name.mDisplayName + ")"); break; default : name = avatar_name.getLegacyName(); break; } } diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index 99e3fba57..f98988769 100644 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -65,12 +65,13 @@ namespace LLAvatarNameCache // If name is in cache, returns true and fills in provided LLAvatarName // otherwise returns false bool get(const LLUUID& agent_id, LLAvatarName *av_name); + const S32& phoenix_name_system(); // If get() succeeds, returns true and fills in name string // via void function below, otherwise returns false - bool getPNSName(const LLUUID& agent_id, std::string& name); + bool getPNSName(const LLUUID& agent_id, std::string& name, const S32& name_system = phoenix_name_system()); // Perform a filling of name string according to Phoenix Name System, // when we have an LLAvatarName already. - void getPNSName(const LLAvatarName& avatar_name, std::string& name); + void getPNSName(const LLAvatarName& avatar_name, std::string& name, const S32& name_system = phoenix_name_system()); // Callback types for get() below typedef boost::signals2::signal< diff --git a/indra/llmessage/llmessagethrottle.cpp b/indra/llmessage/llmessagethrottle.cpp index 579d6d718..6d6e9a924 100644 --- a/indra/llmessage/llmessagethrottle.cpp +++ b/indra/llmessage/llmessagethrottle.cpp @@ -30,6 +30,7 @@ #include "llmessagethrottle.h" #include "llframetimer.h" +#include "fix_macros.h" // This is used for the stl search_n function. #if _MSC_VER >= 1500 // VC9 has a bug in search_n diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 8b5310beb..064183d49 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -442,6 +442,8 @@ LLGLManager::LLGLManager() : mHasCubeMap(FALSE), mHasDebugOutput(FALSE), + mHasAdaptiveVsync(FALSE), + mIsATI(FALSE), mIsNVIDIA(FALSE), mIsIntel(FALSE), @@ -956,6 +958,12 @@ void LLGLManager::initExtensions() mHasFragmentShader = ExtensionExists("GL_ARB_fragment_shader", gGLHExts.mSysExts) && (LLRender::sGLCoreProfile || ExtensionExists("GL_ARB_shading_language_100", gGLHExts.mSysExts)); #endif +#if LL_WINDOWS + mHasAdaptiveVsync = ExtensionExists("WGL_EXT_swap_control_tear", gGLHExts.mSysExts); +#elif LL_LINUX + mHasAdaptiveVsync = ExtensionExists("GLX_EXT_swap_control_tear", gGLHExts.mSysExts); +#endif + #if LL_LINUX || LL_SOLARIS llinfos << "initExtensions() checking shell variables to adjust features..." << llendl; // Our extension support for the Linux Client is very young with some @@ -980,6 +988,7 @@ void LLGLManager::initExtensions() mHasShaderObjects = FALSE; mHasVertexShader = FALSE; mHasFragmentShader = FALSE; + mHasAdaptiveVsync = FALSE; LL_WARNS("RenderInit") << "GL extension support DISABLED via LL_GL_NOEXT" << LL_ENDL; } else if (getenv("LL_GL_BASICEXT")) /* Flawfinder: ignore */ diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 65161a6fa..9b277c70a 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -113,6 +113,8 @@ public: BOOL mHasCubeMap; BOOL mHasDebugOutput; + BOOL mHasAdaptiveVsync; + // Vendor-specific extensions BOOL mIsATI; BOOL mIsNVIDIA; diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index f066ef6dc..e0ec85523 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1503,14 +1503,13 @@ LLNotificationPtr LLNotifications::add(AIAlert::Error const& error, int type, un } //-------------------------------------------------------------------------------- -// class UpdateItem +// struct UpdateItem // // Allow LLNotifications::add, LLNotifications::cancel and LLNotifications::update // to be called from any thread. -class UpdateItem +struct UpdateItem { -public: char const* sigtype; LLNotificationPtr pNotif; UpdateItem(char const* st, LLNotificationPtr const& np) : sigtype(st), pNotif(np) { } diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index df0168ae7..f6f267f57 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -197,7 +197,7 @@ class LLNotification : { LOG_CLASS(LLNotification); friend class LLNotifications; -friend class UpdateItem; +friend struct UpdateItem; public: // parameter object used to instantiate a new notification @@ -568,7 +568,7 @@ class LLNotificationChannelBase : public boost::signals2::trackable { LOG_CLASS(LLNotificationChannelBase); - friend class UpdateItem; + friend struct UpdateItem; public: LLNotificationChannelBase(LLNotificationFilter filter, LLNotificationComparator comp) : mFilter(filter), mItems_sf(comp) diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 8df242331..b3b37d705 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -388,7 +388,7 @@ LLWindow* LLWindowManager::createWindow( const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clearBg, - BOOL disable_vsync, + const S32 vsync_mode, BOOL use_gl, BOOL ignore_pixel_depth, U32 fsaa_samples) @@ -400,26 +400,26 @@ LLWindow* LLWindowManager::createWindow( #if LL_MESA_HEADLESS new_window = new LLWindowMesaHeadless(callbacks, title, name, x, y, width, height, flags, - fullscreen, clearBg, disable_vsync, ignore_pixel_depth); + fullscreen, clearBg, vsync_mode, ignore_pixel_depth); #elif LL_SDL new_window = new LLWindowSDL(callbacks, title, x, y, width, height, flags, - fullscreen, clearBg, disable_vsync, ignore_pixel_depth, fsaa_samples); + fullscreen, clearBg, vsync_mode, ignore_pixel_depth, fsaa_samples); #elif LL_WINDOWS new_window = new LLWindowWin32(callbacks, title, name, x, y, width, height, flags, - fullscreen, clearBg, disable_vsync, ignore_pixel_depth, fsaa_samples); + fullscreen, clearBg, vsync_mode, ignore_pixel_depth, fsaa_samples); #elif LL_DARWIN new_window = new LLWindowMacOSX(callbacks, title, name, x, y, width, height, flags, - fullscreen, clearBg, disable_vsync, ignore_pixel_depth, fsaa_samples); + fullscreen, clearBg, vsync_mode, ignore_pixel_depth, fsaa_samples); #endif } else { new_window = new LLWindowHeadless(callbacks, title, name, x, y, width, height, flags, - fullscreen, clearBg, disable_vsync, ignore_pixel_depth); + fullscreen, clearBg, vsync_mode, ignore_pixel_depth); } if (FALSE == new_window->isValid()) diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 575c57816..0d53f5951 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -82,7 +82,7 @@ public: BOOL setSize(LLCoordScreen size); BOOL setSize(LLCoordWindow size); virtual void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true); - virtual BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) = 0; + virtual BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = NULL) = 0; virtual BOOL setCursorPosition(LLCoordWindow position) = 0; virtual BOOL getCursorPosition(LLCoordWindow *position) = 0; virtual void showCursor() = 0; @@ -121,6 +121,8 @@ public: virtual BOOL setGamma(const F32 gamma) = 0; // Set the gamma virtual void setFSAASamples(const U32 fsaa_samples) = 0; //set number of FSAA samples virtual U32 getFSAASamples() = 0; + virtual void setVsyncMode(const S32 vsync_mode) = 0; + virtual S32 getVsyncMode() = 0; virtual BOOL restoreGamma() = 0; // Restore original gamma table (before updating gamma) virtual ESwapMethod getSwapMethod() { return mSwapMethod; } virtual void processMiscNativeEvents(); @@ -274,7 +276,7 @@ public: U32 flags = 0, BOOL fullscreen = FALSE, BOOL clearBg = FALSE, - BOOL disable_vsync = TRUE, + const S32 vsync_mode = 0, BOOL use_gl = TRUE, BOOL ignore_pixel_depth = FALSE, U32 fsaa_samples = 0); diff --git a/indra/llwindow/llwindowheadless.cpp b/indra/llwindow/llwindowheadless.cpp index dbdb40f5b..d07521cf2 100644 --- a/indra/llwindow/llwindowheadless.cpp +++ b/indra/llwindow/llwindowheadless.cpp @@ -35,7 +35,7 @@ // LLWindowHeadless::LLWindowHeadless(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clear_background, - BOOL disable_vsync, BOOL ignore_pixel_depth) + const S32 vsync_mode, BOOL ignore_pixel_depth) : LLWindow(callbacks, fullscreen, flags) { // Initialize a headless keyboard. diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index 72f9684ca..491f9afd2 100644 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -48,7 +48,7 @@ public: /*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;}; /*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;}; /*virtual*/ BOOL setSizeImpl(LLCoordWindow size) {return FALSE;}; - /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;}; + /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = NULL) {return FALSE;}; /*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;}; /*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;}; /*virtual*/ void showCursor() {}; @@ -69,6 +69,8 @@ public: /*virtual*/ BOOL setGamma(const F32 gamma) {return FALSE; }; // Set the gamma /*virtual*/ void setFSAASamples(const U32 fsaa_samples) { } /*virtual*/ U32 getFSAASamples() { return 0; } + /*virtual*/ void setVsyncMode(const S32 vsync_mode) {} + /*virtual*/ S32 getVsyncMode() { return 0; } /*virtual*/ BOOL restoreGamma() {return FALSE; }; // Restore original gamma table (before updating gamma) //virtual ESwapMethod getSwapMethod() { return mSwapMethod; } /*virtual*/ void gatherInput() {}; @@ -96,7 +98,7 @@ public: S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clear_background, - BOOL disable_vsync, BOOL ignore_pixel_depth); + const S32 vsync_mode, BOOL ignore_pixel_depth); virtual ~LLWindowHeadless(); private: diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 303a23959..91e4c00cf 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -210,7 +210,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clearBg, - BOOL disable_vsync, + const S32 vsync_mode, BOOL ignore_pixel_depth, U32 fsaa_samples) : LLWindow(NULL, fullscreen, flags) @@ -253,6 +253,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, mPreeditor = NULL; mRawKeyEvent = NULL; mFSAASamples = fsaa_samples; + mVsyncMode = vsync_mode; mForceRebuild = FALSE; // For reasons that aren't clear to me, LLTimers seem to be created in the "started" state. @@ -283,7 +284,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, gWindowImplementation = this; // Create the GL context and set it up for windowed or fullscreen, as appropriate. - if(createContext(x, y, width, height, 32, fullscreen, disable_vsync)) + if(createContext(x, y, width, height, 32, fullscreen, vsync_mode)) { if(mWindow != NULL) { @@ -323,7 +324,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks, stop_glerror(); } -BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync) +BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, const S32 vsync_mode) { OSStatus err; BOOL glNeedsInit = FALSE; @@ -780,7 +781,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits // Disable vertical sync for swap GLint frames_per_swap = 0; - if (disable_vsync) + if (vsync_mode != 1) { LL_DEBUGS("GLInit") << "Disabling vertical sync" << LL_ENDL; frames_per_swap = 0; @@ -816,7 +817,7 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits // changing fullscreen resolution, or switching between windowed and fullscreen mode. -BOOL LLWindowMacOSX::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp) +BOOL LLWindowMacOSX::switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp) { BOOL needsRebuild = FALSE; BOOL result = true; @@ -892,7 +893,7 @@ BOOL LLWindowMacOSX::switchContext(BOOL fullscreen, const LLCoordScreen &size, B { mForceRebuild = FALSE; destroyContext(); - result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, disable_vsync); + result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, vsync_mode); if (result) { if(mWindow != NULL) @@ -1341,6 +1342,16 @@ void LLWindowMacOSX::setFSAASamples(const U32 samples) mForceRebuild = TRUE; } +S32 LLWindowMacOSX::getVsyncMode() +{ + return mVsyncMode; +} +void LLWindowMacOSX::setVsyncMode(const S32 vsync_mode) +{ + mVsyncMode = vsync_mode; + mForceRebuild = TRUE; +} + BOOL LLWindowMacOSX::restoreGamma() { CGDisplayRestoreColorSyncSettings(); diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 3f75dc9ab..7f7181a58 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -60,7 +60,7 @@ public: /*virtual*/ BOOL setPosition(LLCoordScreen position); /*virtual*/ BOOL setSizeImpl(LLCoordScreen size); /*virtual*/ BOOL setSizeImpl(LLCoordWindow size); - /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL); + /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = NULL); /*virtual*/ BOOL setCursorPosition(LLCoordWindow position); /*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); /*virtual*/ void showCursor(); @@ -81,6 +81,8 @@ public: /*virtual*/ BOOL setGamma(const F32 gamma); // Set the gamma /*virtual*/ U32 getFSAASamples(); /*virtual*/ void setFSAASamples(const U32 fsaa_samples); + /*virtual*/ void setVsyncMode(const S32 vsync_mode); + /*virtual*/ S32 getVsyncMode(); /*virtual*/ BOOL restoreGamma(); // Restore original gamma table (before updating gamma) /*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; } /*virtual*/ void gatherInput(); @@ -124,7 +126,7 @@ public: protected: LLWindowMacOSX(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags, - BOOL fullscreen, BOOL clearBg, BOOL disable_vsync, + BOOL fullscreen, BOOL clearBg, const S32 vsync_mode, BOOL ignore_pixel_depth, U32 fsaa_samples); ~LLWindowMacOSX(); @@ -152,7 +154,7 @@ protected: // // create or re-create the GL context/window. Called from the constructor and switchContext(). - BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync); + BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, const S32 vsync_mode); void destroyContext(); void setupFailure(const std::string& text, const std::string& caption, U32 type); static pascal OSStatus staticEventHandler (EventHandlerCallRef myHandler, EventRef event, void* userData); @@ -201,6 +203,7 @@ protected: BOOL mMaximized; BOOL mMinimized; U32 mFSAASamples; + S32 mVsyncMode; BOOL mForceRebuild; S32 mDragOverrideCursor; diff --git a/indra/llwindow/llwindowmesaheadless.cpp b/indra/llwindow/llwindowmesaheadless.cpp index 2b668d3fc..095a7d17c 100644 --- a/indra/llwindow/llwindowmesaheadless.cpp +++ b/indra/llwindow/llwindowmesaheadless.cpp @@ -41,7 +41,7 @@ U16 *gMesaBuffer = NULL; LLWindowMesaHeadless::LLWindowMesaHeadless(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clearBg, - BOOL disable_vsync, BOOL ignore_pixel_depth) + const S32 vsync_mode, BOOL ignore_pixel_depth) : LLWindow(callbacks, fullscreen, flags) { llinfos << "MESA Init" << llendl; diff --git a/indra/llwindow/llwindowmesaheadless.h b/indra/llwindow/llwindowmesaheadless.h index c8d2bf282..438964dae 100644 --- a/indra/llwindow/llwindowmesaheadless.h +++ b/indra/llwindow/llwindowmesaheadless.h @@ -52,7 +52,7 @@ public: /*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;}; /*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;}; /*virtual*/ BOOL setSizeImpl(LLCoordWindow size) {return FALSE;}; - /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;}; + /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = NULL) {return FALSE;}; /*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;}; /*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;}; /*virtual*/ void showCursor() {}; @@ -74,6 +74,8 @@ public: /*virtual*/ BOOL restoreGamma() {return FALSE; }; // Restore original gamma table (before updating gamma) /*virtual*/ void setFSAASamples(const U32 fsaa_samples) { /* FSAA not supported yet on Mesa headless.*/ } /*virtual*/ U32 getFSAASamples() { return 0; } + /*virtual*/ void setVsyncMode(const S32 vsync_mode) {} + /*virtual*/ S32 getVsyncMode() { return 0; } //virtual ESwapMethod getSwapMethod() { return mSwapMethod; } /*virtual*/ void gatherInput() {}; /*virtual*/ void delayInputProcessing() {}; @@ -98,7 +100,7 @@ public: LLWindowMesaHeadless(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clearBg, - BOOL disable_vsync, BOOL ignore_pixel_depth); + const S32 vsync_mode, BOOL ignore_pixel_depth); ~LLWindowMesaHeadless(); private: diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 10bcf816a..923b29be7 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -192,7 +192,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, const std::string& title, S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clearBg, - BOOL disable_vsync, + const S32 vsync_mode, BOOL ignore_pixel_depth, U32 fsaa_samples) : LLWindow(callbacks, fullscreen, flags), Lock_Display(NULL), @@ -233,7 +233,7 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, mWindowTitle = title; // Create the GL context and set it up for windowed or fullscreen, as appropriate. - if(createContext(x, y, width, height, 32, fullscreen, disable_vsync)) + if(createContext(x, y, width, height, 32, fullscreen, vsync_mode)) { gGLManager.initGL(); @@ -373,7 +373,7 @@ static int x11_detect_VRAM_kb() } #endif // LL_X11 -BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync) +BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, const S32 vsync_mode) { //bool glneedsinit = false; @@ -721,6 +721,50 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B } #endif // LL_X11 +#if SDL_VERSION_ATLEAST(1,3,0) + // Disable vertical sync for swap + if (vsync_mode == 0) + { + LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL; + SDL_GL_SetSwapInterval(0); + } + else if(vsync_mode == -1) + { + LL_DEBUGS("Window") << "Enabling adaptive vertical sync" << LL_ENDL; + if(SDL_GL_SetSwapInterval(-1) == -1) + { + LL_DEBUGS("Window") << "Failed to enable adaptive vertical sync. Disabling vsync." << LL_ENDL; + SDL_GL_SetSwapInterval(0); + } + } + else + { + LL_DEBUGS("Window") << "Enabling vertical sync" << LL_ENDL; + SDL_GL_SetSwapInterval(1); + } +#else // SDL_VERSION_ATLEAST(1,3,0) +#ifdef SDL_GL_SWAP_CONTROL + if (vsync_mode == 0) + { + LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL; + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); + } + else if(vsync_mode == -1) + { + LL_DEBUGS("Window") << "Enabling adaptive vertical sync" << LL_ENDL; + if(SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, -1) == -1) + { + LL_DEBUGS("Window") << "Failed to enable adaptive vertical sync. Disabling vsync." << LL_ENDL; + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); + } + } + else + { + LL_DEBUGS("Window") << "Enabling vertical sync" << LL_ENDL; + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); + } +#endif // SDL_GL_SWAP_CONTROL +#endif // SDL_VERSION_ATLEAST(1,3,0) //make sure multisampling is disabled by default glDisable(GL_MULTISAMPLE_ARB); @@ -736,7 +780,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B // changing fullscreen resolution, or switching between windowed and fullscreen mode. -BOOL LLWindowSDL::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp) +BOOL LLWindowSDL::switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp) { const BOOL needsRebuild = TRUE; // Just nuke the context and start over. BOOL result = true; @@ -746,7 +790,7 @@ BOOL LLWindowSDL::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL if(needsRebuild) { destroyContext(); - result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, disable_vsync); + result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, vsync_mode); if (result) { gGLManager.initGL(); @@ -987,6 +1031,16 @@ void LLWindowSDL::setFSAASamples(const U32 samples) mFSAASamples = samples; } +S32 LLWindowSDL::getVsyncMode() +{ + return mVsyncMode; +} + +void LLWindowSDL::setVsyncMode(const S32 vsync_mode) +{ + mVsyncMode = vsync_mode; +} + F32 LLWindowSDL::getGamma() { return 1/mGamma; diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 134554e6e..3334fcb98 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -65,7 +65,7 @@ public: /*virtual*/ BOOL setPosition(LLCoordScreen position); /*virtual*/ BOOL setSizeImpl(LLCoordScreen size); /*virtual*/ BOOL setSizeImpl(LLCoordWindow size); - /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL); + /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = NULL); /*virtual*/ BOOL setCursorPosition(LLCoordWindow position); /*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); /*virtual*/ void showCursor(); @@ -92,6 +92,8 @@ public: /*virtual*/ BOOL setGamma(const F32 gamma); // Set the gamma /*virtual*/ U32 getFSAASamples(); /*virtual*/ void setFSAASamples(const U32 samples); + /*virtual*/ void setVsyncMode(const S32 vsync_mode); + /*virtual*/ S32 getVsyncMode(); /*virtual*/ BOOL restoreGamma(); // Restore original gamma table (before updating gamma) /*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; } /*virtual*/ void processMiscNativeEvents(); @@ -149,7 +151,7 @@ public: protected: LLWindowSDL(LLWindowCallbacks* callbacks, const std::string& title, int x, int y, int width, int height, U32 flags, - BOOL fullscreen, BOOL clearBg, BOOL disable_vsync, + BOOL fullscreen, BOOL clearBg, const S32 vsync_mode, BOOL ignore_pixel_depth, U32 fsaa_samples); ~LLWindowSDL(); @@ -174,7 +176,7 @@ protected: // // create or re-create the GL context/window. Called from the constructor and switchContext(). - BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync); + BOOL createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, const S32 vsync_mode); void destroyContext(); void setupFailure(const std::string& text, const std::string& caption, U32 type); void fixWindowSize(void); @@ -194,6 +196,7 @@ protected: F32 mOverrideAspectRatio; F32 mGamma; U32 mFSAASamples; + S32 mVsyncMode; int mSDLFlags; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 807c547bd..8e6b4c57c 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -363,7 +363,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, S32 x, S32 y, S32 width, S32 height, U32 flags, BOOL fullscreen, BOOL clearBg, - BOOL disable_vsync, + const S32 vsync_mode, BOOL ignore_pixel_depth, U32 fsaa_samples) : LLWindow(callbacks, fullscreen, flags) @@ -903,7 +903,7 @@ BOOL LLWindowWin32::setSizeImpl(const LLCoordWindow size) } // changing fullscreen resolution -BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp) +BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp) { GLuint pixel_format; DEVMODE dev_mode; @@ -1650,14 +1650,27 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO } // Disable vertical sync for swap - if (disable_vsync && wglSwapIntervalEXT) + if(wglSwapIntervalEXT) { - LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL; - wglSwapIntervalEXT(0); - } - else - { - LL_DEBUGS("Window") << "Keeping vertical sync" << LL_ENDL; + if (vsync_mode == 0) + { + LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL; + wglSwapIntervalEXT(0); + } + else if(vsync_mode == -1) + { + LL_DEBUGS("Window") << "Enabling adaptive vertical sync" << LL_ENDL; + if(wglSwapIntervalEXT(-1) == 0) + { + LL_DEBUGS("Window") << "Failed to enable adaptive vertical sync. Disabling vsync." << LL_ENDL; + wglSwapIntervalEXT(0); + } + } + else + { + LL_DEBUGS("Window") << "Enabling vertical sync" << LL_ENDL; + wglSwapIntervalEXT(1); + } } SetWindowLongPtr(mWindowHandle, GWLP_USERDATA, (LONG_PTR)this); @@ -3030,6 +3043,16 @@ U32 LLWindowWin32::getFSAASamples() return mFSAASamples; } +S32 LLWindowWin32::getVsyncMode() +{ + return mVsyncMode; +} + +void LLWindowWin32::setVsyncMode(const S32 vsync_mode) +{ + mVsyncMode = vsync_mode; +} + LLWindow::LLWindowResolution* LLWindowWin32::getSupportedResolutions(S32 &num_resolutions) { if (!mSupportedResolutions) diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 9f678b96c..07dc67c20 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -59,7 +59,7 @@ public: /*virtual*/ BOOL setPosition(LLCoordScreen position); /*virtual*/ BOOL setSizeImpl(LLCoordScreen size); /*virtual*/ BOOL setSizeImpl(LLCoordWindow size); - /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL); + /*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, const S32 vsync_mode, const LLCoordScreen * const posp = NULL); /*virtual*/ BOOL setCursorPosition(LLCoordWindow position); /*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); /*virtual*/ void showCursor(); @@ -80,6 +80,8 @@ public: /*virtual*/ BOOL setGamma(const F32 gamma); // Set the gamma /*virtual*/ void setFSAASamples(const U32 fsaa_samples); /*virtual*/ U32 getFSAASamples(); + /*virtual*/ void setVsyncMode(const S32 vsync_mode); + /*virtual*/ S32 getVsyncMode(); /*virtual*/ BOOL restoreGamma(); // Restore original gamma table (before updating gamma) /*virtual*/ ESwapMethod getSwapMethod() { return mSwapMethod; } /*virtual*/ void gatherInput(); @@ -121,7 +123,7 @@ public: protected: LLWindowWin32(LLWindowCallbacks* callbacks, const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags, - BOOL fullscreen, BOOL clearBg, BOOL disable_vsync, + BOOL fullscreen, BOOL clearBg, const S32 vsync_mode, BOOL ignore_pixel_depth, U32 fsaa_samples); ~LLWindowWin32(); @@ -186,6 +188,7 @@ protected: F32 mCurrentGamma; U32 mFSAASamples; + S32 mVsyncMode; WORD mPrevGammaRamp[256*3]; WORD mCurrentGammaRamp[256*3]; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index fbcc7c4d4..7cdff9888 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1140,7 +1140,7 @@ if (DARWIN) # Add resource files to the project. set(viewer_RESOURCE_FILES - ${VIEWER_BRANDING_ID}.icns + ${VIEWER_BRANDING_ID}_icon.icns macview.r gpu_table.txt SecondLife.nib/ @@ -1518,7 +1518,7 @@ if (WINDOWS) COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --arch=${ARCH} + --arch=${ARCH} --artwork=${ARTWORK_DIR} --branding_id=${VIEWER_BRANDING_ID} --build=${CMAKE_CURRENT_BINARY_DIR} @@ -1540,7 +1540,7 @@ if (WINDOWS) COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --arch=${ARCH} + --arch=${ARCH} --artwork=${ARTWORK_DIR} --actions=copy --branding_id=${VIEWER_BRANDING_ID} @@ -1702,7 +1702,7 @@ if (DARWIN) PROPERTIES OUTPUT_NAME "${product}" MACOSX_BUNDLE_INFO_STRING "A stable third-party Second Life viewer." - MACOSX_BUNDLE_ICON_FILE "${VIEWER_BRANDING_ID}.icns" + MACOSX_BUNDLE_ICON_FILE "${VIEWER_BRANDING_ID}_icon.icns" MACOSX_BUNDLE_GUI_IDENTIFIER "${VIEWER_BRANDING_NAME}" MACOSX_BUNDLE_LONG_VERSION_STRING "${viewer_VERSION}" MACOSX_BUNDLE_BUNDLE_NAME "${VIEWER_BRANDING_NAME}" diff --git a/indra/newview/aihttpview.cpp b/indra/newview/aihttpview.cpp index 3bc6b18f7..d3de57171 100644 --- a/indra/newview/aihttpview.cpp +++ b/indra/newview/aihttpview.cpp @@ -310,16 +310,12 @@ U32 AIHTTPView::updateColumn(U32 col, U32 start) return mStartColumn[col]; } -//static -void AIHTTPView::toggle_visibility(void* user_data) +// virtual +void AIHTTPView::setVisible(BOOL visible) { - LLView* viewp = (LLView*)user_data; - bool visible = !viewp->getVisible(); - if (visible) - { - AIPerService::resetUsed(); - } - viewp->setVisible(visible); + if (visible && visible != getVisible()) + AIPerService::resetUsed(); + LLContainerView::setVisible(visible); } U64 AIHTTPView::sTime_40ms; diff --git a/indra/newview/aihttpview.h b/indra/newview/aihttpview.h index 3fb80ea03..e9a749afd 100644 --- a/indra/newview/aihttpview.h +++ b/indra/newview/aihttpview.h @@ -49,6 +49,7 @@ class AIHTTPView : public LLContainerView ~AIHTTPView(); /*virtual*/ void draw(void); + /*virtual*/ void setVisible(BOOL visible); /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); @@ -66,7 +67,6 @@ class AIHTTPView : public LLContainerView public: static U64 getTime_40ms(void) { return sTime_40ms; } - static void toggle_visibility(void* user_data); }; extern AIHTTPView *gHttpView; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 61597128a..db797127e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -573,7 +573,7 @@ CheckForGridUpdates Comment - Fetch list of grids from Hippo server + Fetch list of grids from location set in GridUpdateList Persist 1 Type @@ -592,6 +592,17 @@ Value Second Life + GridUpdateList + + Comment + URL to fetch Grid updates from + Persist + 1 + Type + String + Value + + VivoxLicenseAccepted @@ -757,17 +768,6 @@ Value 1 - LiruLegacySpeakerNames - - Comment - Whether all lists of speakers use legacy names, or your desired way of displaying names. - Persist - 1 - Type - Boolean - Value - 0 - LiruLocalTime Comment @@ -1017,6 +1017,17 @@ Found in Advanced->Rendering->Info Displays Value 1 + LocalBitmapUpdate + + Comment + Default setting for whether local textures should update or not upon change, changed by toggling on or off. + Persist + 1 + Type + Boolean + Value + 0 + InstantMessageLogPathAnyAccount Comment @@ -8477,7 +8488,7 @@ This should be as low as possible, but too low may break functionality Type Boolean Value - 0 + 1 ForceMandatoryUpdate diff --git a/indra/newview/app_settings/settings_ascent.xml b/indra/newview/app_settings/settings_ascent.xml index bc4537109..caab652cf 100644 --- a/indra/newview/app_settings/settings_ascent.xml +++ b/indra/newview/app_settings/settings_ascent.xml @@ -25,10 +25,43 @@ Value 0 + FriendNameSystem + + Comment + For friends list names. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only, 3 = Old Style (Display Name) + Persist + 1 + Type + S32 + Value + 1 + + GroupMembersNameSystem + + Comment + For lists of group members names. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only, 3 = Old Style (Display Name) + Persist + 1 + Type + S32 + Value + 1 + + LandManagementNameSystem + + Comment + For names land management lists. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only, 3 = Old Style (Display Name) + Persist + 1 + Type + S32 + Value + 1 + PhoenixNameSystem Comment - Use Display Names instead of Legacy Names. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only + For general purpose names in the viewer. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only, 3 = Old Style (Display Name) Persist 2 Type @@ -36,6 +69,28 @@ Value 1 + RadarNameSystem + + Comment + For names in the radar. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only, 3 = Old Style (Display Name) + Persist + 1 + Type + S32 + Value + 1 + + SpeakerNameSystem + + Comment + For names in lists of speakers. 0 = Old Style, 1 = Display Names and Username, 2 = Displayname only, 3 = Old Style (Display Name) + Persist + 1 + Type + S32 + Value + 1 + AscentPowerfulWizard Comment @@ -741,5 +796,990 @@ Value pages/login/ + + ToolbarVisibleAbout + + Comment + Whether or not the button for about is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAboutLand + + Comment + Whether or not the button for about land is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAboutRegion + + Comment + Whether or not the button for region/estate is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleActiveSpeakers + + Comment + Whether or not the button for active speakers is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAlwaysRun + + Comment + Whether or not the button for run is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAnimsExplorer + + Comment + Whether or not the button for anims explorer is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAO + + Comment + Whether or not the button for the AO Floater is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAppearance + + Comment + Whether or not the button for appearance is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAreaSearch + + Comment + Whether or not the button for areasearch is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleAssetBlacklist + + Comment + Whether or not the button for asset blacklist is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleBeacons + + Comment + Whether or not the button for beacons is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleBuild + + Comment + Whether or not the button for build is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleBuyCurrency + + Comment + Whether or not the button for buy currency is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleBuyLand + + Comment + Whether or not the button for buy land is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleCameraControls + + Comment + Whether or not the button for camera controls is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleChatbar + + Comment + Whether or not the button for toggling the chatbar is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleChatHistory + + Comment + Whether or not the button for local chat history is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleCommunicate + + Comment + Whether or not the button for communicate floater is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleCommunicateIM + + Comment + Whether or not the flyout button for communicate is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleComplaintReporter + + Comment + Whether or not the button for abuse report is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleDayCycle + + Comment + Whether or not the button for day cycle editor is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleDebugAvatar + + Comment + Whether or not the button for debug avatar textures is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleDebugConsole + + Comment + Whether or not the button for the debug console is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleDebugSettings + + Comment + Whether or not the button for debug settings is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleDisplayName + + Comment + Whether or not the button for display name is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleEditUI + + Comment + Whether or not the button for edit ui is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleEnvSettings + + Comment + Whether or not the button for the environment settings editor is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleFastTimers + + Comment + Whether or not the button for fast timers is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleFly + + Comment + Whether or not the button for fly is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleFontTest + + Comment + Whether or not the button for font test is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleFrameConsole + + Comment + Whether or not the button for the frame console is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleFriends + + Comment + Whether or not the button for friends is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleGestures + + Comment + Whether or not the button for gestures is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleGodTools + + Comment + Whether or not the button for god tools is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleGridOptions + + Comment + Whether or not the button for grid options for the build tools is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleGroups + + Comment + Whether or not the button for groups is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleGroupTitles + + Comment + Whether or not the button for group titles is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + + ToolbarVisibleHelpTutorial + + Comment + Whether or not the button for the tutorial is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleHTTPConsole + + Comment + Whether or not the button for the http console is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleInspect + + Comment + Whether or not the button for inspect is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleInventory + + Comment + Whether or not the button for inventory is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleInventoryFavs + + Comment + Whether or not the button for favorites is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleInventoryOutfits + + Comment + Whether or not the button for outfits is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleLagMeter + + Comment + Whether or not the button for lag meter is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleLocalAssets + + Comment + Whether or not the button for local textures is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMeanEvents + + Comment + Whether or not the button for bumps, pushes, and hits is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMediaFilter + + Comment + Whether or not the button for media filter is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMediaTicker + + Comment + Whether or not the button for the streaming audio display is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMemLeak + + Comment + Whether or not the button for memory leak is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMessageLog + + Comment + Whether or not the button for message log is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMiniMap + + Comment + Whether or not the button for the mini-map is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleMouselook + + Comment + Whether or not the button for mouselook is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMovementControls + + Comment + Whether or not the button for movement controls is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMuteList + + Comment + Whether or not the button for mute list is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleMyLand + + Comment + Whether or not the button for my land is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleOutbox + + Comment + Whether or not the button for outbox is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleNotificationsConsole + + Comment + Whether or not the button for the notifications console is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleOutbox + + Comment + Whether or not the button for the merchant outbox is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleOutfit + + Comment + Whether or not the button for make outfit is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisiblePathfindingCharacters + + Comment + Whether or not the button for pathfinding characters is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisiblePathfindingLinksets + + Comment + Whether or not the button for pathfinding linksets is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisiblePermPrefs + + Comment + Whether or not the button for default upload permissions is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisiblePostProcess + + Comment + Whether or not the button for post-processing effects is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisiblePreferences + + Comment + Whether or not the button for preferences is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleRadar + + Comment + Whether or not the button for the radar is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleRegionDebugConsole + + Comment + Whether or not the button for the region debug console is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleScriptErrors + + Comment + Whether or not the button for script errors is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleScriptInfo + + Comment + Whether or not the button for script info is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleSearch + + Comment + Whether or not the button for search is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleSit + + Comment + Whether or not the button for sit is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleSnapshot + + Comment + Whether or not the button for snapshot is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + ToolbarVisibleSoundExplorer + + Comment + Whether or not the button for the sound explorer is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleStatBar + + Comment + Whether or not the button for the statistics bar is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleTeleportHistory + + Comment + Whether or not the button for teleport history is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleTest + + Comment + Whether or not the button for the test floater is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleTextureCategoryConsole + + Comment + Whether or not the button for the texture category console is on the toolbar (requires a relog with AuditTexture true for the button to work) + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleTextureConsole + + Comment + Whether or not the button for the texture console is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleTextureSizeConsole + + Comment + Whether or not the button for the texture size console is on the toolbar (requires a relog with AuditTexture true for the button to work) + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleToolbarPrefs + + Comment + Whether or not the button for the floater to change buttons on the toolbar is on the toolbar (Nonfunctional, yet. Poke Liru.) + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleVelocity + + Comment + Whether or not the button for velocity is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleVoiceEffect + + Comment + Whether or not the button for voice effects is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleWaterSettings + + Comment + Whether or not the button for the water editor is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleWeb + + Comment + Whether or not the button for the web browser is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleWindlight + + Comment + Whether or not the button for the windlight editor is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleWorldMap + + Comment + Whether or not the button for the world map is on the toolbar + Persist + 1 + Type + Boolean + Value + 1 + + + ToolbarVisibleRLVLocks + + Comment + Whether or not the button for RLVa Locks is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleRLVRestrictions + + Comment + Whether or not the button for RLVa Restrictions is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + ToolbarVisibleRLVStrings + + Comment + Whether or not the button for RLVa Strings is on the toolbar + Persist + 1 + Type + Boolean + Value + 0 + + diff --git a/indra/newview/app_settings/settings_sh.xml b/indra/newview/app_settings/settings_sh.xml index 83731c3ec..c06a6f710 100644 --- a/indra/newview/app_settings/settings_sh.xml +++ b/indra/newview/app_settings/settings_sh.xml @@ -251,5 +251,16 @@ Value 1 + SHRenderVsyncMode + + Comment + Desired vertical sychronization method. (0 = Disabled, 1 = Standard [Double-buffered], -1 = Adaptive [if supported]) + Persist + 1 + Type + S32 + Value + 0 + diff --git a/indra/newview/ascentprefschat.cpp b/indra/newview/ascentprefschat.cpp index d504a38fa..57a5dd60e 100644 --- a/indra/newview/ascentprefschat.cpp +++ b/indra/newview/ascentprefschat.cpp @@ -298,7 +298,11 @@ void LLPrefsAscentChat::refreshValues() mOnlyComm = gSavedSettings.getBOOL("CommunicateSpecificShortcut"); mItalicizeActions = gSavedSettings.getBOOL("LiruItalicizeActions"); mLegacyLogLaunch = gSavedSettings.getBOOL("LiruLegacyLogLaunch"); - mLegacySpeakerNames = gSavedSettings.getBOOL("LiruLegacySpeakerNames"); + mFriendNames = gSavedSettings.getS32("FriendNameSystem"); + mGroupMembersNames = gSavedSettings.getS32("GroupMembersNameSystem"); + mLandManagementNames = gSavedSettings.getS32("LandManagementNameSystem"); + mRadarNames = gSavedSettings.getS32("RadarNameSystem"); + mSpeakerNames = gSavedSettings.getS32("SpeakerNameSystem"); //Autoresponse ------------------------------------------------------------------------ mIMResponseAnyoneItemID = gSavedPerAccountSettings.getString("AutoresponseAnyoneItemID"); @@ -376,6 +380,18 @@ void LLPrefsAscentChat::refresh() combo->setCurrentByIndex(mDateFormat); } + //Chat UI ----------------------------------------------------------------------------- + if (combo = getChild("friends_namesystem_combobox")) + combo->setCurrentByIndex(mFriendNames); + if (combo = getChild("group_members_namesystem_combobox")) + combo->setCurrentByIndex(mGroupMembersNames); + if (combo = getChild("land_management_namesystem_combobox")) + combo->setCurrentByIndex(mLandManagementNames); + if (combo = getChild("radar_namesystem_combobox")) + combo->setCurrentByIndex(mRadarNames); + if (combo = getChild("speaker_namesystem_combobox")) + combo->setCurrentByIndex(mSpeakerNames); + //Antispam ------------------------------------------------------------------------ // sensitivity tuners childSetEnabled("spammsg_checkbox", mEnableAS); @@ -537,7 +553,11 @@ void LLPrefsAscentChat::cancel() gSavedSettings.setBOOL("CommunicateSpecificShortcut", mOnlyComm); gSavedSettings.setBOOL("LiruItalicizeActions", mItalicizeActions); gSavedSettings.setBOOL("LiruLegacyLogLaunch", mLegacyLogLaunch); - gSavedSettings.setBOOL("LiruLegacySpeakerNames", mLegacySpeakerNames); + gSavedSettings.setS32("FriendNameSystem", mFriendNames); + gSavedSettings.setS32("GroupMembersNameSystem", mGroupMembersNames); + gSavedSettings.setS32("LandManagementNameSystem", mLandManagementNames); + gSavedSettings.setS32("RadarNameSystem", mRadarNames); + gSavedSettings.setS32("SpeakerNameSystem", mSpeakerNames); //Autoresponse ------------------------------------------------------------------------ gSavedPerAccountSettings.setString("AutoresponseAnyoneItemID", mIMResponseAnyoneItemID); diff --git a/indra/newview/ascentprefschat.h b/indra/newview/ascentprefschat.h index 5b235dafa..d3f324a60 100644 --- a/indra/newview/ascentprefschat.h +++ b/indra/newview/ascentprefschat.h @@ -87,8 +87,12 @@ private: bool mOneLineConfButt; bool mOnlyComm; bool mItalicizeActions; - bool mLegacySpeakerNames; bool mLegacyLogLaunch; + S32 mFriendNames; + S32 mGroupMembersNames; + S32 mLandManagementNames; + S32 mRadarNames; + S32 mSpeakerNames; //Autoresponse ------------------------------------------------------------------------ std::string mIMResponseAnyoneItemID; diff --git a/indra/newview/floaterlocalassetbrowse.cpp b/indra/newview/floaterlocalassetbrowse.cpp index abcb19c98..a3af2928d 100644 --- a/indra/newview/floaterlocalassetbrowse.cpp +++ b/indra/newview/floaterlocalassetbrowse.cpp @@ -72,6 +72,8 @@ this feature is still a work in progress. #include "llvovolume.h" #include "llface.h" +/* static pointer to self, wai? oh well. */ +static FloaterLocalAssetBrowser* sLFInstance = NULL; /*=======================================*/ /* Instantiating manager class */ @@ -79,7 +81,7 @@ this feature is still a work in progress. /*=======================================*/ LocalAssetBrowser* gLocalBrowser; LocalAssetBrowserTimer* gLocalBrowserTimer; -std::vector LocalAssetBrowser::loaded_bitmaps; +std::vector LocalAssetBrowser::loaded_bitmaps; bool LocalAssetBrowser::mLayerUpdated; bool LocalAssetBrowser::mSculptUpdated; @@ -93,54 +95,54 @@ bool LocalAssetBrowser::mSculptUpdated; LocalBitmap::LocalBitmap(std::string fullpath) { - this->valid = false; + valid = false; if ( gDirUtilp->fileExists(fullpath) ) { /* taking care of basic properties */ - this->id.generate(); - this->filename = fullpath; - this->linkstatus = LINK_OFF; - this->keep_updating = false; - this->shortname = gDirUtilp->getBaseFileName(this->filename, true); - this->bitmap_type = TYPE_TEXTURE; - this->sculpt_dirty = false; - this->volume_dirty = false; - this->valid = false; + id.generate(); + filename = fullpath; + keep_updating = gSavedSettings.getBOOL("LocalBitmapUpdate"); + linkstatus = keep_updating ? LINK_ON : LINK_OFF; + shortname = gDirUtilp->getBaseFileName(filename, true); + bitmap_type = TYPE_TEXTURE; + sculpt_dirty = false; + volume_dirty = false; + valid = false; /* taking care of extension type now to avoid switch madness */ - std::string temp_exten = gDirUtilp->getExtension(this->filename); + std::string temp_exten = gDirUtilp->getExtension(filename); - if (temp_exten == "bmp") { this->extension = IMG_EXTEN_BMP; } - else if (temp_exten == "tga") { this->extension = IMG_EXTEN_TGA; } - else if (temp_exten == "jpg" || temp_exten == "jpeg") { this->extension = IMG_EXTEN_JPG; } - else if (temp_exten == "png") { this->extension = IMG_EXTEN_PNG; } - else { return; } // no valid extension. + if (temp_exten == "bmp") extension = IMG_EXTEN_BMP; + else if (temp_exten == "tga") extension = IMG_EXTEN_TGA; + else if (temp_exten == "jpg" || temp_exten == "jpeg") extension = IMG_EXTEN_JPG; + else if (temp_exten == "png") extension = IMG_EXTEN_PNG; + else return; // no valid extension. /* getting file's last modified */ llstat temp_stat; - LLFile::stat(this->filename, &temp_stat); + LLFile::stat(filename, &temp_stat); std::time_t time = temp_stat.st_mtime; - this->last_modified = asctime( localtime(&time) ); + last_modified = asctime( localtime(&time) ); /* checking if the bitmap is valid && decoding if it is */ - LLImageRaw* raw_image = new LLImageRaw(); - if ( this->decodeSelf(raw_image) ) + LLPointer raw_image = new LLImageRaw; + if (decodeSelf(raw_image)) { /* creating a shell LLViewerTexture and fusing raw image into it */ - LLViewerFetchedTexture* viewer_image = new LLViewerFetchedTexture( "file://"+this->filename, this->id, LOCAL_USE_MIPMAPS ); + LLViewerFetchedTexture* viewer_image = new LLViewerFetchedTexture( "file://"+filename, id, LOCAL_USE_MIPMAPS ); viewer_image->createGLTexture( LOCAL_DISCARD_LEVEL, raw_image ); viewer_image->setCachedRawImage(-1,raw_image); /* making damn sure gTextureList will not delete it prematurely */ - viewer_image->ref(); + viewer_image->ref(); /* finalizing by adding LLViewerTexture instance into gTextureList */ gTextureList.addImage(viewer_image); /* filename is valid, bitmap is decoded and valid, i can haz liftoff! */ - this->valid = true; + valid = true; } } } @@ -152,60 +154,64 @@ LocalBitmap::~LocalBitmap() /* [maintenence functions] */ void LocalBitmap::updateSelf() { - if ( this->linkstatus == LINK_ON || this->linkstatus == LINK_UPDATING ) + if (linkstatus == LINK_ON || linkstatus == LINK_UPDATING) { /* making sure file still exists */ - if ( !gDirUtilp->fileExists(this->filename) ) { this->linkstatus = LINK_BROKEN; return; } + if (!gDirUtilp->fileExists(filename)) + { + linkstatus = LINK_BROKEN; + return; + } /* exists, let's check if it's lastmod has changed */ llstat temp_stat; - LLFile::stat(this->filename, &temp_stat); + LLFile::stat(filename, &temp_stat); std::time_t temp_time = temp_stat.st_mtime; LLSD new_last_modified = asctime( localtime(&temp_time) ); - if ( this->last_modified.asString() == new_last_modified.asString() ) { return; } + if (last_modified.asString() == new_last_modified.asString()) return; /* here we update the image */ - LLImageRaw* new_imgraw = new LLImageRaw(); - - if ( !decodeSelf(new_imgraw) ) { this->linkstatus = LINK_UPDATING; return; } - else { this->linkstatus = LINK_ON; } - - LLViewerFetchedTexture* image = gTextureList.findImage(this->id); - - if (!image->forSculpt()) - { image->createGLTexture( LOCAL_DISCARD_LEVEL, new_imgraw ); } + LLPointer new_imgraw = new LLImageRaw; + if (!decodeSelf(new_imgraw)) + { + linkstatus = LINK_UPDATING; + return; + } else - { image->setCachedRawImage(-1,new_imgraw); } + { + linkstatus = LINK_ON; + } + + LLViewerFetchedTexture* image = gTextureList.findImage(id); + if (!image->forSculpt()) + image->createGLTexture(LOCAL_DISCARD_LEVEL, new_imgraw); + else + image->setCachedRawImage(-1,new_imgraw); /* finalizing by updating lastmod to current */ - this->last_modified = new_last_modified; + last_modified = new_last_modified; /* setting unit property to reflect that it has been changed */ - switch (this->bitmap_type) + switch (bitmap_type) { - case TYPE_TEXTURE: - { break; } - case TYPE_SCULPT: - { - /* sets a bool to run through all visible sculpts in one go, and update the ones necessary. */ - this->sculpt_dirty = true; - this->volume_dirty = true; - gLocalBrowser->setSculptUpdated( true ); - break; - } - + { + /* sets a bool to run through all visible sculpts in one go, and update the ones necessary. */ + sculpt_dirty = true; + volume_dirty = true; + gLocalBrowser->setSculptUpdated( true ); + break; + } case TYPE_LAYER: - { - /* sets a bool to rebake layers after the iteration is done with */ - gLocalBrowser->setLayerUpdated( true ); - break; - } - + { + /* sets a bool to rebake layers after the iteration is done with */ + gLocalBrowser->setLayerUpdated( true ); + break; + } + case TYPE_TEXTURE: default: - { break; } - + break; } } @@ -213,51 +219,47 @@ void LocalBitmap::updateSelf() bool LocalBitmap::decodeSelf(LLImageRaw* rawimg) { - switch (this->extension) + switch (extension) { case IMG_EXTEN_BMP: - { - LLPointer bmp_image = new LLImageBMP; - if ( !bmp_image->load(filename) ) { break; } - if ( !bmp_image->decode(rawimg, 0.0f) ) { break; } - - rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); - return true; - } + { + LLPointer bmp_image = new LLImageBMP; + if (!bmp_image->load(filename)) break; + if (!bmp_image->decode(rawimg, 0.0f)) break; + rawimg->biasedScaleToPowerOfTwo(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT); + return true; + } case IMG_EXTEN_TGA: - { - LLPointer tga_image = new LLImageTGA; - if ( !tga_image->load(filename) ) { break; } - if ( !tga_image->decode(rawimg) ) { break; } - - if( ( tga_image->getComponents() != 3) && - ( tga_image->getComponents() != 4) ) { break; } - - rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); - return true; - } + { + LLPointer tga_image = new LLImageTGA; + if (!tga_image->load(filename)) break; + if (!tga_image->decode(rawimg)) break; + if (( tga_image->getComponents() != 3) && + ( tga_image->getComponents() != 4) ) + break; + rawimg->biasedScaleToPowerOfTwo(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT); + return true; + } case IMG_EXTEN_JPG: - { - LLPointer jpeg_image = new LLImageJPEG; - if ( !jpeg_image->load(filename) ) { break; } - if ( !jpeg_image->decode(rawimg, 0.0f) ) { break; } - - rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); - return true; - } + { + LLPointer jpeg_image = new LLImageJPEG; + if (!jpeg_image->load(filename)) break; + if (!jpeg_image->decode(rawimg, 0.0f)) break; + rawimg->biasedScaleToPowerOfTwo(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT); + return true; + } case IMG_EXTEN_PNG: - { - LLPointer png_image = new LLImagePNG; - if ( !png_image->load(filename) ) { break; } - if ( !png_image->decode(rawimg, 0.0f) ) { break; } - - rawimg->biasedScaleToPowerOfTwo( LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT ); - return true; - } + { + LLPointer png_image = new LLImagePNG; + if ( !png_image->load(filename) ) break; + if ( !png_image->decode(rawimg, 0.0f) ) break; + rawimg->biasedScaleToPowerOfTwo(LLViewerTexture::MAX_IMAGE_SIZE_DEFAULT); + return true; + } default: break; } @@ -266,54 +268,55 @@ bool LocalBitmap::decodeSelf(LLImageRaw* rawimg) void LocalBitmap::setUpdateBool() { - if ( this->linkstatus != LINK_BROKEN ) + if (linkstatus != LINK_BROKEN) { - if ( !this->keep_updating ) + if (!keep_updating) { - this->linkstatus = LINK_ON; - this->keep_updating = true; + linkstatus = LINK_ON; + keep_updating = true; } else { - this->linkstatus = LINK_OFF; - this->keep_updating = false; + linkstatus = LINK_OFF; + keep_updating = false; } } else { - this->keep_updating = false; + keep_updating = false; } + gSavedSettings.setBOOL("LocalBitmapUpdate", keep_updating); } void LocalBitmap::setType( S32 type ) { - this->bitmap_type = type; + bitmap_type = type; } /* [information query functions] */ std::string LocalBitmap::getShortName() { - return this->shortname; + return shortname; } std::string LocalBitmap::getFileName() { - return this->filename; + return filename; } LLUUID LocalBitmap::getID() { - return this->id; + return id; } LLSD LocalBitmap::getLastModified() { - return this->last_modified; + return last_modified; } std::string LocalBitmap::getLinkStatus() { - switch(this->linkstatus) + switch(linkstatus) { case LINK_ON: return "On"; @@ -334,22 +337,17 @@ std::string LocalBitmap::getLinkStatus() bool LocalBitmap::getUpdateBool() { - return this->keep_updating; + return keep_updating; } bool LocalBitmap::getIfValidBool() { - return this->valid; -} - -LocalBitmap* LocalBitmap::getThis() -{ - return this; + return valid; } S32 LocalBitmap::getType() { - return this->bitmap_type; + return bitmap_type; } std::vector LocalBitmap::getFaceUsesThis(LLDrawable* drawable) @@ -360,8 +358,8 @@ std::vector LocalBitmap::getFaceUsesThis(LLDrawable* drawable) { LLFace* newface = drawable->getFace(face_iter); - if ( this->id == newface->getTexture()->getID() ) - { matching_faces.push_back(newface); } + if (id == newface->getTexture()->getID()) + matching_faces.push_back(newface); } return matching_faces; @@ -389,10 +387,10 @@ std::vector LocalBitmap::getUsingObjects(bool seek_by_type, boo if ( obj && obj->mDrawable ) { /* looking for textures */ - if ( seek_textures || ( seek_by_type && this->bitmap_type == TYPE_TEXTURE ) ) + if (seek_textures || (seek_by_type && bitmap_type == TYPE_TEXTURE)) { - std::vector affected_faces = this->getFaceUsesThis( obj->mDrawable ); - if ( !affected_faces.empty() ) + std::vector affected_faces = getFaceUsesThis(obj->mDrawable); + if (!affected_faces.empty()) { shell.face_list = affected_faces; obj_relevant = true; @@ -400,22 +398,18 @@ std::vector LocalBitmap::getUsingObjects(bool seek_by_type, boo } /* looking for sculptmaps */ - if ( ( seek_sculptmaps || ( seek_by_type && this->bitmap_type == TYPE_SCULPT ) ) - && obj->isSculpted() && obj->getVolume() - && this->id == obj->getVolume()->getParams().getSculptID() - ) + if ((seek_sculptmaps || (seek_by_type && bitmap_type == TYPE_SCULPT)) + && obj->isSculpted() && obj->getVolume() + && id == obj->getVolume()->getParams().getSculptID()) { shell.local_sculptmap = true; obj_relevant = true; } } - if (obj_relevant) - { affected_vector.push_back(shell); } + if (obj_relevant) affected_vector.push_back(shell); } - - return affected_vector; } @@ -423,15 +417,15 @@ void LocalBitmap::getDebugInfo() { /* debug function: dumps everything human readable into llinfos */ llinfos << "===[local bitmap debug]===" << "\n" - << "path: " << this->filename << "\n" - << "name: " << this->shortname << "\n" - << "extension: " << this->extension << "\n" - << "uuid: " << this->id << "\n" - << "last modified: " << this->last_modified << "\n" - << "link status: " << this->getLinkStatus() << "\n" - << "keep updated: " << this->keep_updating << "\n" - << "type: " << this->bitmap_type << "\n" - << "is valid: " << this->valid << "\n" + << "path: " << filename << "\n" + << "name: " << shortname << "\n" + << "extension: " << extension << "\n" + << "uuid: " << id << "\n" + << "last modified: " << last_modified << "\n" + << "link status: " << getLinkStatus() << "\n" + << "keep updated: " << keep_updating << "\n" + << "type: " << bitmap_type << "\n" + << "is valid: " << valid << "\n" << "==========================" << llendl; } @@ -447,8 +441,8 @@ void LocalBitmap::getDebugInfo() LocalAssetBrowser::LocalAssetBrowser() { - this->mLayerUpdated = false; - this->mSculptUpdated = false; + mLayerUpdated = false; + mSculptUpdated = false; } LocalAssetBrowser::~LocalAssetBrowser() @@ -472,17 +466,15 @@ void LocalAssetBrowser::AddBitmap_continued(AIFilePicker* filepicker) std::vector const& filenames(filepicker->getFilenames()); for(std::vector::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { - LocalBitmap* unit = new LocalBitmap(*filename); - - if ( unit->getIfValidBool() ) + LocalBitmap unit(*filename); + if (unit.getIfValidBool()) { - loaded_bitmaps.push_back( unit ); + loaded_bitmaps.push_back(unit); change_happened = true; } } - if ( change_happened ) - { onChangeHappened(); } + if (change_happened) onChangeHappened(); } void LocalAssetBrowser::DelBitmap( std::vector delete_vector, S32 column ) @@ -498,34 +490,26 @@ void LocalAssetBrowser::DelBitmap( std::vector delete_vector, for (local_list_iter iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end();) { - LocalBitmap* unit = (*iter)->getThis(); - - if ( unit->getID() == id ) + if ((*iter).getID() == id) { LLViewerFetchedTexture* image = gTextureList.findImage(id); gTextureList.deleteImage( image ); image->unref(); - iter = loaded_bitmaps.erase(iter); - delete unit; - unit = NULL; - change_happened = true; } else - { iter++; } + ++iter; } } } - if ( change_happened ) - { onChangeHappened(); } + if (change_happened) onChangeHappened(); } void LocalAssetBrowser::onUpdateBool(LLUUID id) { - LocalBitmap* unit = GetBitmapUnit( id ); - if ( unit ) + if (LocalBitmap* unit = GetBitmapUnit(id)) { unit->setUpdateBool(); PingTimer(); @@ -534,32 +518,22 @@ void LocalAssetBrowser::onUpdateBool(LLUUID id) void LocalAssetBrowser::onSetType(LLUUID id, S32 type) { - LocalBitmap* unit = GetBitmapUnit( id ); - if ( unit ) - { unit->setType(type); } + if (LocalBitmap* unit = GetBitmapUnit(id)) unit->setType(type); } LocalBitmap* LocalAssetBrowser::GetBitmapUnit(LLUUID id) { - local_list_iter iter = loaded_bitmaps.begin(); - for (; iter != loaded_bitmaps.end(); iter++) - { - if ( (*iter)->getID() == id ) - { - return (*iter)->getThis(); - } - } - + for (local_list_iter iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); ++iter) + if ((*iter).getID() == id) + return &(*iter); return NULL; } bool LocalAssetBrowser::IsDoingUpdates() { - local_list_iter iter = loaded_bitmaps.begin(); - for (; iter != loaded_bitmaps.end(); iter++) + for (local_list_iter iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); iter++) { - if ( (*iter)->getUpdateBool() ) - { return true; } /* if at least one unit in the list needs updates - we need a timer. */ + if ((*iter).getUpdateBool()) return true; /* if at least one unit in the list needs updates - we need a timer. */ } return false; @@ -572,7 +546,7 @@ bool LocalAssetBrowser::IsDoingUpdates() void LocalAssetBrowser::onChangeHappened() { /* own floater update */ - FloaterLocalAssetBrowser::UpdateBitmapScrollList(); + if (sLFInstance) sLFInstance->UpdateBitmapScrollList(); /* texturepicker related */ const LLView::child_list_t* child_list = gFloaterView->getChildList(); @@ -599,44 +573,37 @@ void LocalAssetBrowser::onChangeHappened() void LocalAssetBrowser::PingTimer() { - if ( !loaded_bitmaps.empty() && IsDoingUpdates() ) + if (!loaded_bitmaps.empty() && IsDoingUpdates()) { - if (!gLocalBrowserTimer) - { gLocalBrowserTimer = new LocalAssetBrowserTimer(); } - - if ( !gLocalBrowserTimer->isRunning() ) - { gLocalBrowserTimer->start(); } + if (!gLocalBrowserTimer) + gLocalBrowserTimer = new LocalAssetBrowserTimer(); + if (!gLocalBrowserTimer->isRunning()) + gLocalBrowserTimer->start(); } - - else + else if (gLocalBrowserTimer && gLocalBrowserTimer->isRunning()) { - if (gLocalBrowserTimer) - { - if ( gLocalBrowserTimer->isRunning() ) - { gLocalBrowserTimer->stop(); } - } + gLocalBrowserTimer->stop(); } } /* This function refills the texture picker floater's scrolllist with the updated contents of bitmaplist */ void LocalAssetBrowser::UpdateTextureCtrlList(LLScrollListCtrl* ctrl) { - if ( ctrl ) // checking again in case called externally for some silly reason. + if (ctrl) // checking again in case called externally for some silly reason. { ctrl->clearRows(); if ( !loaded_bitmaps.empty() ) { - local_list_iter iter = loaded_bitmaps.begin(); - for ( ; iter != loaded_bitmaps.end(); iter++ ) + for (local_list_iter iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); ++iter) { LLSD element; element["columns"][0]["column"] = "unit_name"; element["columns"][0]["type"] = "text"; - element["columns"][0]["value"] = (*iter)->shortname; + element["columns"][0]["value"] = (*iter).shortname; element["columns"][1]["column"] = "unit_id_HIDDEN"; element["columns"][1]["type"] = "text"; - element["columns"][1]["value"] = (*iter)->id; + element["columns"][1]["value"] = (*iter).id; ctrl->addElement(element); } @@ -644,73 +611,58 @@ void LocalAssetBrowser::UpdateTextureCtrlList(LLScrollListCtrl* ctrl) } } -void LocalAssetBrowser::PerformTimedActions(void) +void LocalAssetBrowser::PerformTimedActions() { // perform checking if updates are needed && update if so. - local_list_iter iter; - for (iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); iter++) - { (*iter)->updateSelf(); } - - // one or more sculpts have been updated, refreshing them. - if ( mSculptUpdated ) + for (local_list_iter iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); ++iter) { - LocalAssetBrowser::local_list_iter iter; - for(iter = loaded_bitmaps.begin(); iter != loaded_bitmaps.end(); iter++) + (*iter).updateSelf(); + // one or more sculpts have been updated, refreshing them. + if (mSculptUpdated && (*iter).sculpt_dirty) { - if ( (*iter)->sculpt_dirty ) - { - PerformSculptUpdates( (*iter)->getThis() ); - (*iter)->sculpt_dirty = false; - } + PerformSculptUpdates(*iter); + (*iter).sculpt_dirty = false; } - mSculptUpdated = false; } + mSculptUpdated = false; // one of the layer bitmaps has been updated, we need to rebake. - if ( mLayerUpdated ) + if (mLayerUpdated) { - if (isAgentAvatarValid()) - { + if (isAgentAvatarValid()) gAgentAvatarp->forceBakeAllTextures(SLAM_FOR_DEBUG); - } - mLayerUpdated = false; } } -void LocalAssetBrowser::PerformSculptUpdates(LocalBitmap* unit) +void LocalAssetBrowser::PerformSculptUpdates(LocalBitmap& unit) { - /* looking for sculptmap using objects only */ - std::vector object_list = unit->getUsingObjects(false, false, true); + std::vector object_list = unit.getUsingObjects(false, false, true); if (object_list.empty()) { return; } for( std::vector::iterator iter = object_list.begin(); iter != object_list.end(); iter++ ) { affected_object aobj = *iter; - if ( aobj.object ) + if (aobj.object) { - if ( !aobj.local_sculptmap ) { continue; } // should never get here. only in case of misuse. - + if (!aobj.local_sculptmap) continue; // should never get here. only in case of misuse. // update code [begin] - if ( unit->volume_dirty ) + if (unit.volume_dirty) { - LLImageRaw* rawimage = gTextureList.findImage( unit->getID() )->getCachedRawImage(); + LLImageRaw* rawimage = gTextureList.findImage(unit.getID())->getCachedRawImage(); - aobj.object->getVolume()->sculpt(rawimage->getWidth(), rawimage->getHeight(), - rawimage->getComponents(), rawimage->getData(), 0); - unit->volume_dirty = false; + aobj.object->getVolume()->sculpt(rawimage->getWidth(), rawimage->getHeight(), rawimage->getComponents(), rawimage->getData(), 0); + unit.volume_dirty = false; } - // tell affected drawable it's got updated - aobj.object->mDrawable->getVOVolume()->setSculptChanged( true ); - aobj.object->mDrawable->getVOVolume()->markForUpdate( true ); + // tell affected drawable it's got updated + aobj.object->mDrawable->getVOVolume()->setSculptChanged(true); + aobj.object->mDrawable->getVOVolume()->markForUpdate(true); // update code [end] } - } - } /*==================================================*/ @@ -722,36 +674,6 @@ void LocalAssetBrowser::PerformSculptUpdates(LocalBitmap* unit) Destroyed when the floater is closed. */ - -// Floater Globals -FloaterLocalAssetBrowser* FloaterLocalAssetBrowser::sLFInstance = NULL; - -// widgets: - LLButton* mAddBtn; - LLButton* mDelBtn; - LLButton* mMoreBtn; - LLButton* mLessBtn; - LLButton* mUploadBtn; - - - LLScrollListCtrl* mBitmapList; - LLTextureCtrl* mTextureView; - LLCheckBoxCtrl* mUpdateChkBox; - - LLLineEditor* mPathTxt; - LLLineEditor* mUUIDTxt; - LLLineEditor* mNameTxt; - - LLTextBox* mLinkTxt; - LLTextBox* mTimeTxt; - LLComboBox* mTypeComboBox; - - LLTextBox* mCaptionPathTxt; - LLTextBox* mCaptionUUIDTxt; - LLTextBox* mCaptionLinkTxt; - LLTextBox* mCaptionNameTxt; - LLTextBox* mCaptionTimeTxt; - FloaterLocalAssetBrowser::FloaterLocalAssetBrowser() : LLFloater(std::string("local_bitmap_browser_floater")) { @@ -791,12 +713,15 @@ FloaterLocalAssetBrowser::FloaterLocalAssetBrowser() mDelBtn->setEnabled( false ); mUploadBtn->setEnabled( false ); + // Initialize visibility + FloaterResize(true); + // setting button callbacks: - mAddBtn->setClickedCallback( onClickAdd, this); - mDelBtn->setClickedCallback( onClickDel, this); - mMoreBtn->setClickedCallback( onClickMore, this); - mLessBtn->setClickedCallback( onClickLess, this); - mUploadBtn->setClickedCallback( onClickUpload, this); + mAddBtn->setClickedCallback(boost::bind(&FloaterLocalAssetBrowser::onClickAdd, this)); + mDelBtn->setClickedCallback(boost::bind(&FloaterLocalAssetBrowser::onClickDel, this)); + mMoreBtn->setClickedCallback(boost::bind(&FloaterLocalAssetBrowser::FloaterResize, this, true)); + mLessBtn->setClickedCallback(boost::bind(&FloaterLocalAssetBrowser::FloaterResize, this, false)); + mUploadBtn->setClickedCallback(boost::bind(&FloaterLocalAssetBrowser::onClickUpload, this)); // combo callback mTypeComboBox->setCommitCallback(boost::bind(&FloaterLocalAssetBrowser::onCommitTypeCombo,this)); @@ -806,48 +731,35 @@ FloaterLocalAssetBrowser::FloaterLocalAssetBrowser() // checkbox callbacks mUpdateChkBox->setCommitCallback(boost::bind(&FloaterLocalAssetBrowser::onClickUpdateChkbox,this)); - } void FloaterLocalAssetBrowser::show(void*) { - if (!sLFInstance) - sLFInstance = new FloaterLocalAssetBrowser(); - sLFInstance->open(); + if (!sLFInstance) + sLFInstance = new FloaterLocalAssetBrowser(); + sLFInstance->open(); sLFInstance->UpdateBitmapScrollList(); } FloaterLocalAssetBrowser::~FloaterLocalAssetBrowser() { - sLFInstance=NULL; + sLFInstance = NULL; } -void FloaterLocalAssetBrowser::onClickAdd(void* userdata) +void FloaterLocalAssetBrowser::onClickAdd() { gLocalBrowser->AddBitmap(); } -void FloaterLocalAssetBrowser::onClickDel(void* userdata) +void FloaterLocalAssetBrowser::onClickDel() { - gLocalBrowser->DelBitmap( sLFInstance->mBitmapList->getAllSelected() ); + gLocalBrowser->DelBitmap(mBitmapList->getAllSelected()); } -/* what stopped me from using a single button and simply changing it's label - is the fact that i'd need to hardcode the button labels here, and that is griff. */ -void FloaterLocalAssetBrowser::onClickMore(void* userdata) -{ - FloaterResize(true); -} - -void FloaterLocalAssetBrowser::onClickLess(void* userdata) -{ - FloaterResize(false); -} - -void FloaterLocalAssetBrowser::onClickUpload(void* userdata) +void FloaterLocalAssetBrowser::onClickUpload() { std::string filename = gLocalBrowser->GetBitmapUnit( - (LLUUID)sLFInstance->mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID) )->getFileName(); + (LLUUID)mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID) )->getFileName(); if ( !filename.empty() ) { @@ -858,9 +770,9 @@ void FloaterLocalAssetBrowser::onClickUpload(void* userdata) void FloaterLocalAssetBrowser::onChooseBitmapList() { - bool button_status = mBitmapList->isEmpty(); - mDelBtn->setEnabled(!button_status); - mUploadBtn->setEnabled(!button_status); + bool button_status = !mBitmapList->isEmpty() && mBitmapList->getFirstSelected(); + mDelBtn->setEnabled(button_status); + mUploadBtn->setEnabled(button_status); UpdateRightSide(); } @@ -879,71 +791,59 @@ void FloaterLocalAssetBrowser::onCommitTypeCombo() { std::string temp_str = mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID); - if ( !temp_str.empty() ) + if (!temp_str.empty()) { - S32 selection = sLFInstance->mTypeComboBox->getCurrentIndex(); - gLocalBrowser->onSetType( (LLUUID)temp_str, selection ); + S32 selection = mTypeComboBox->getCurrentIndex(); + gLocalBrowser->onSetType((LLUUID)temp_str, selection); } } void FloaterLocalAssetBrowser::FloaterResize(bool expand) { - sLFInstance->mMoreBtn->setVisible(!expand); - sLFInstance->mLessBtn->setVisible(expand); - sLFInstance->mTextureView->setVisible(expand); - sLFInstance->mUpdateChkBox->setVisible(expand); - sLFInstance->mCaptionPathTxt->setVisible(expand); - sLFInstance->mCaptionUUIDTxt->setVisible(expand); - sLFInstance->mCaptionLinkTxt->setVisible(expand); - sLFInstance->mCaptionNameTxt->setVisible(expand); - sLFInstance->mCaptionTimeTxt->setVisible(expand); - sLFInstance->mTypeComboBox->setVisible(expand); + mMoreBtn->setVisible(!expand); + mLessBtn->setVisible(expand); + mTextureView->setVisible(expand); + mUpdateChkBox->setVisible(expand); + mCaptionPathTxt->setVisible(expand); + mCaptionUUIDTxt->setVisible(expand); + mCaptionLinkTxt->setVisible(expand); + mCaptionNameTxt->setVisible(expand); + mCaptionTimeTxt->setVisible(expand); + mTypeComboBox->setVisible(expand); - sLFInstance->mTimeTxt->setVisible(expand); - sLFInstance->mPathTxt->setVisible(expand); - sLFInstance->mUUIDTxt->setVisible(expand); - sLFInstance->mLinkTxt->setVisible(expand); - sLFInstance->mNameTxt->setVisible(expand); - - if(expand) - { - sLFInstance->reshape(LF_FLOATER_EXPAND_WIDTH, LF_FLOATER_HEIGHT); - sLFInstance->setResizeLimits(LF_FLOATER_EXPAND_WIDTH, LF_FLOATER_HEIGHT); - sLFInstance->UpdateRightSide(); - } - else - { - sLFInstance->reshape(LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT); - sLFInstance->setResizeLimits(LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT); - } + mTimeTxt->setVisible(expand); + mPathTxt->setVisible(expand); + mUUIDTxt->setVisible(expand); + mLinkTxt->setVisible(expand); + mNameTxt->setVisible(expand); + reshape(expand ? LF_FLOATER_EXPAND_WIDTH : LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT); + setResizeLimits(expand ? LF_FLOATER_EXPAND_WIDTH : LF_FLOATER_CONTRACT_WIDTH, LF_FLOATER_HEIGHT); + if (expand) UpdateRightSide(); } void FloaterLocalAssetBrowser::UpdateBitmapScrollList() { - if ( !sLFInstance ) { return; } - - sLFInstance->mBitmapList->clearRows(); + mBitmapList->clearRows(); if (!gLocalBrowser->loaded_bitmaps.empty()) { - LocalAssetBrowser::local_list_iter iter; for(iter = gLocalBrowser->loaded_bitmaps.begin(); iter != gLocalBrowser->loaded_bitmaps.end(); iter++) { LLSD element; element["columns"][BITMAPLIST_COL_NAME]["column"] = "bitmap_name"; element["columns"][BITMAPLIST_COL_NAME]["type"] = "text"; - element["columns"][BITMAPLIST_COL_NAME]["value"] = (*iter)->getShortName(); + element["columns"][BITMAPLIST_COL_NAME]["value"] = (*iter).getShortName(); element["columns"][BITMAPLIST_COL_ID]["column"] = "bitmap_uuid"; element["columns"][BITMAPLIST_COL_ID]["type"] = "text"; - element["columns"][BITMAPLIST_COL_ID]["value"] = (*iter)->getID(); + element["columns"][BITMAPLIST_COL_ID]["value"] = (*iter).getID(); - sLFInstance->mBitmapList->addElement(element); + mBitmapList->addElement(element); } } - sLFInstance->UpdateRightSide(); + onChooseBitmapList(); } void FloaterLocalAssetBrowser::UpdateRightSide() @@ -951,47 +851,45 @@ void FloaterLocalAssetBrowser::UpdateRightSide() /* Since i'm not keeping a bool on if the floater is expanded or not, i'll just check if one of the widgets that shows when the floater is expanded is visible. - Also obviously before updating - checking if something IS actually selected :o */ + if (!mTextureView->getVisible()) return; - if ( !sLFInstance->mTextureView->getVisible() ) { return; } - - if ( !sLFInstance->mBitmapList->getAllSelected().empty() ) - { - LocalBitmap* unit = gLocalBrowser->GetBitmapUnit( LLUUID(sLFInstance->mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID)) ); + if (!mBitmapList->getAllSelected().empty()) + { + LocalBitmap* unit = gLocalBrowser->GetBitmapUnit( LLUUID(mBitmapList->getSelectedItemLabel(BITMAPLIST_COL_ID)) ); if ( unit ) { - sLFInstance->mTextureView->setImageAssetID( unit->getID() ); - sLFInstance->mUpdateChkBox->set( unit->getUpdateBool() ); - sLFInstance->mPathTxt->setText( unit->getFileName() ); - sLFInstance->mUUIDTxt->setText( unit->getID().asString() ); - sLFInstance->mNameTxt->setText( unit->getShortName() ); - sLFInstance->mTimeTxt->setText( unit->getLastModified().asString() ); - sLFInstance->mLinkTxt->setText( unit->getLinkStatus() ); - sLFInstance->mTypeComboBox->selectNthItem( unit->getType() ); + mTextureView->setImageAssetID(unit->getID()); + mUpdateChkBox->set(unit->getUpdateBool()); + mPathTxt->setText(unit->getFileName()); + mUUIDTxt->setText(unit->getID().asString()); + mNameTxt->setText(unit->getShortName()); + mTimeTxt->setText(unit->getLastModified().asString()); + mLinkTxt->setText(unit->getLinkStatus()); + mTypeComboBox->selectNthItem(unit->getType()); - sLFInstance->mTextureView->setEnabled(true); - sLFInstance->mUpdateChkBox->setEnabled(true); - sLFInstance->mTypeComboBox->setEnabled(true); + mTextureView->setEnabled(true); + mUpdateChkBox->setEnabled(true); + mTypeComboBox->setEnabled(true); } } else { - sLFInstance->mTextureView->setImageAssetID( NO_IMAGE ); - sLFInstance->mTextureView->setEnabled( false ); - sLFInstance->mUpdateChkBox->set( false ); - sLFInstance->mUpdateChkBox->setEnabled( false ); + mTextureView->setImageAssetID(NO_IMAGE); + mTextureView->setEnabled(false); + mUpdateChkBox->set(false); + mUpdateChkBox->setEnabled(false); - sLFInstance->mTypeComboBox->selectFirstItem(); - sLFInstance->mTypeComboBox->setEnabled( false ); - - sLFInstance->mPathTxt->setText( LLStringExplicit("None") ); - sLFInstance->mUUIDTxt->setText( LLStringExplicit("None") ); - sLFInstance->mNameTxt->setText( LLStringExplicit("None") ); - sLFInstance->mLinkTxt->setText( LLStringExplicit("None") ); - sLFInstance->mTimeTxt->setText( LLStringExplicit("None") ); + mTypeComboBox->selectFirstItem(); + mTypeComboBox->setEnabled(false); + + mPathTxt->setText(LLStringExplicit("None")); + mUUIDTxt->setText(LLStringExplicit("None")); + mNameTxt->setText(LLStringExplicit("None")); + mLinkTxt->setText(LLStringExplicit("None")); + mTimeTxt->setText(LLStringExplicit("None")); } } diff --git a/indra/newview/floaterlocalassetbrowse.h b/indra/newview/floaterlocalassetbrowse.h index b4cbc149f..dd7e618ea 100644 --- a/indra/newview/floaterlocalassetbrowse.h +++ b/indra/newview/floaterlocalassetbrowse.h @@ -98,7 +98,7 @@ class LocalBitmap { public: LocalBitmap(std::string filename); - virtual ~LocalBitmap(void); + virtual ~LocalBitmap(); friend class LocalAssetBrowser; public: /* [enums, typedefs, etc] */ @@ -127,23 +127,22 @@ class LocalBitmap }; public: /* [information query functions] */ - std::string getShortName(void); - std::string getFileName(void); - LLUUID getID(void); - LLSD getLastModified(void); - std::string getLinkStatus(void); - bool getUpdateBool(void); + std::string getShortName(); + std::string getFileName(); + LLUUID getID(); + LLSD getLastModified(); + std::string getLinkStatus(); + bool getUpdateBool(); void setType( S32 ); - bool getIfValidBool(void); - S32 getType(void); - void getDebugInfo(void); + bool getIfValidBool(); + S32 getType(); + void getDebugInfo(); private: /* [maintenence functions] */ - void updateSelf(void); + void updateSelf(); bool decodeSelf(LLImageRaw* rawimg); - void setUpdateBool(void); + void setUpdateBool(); - LocalBitmap* getThis(void); std::vector getFaceUsesThis(LLDrawable*); std::vector getUsingObjects(bool seek_by_type = true, bool seek_textures = false, bool seek_sculptmaps = false); @@ -184,7 +183,7 @@ class LocalAssetBrowser static void UpdateTextureCtrlList(LLScrollListCtrl*); static void setLayerUpdated(bool toggle) { mLayerUpdated = toggle; } static void setSculptUpdated(bool toggle) { mSculptUpdated = toggle; } - static void AddBitmap(void); + static void AddBitmap(); static void AddBitmap_continued(AIFilePicker* filepicker); static void DelBitmap( std::vector, S32 column = BITMAPLIST_COL_ID ); @@ -194,18 +193,18 @@ class LocalAssetBrowser the latter - each time the button's pressed. */ private: - static void onChangeHappened(void); + static void onChangeHappened(); static void onUpdateBool(LLUUID); static void onSetType(LLUUID, S32); static LocalBitmap* GetBitmapUnit(LLUUID); - static bool IsDoingUpdates(void); - static void PingTimer(void); - static void PerformTimedActions(void); - static void PerformSculptUpdates(LocalBitmap*); + static bool IsDoingUpdates(); + static void PingTimer(); + static void PerformTimedActions(); + static void PerformSculptUpdates(LocalBitmap&); protected: - static std::vector loaded_bitmaps; - typedef std::vector::iterator local_list_iter; + static std::vector loaded_bitmaps; + typedef std::vector::iterator local_list_iter; static bool mLayerUpdated; static bool mSculptUpdated; }; @@ -225,17 +224,13 @@ public: FloaterLocalAssetBrowser(); virtual ~FloaterLocalAssetBrowser(); static void show(void*); - - private: /* Widget related callbacks */ - // Button callback declarations - static void onClickAdd(void* userdata); - static void onClickDel(void* userdata); - static void onClickMore(void* userdata); - static void onClickLess(void* userdata); - static void onClickUpload(void* userdata); + // Button callback declarations + void onClickAdd(); + void onClickDel(); + void onClickUpload(); // ScrollList callback declarations void onChooseBitmapList(); @@ -271,17 +266,12 @@ private: LLTextBox* mCaptionNameTxt; LLTextBox* mCaptionTimeTxt; - /* static pointer to self, wai? oh well. */ - static FloaterLocalAssetBrowser* sLFInstance; - // non-widget functions - static void FloaterResize(bool expand); - static void UpdateRightSide(void); + void FloaterResize(bool expand); + void UpdateRightSide(); public: - static void UpdateBitmapScrollList(void); - - + void UpdateBitmapScrollList(); }; /*==================================================*/ diff --git a/indra/newview/hippogridmanager.cpp b/indra/newview/hippogridmanager.cpp index 9057109d2..b0fd2b254 100644 --- a/indra/newview/hippogridmanager.cpp +++ b/indra/newview/hippogridmanager.cpp @@ -891,6 +891,8 @@ void HippoGridManager::loadFromFile() void HippoGridManager::parseUrl(const std::string url, bool mergeIfNewer) { + if (url.empty()) return; + llinfos << "Loading grid info from '" << url << "'." << llendl; // query update server diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index e78317e3f..3f2cfbd0f 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -31,6 +31,7 @@ RequestExecutionLevel admin ; on Vista we must be admin because we write to Prog ;; !define INSTNAME "SecondLife%(grid_caps)s" ;; !define SHORTCUT "Second Life (%(grid_caps)s)" ;; !define URLNAME "secondlife%(grid)s" +;; !define AUTHOR "Linden Research, Inc." ;; !define UNINSTALL_SETTINGS 1 %%GRID_VARS%% @@ -76,8 +77,8 @@ Name "${VIEWERNAME}" SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text BrandingText "Prepare to Implode!" ; bottom of window text -Icon %%SOURCE%%\installers\windows\install_icon_singularity.ico -UninstallIcon %%SOURCE%%\installers\windows\uninstall_icon_singularity.ico +Icon %%SOURCE%%\installers\windows\${INSTALL_ICON} +UninstallIcon %%SOURCE%%\installers\windows\${UNINSTALL_ICON} WindowIcon off ; show our icon in left corner # BGGradient 9090b0 000000 notext CRCCheck on ; make sure CRC is OK @@ -89,7 +90,7 @@ SetOverwrite on ; stomp files by default AutoCloseWindow true ; after all files install, close window InstallDir "%%INSTALLDIR%%" -InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "" +InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "" DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -191,7 +192,7 @@ FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function CheckIfAlreadyCurrent Push $0 - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Version" StrCmp $0 ${VERSION_LONG} 0 DONE MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK DONE Quit @@ -550,7 +551,7 @@ SetShellVarContext all Call un.CloseSecondLife ; Clean up registry keys and subkeys (these should all be !defines somewhere) -DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" +DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" ; Clean up shortcuts @@ -693,7 +694,7 @@ lbl_check_silent: ; If we currently have a version of SL installed, default to the language of that install ; Otherwise don't change $LANGUAGE and it will default to the OS UI language. - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "InstallerLanguage" IfErrors lbl_build_menu StrCpy $LANGUAGE $0 @@ -711,7 +712,7 @@ lbl_build_menu: StrCpy $LANGUAGE $0 ; save language in registry - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE + WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "InstallerLanguage" $LANGUAGE lbl_return: Pop $0 Return @@ -721,7 +722,7 @@ FunctionEnd Function un.onInit ; read language from registry and set for uninstaller ; Key will be removed on successful uninstall - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "InstallerLanguage" IfErrors lbl_end StrCpy $LANGUAGE $0 lbl_end: @@ -810,11 +811,11 @@ CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Write registry -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" "$INSTFLAGS" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "" "$INSTDIR" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Version" "${VERSION_LONG}" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Flags" "$INSTFLAGS" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Shortcut" "$INSTSHORTCUT" +WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Exe" "$INSTEXE" WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)" WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"' diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index f1066076a..5c21a75a3 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2076,7 +2076,7 @@ void LLAgentCamera::handleScrollWheel(S32 clicks) if (MASK mask = gKeyboard->currentMask(true)) // Singu Note: Conveniently set view offsets while modifier keys are held during scroll { static const LLCachedControl enableCameraOffsetScroll("SinguOffsetScrollKeys"); - if (mask & MASK_CONTROL|MASK_SHIFT && enableCameraOffsetScroll) + if (mask & (MASK_CONTROL|MASK_SHIFT) && enableCameraOffsetScroll) { const F32 change(static_cast(clicks) * 0.1f); if (mask & MASK_SHIFT) diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 643fe5f0e..c76abdf64 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1526,7 +1526,7 @@ void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id) LLInventoryModel::item_array_t items; LLFindWearablesEx collector(/*is_worn=*/ true, /*include_body_parts=*/ false); - gInventory.collectDescendentsIf(cat_id, cats, items, FALSE, collector); + gInventory.collectDescendentsIf(cat_id, cats, items, FALSE, collector, true); LLInventoryModel::item_array_t::const_iterator it = items.begin(); const LLInventoryModel::item_array_t::const_iterator it_end = items.end(); @@ -1537,6 +1537,18 @@ void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id) uuids_to_remove.push_back(item->getUUID()); } removeItemsFromAvatar(uuids_to_remove); + + // deactivate all gestures in the outfit folder + LLInventoryModel::item_array_t gest_items; + getDescendentsOfAssetType(cat_id, gest_items, LLAssetType::AT_GESTURE, true); + for(S32 i = 0; i < gest_items.count(); ++i) + { + LLViewerInventoryItem* gest_item = gest_items.get(i); + if (LLGestureMgr::instance().isGestureActive(gest_item->getLinkedUUID())) + { + LLGestureMgr::instance().deactivateGesture(gest_item->getLinkedUUID()); + } + } } // Create a copy of src_id + contents as a subfolder of dst_id. @@ -1712,8 +1724,19 @@ bool LLAppearanceMgr::getCanRemoveFromCOF(const LLUUID& outfit_cat_id) cats, items, LLInventoryModel::EXCLUDE_TRASH, - is_worn); - return items.size() > 0; + is_worn, + /*follow_folder_links=*/ true); + + if (items.size()) return true; + + // Is there an active gesture in outfit_cat_id? + items.reset(); + LLIsType is_gesture(LLAssetType::AT_GESTURE); + gInventory.collectDescendentsIf(outfit_cat_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_gesture, /*follow_folder_links=*/ true); + for(S32 i = 0; i < items.count(); ++i) + if (LLGestureMgr::instance().isGestureActive(items.get(i)->getLinkedUUID())) + return true; + return false; } // static @@ -1944,10 +1967,10 @@ void LLAppearanceMgr::linkAll(const LLUUID& cat_uuid, void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append) { LLInventoryModel::item_array_t body_items_new, wear_items_new, obj_items_new, gest_items_new; - getDescendentsOfAssetType(category, body_items_new, LLAssetType::AT_BODYPART, false); - getDescendentsOfAssetType(category, wear_items_new, LLAssetType::AT_CLOTHING, false); - getDescendentsOfAssetType(category, obj_items_new, LLAssetType::AT_OBJECT, false); - getDescendentsOfAssetType(category, gest_items_new, LLAssetType::AT_GESTURE, false); + getDescendentsOfAssetType(category, body_items_new, LLAssetType::AT_BODYPART, true); + getDescendentsOfAssetType(category, wear_items_new, LLAssetType::AT_CLOTHING, true); + getDescendentsOfAssetType(category, obj_items_new, LLAssetType::AT_OBJECT, true); + getDescendentsOfAssetType(category, gest_items_new, LLAssetType::AT_GESTURE, true); updateCOF(body_items_new, wear_items_new, obj_items_new, gest_items_new, append, category); } @@ -3018,7 +3041,7 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id) const LLViewerInventoryItem* item = item_array.get(i).get(); if (item->getIsLinkType() && item->getLinkedUUID() == item_id) { -#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG +#if 0 // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG // NOTE-RLVa: debug-only, can be removed down the line if (rlv_handler_t::isEnabled()) { @@ -3050,7 +3073,7 @@ void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type) if (item->getIsLinkType()) // we must operate on links only { // [RLVa:KB] - Checked: 2013-02-12 (RLVa-1.4.8) -#if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG +#if 0 // LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG // NOTE-RLVa: debug-only, can be removed down the line if (rlv_handler_t::isEnabled()) { @@ -3976,6 +3999,11 @@ void LLAppearanceMgr::wearBaseOutfit() void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove) { + if (ids_to_remove.empty()) + { + llwarns << "called with empty list, nothing to do" << llendl; + } + // [RLVa:KB] - Checked: 2013-02-12 (RLVa-1.4.8) bool fUpdateAppearance = false; for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it) @@ -4423,7 +4451,6 @@ void wear_multiple(const uuid_vec_t& ids, bool replace) // SLapp for easy-wearing of a stock (library) avatar // -/* class LLWearFolderHandler : public LLCommandHandler { public: @@ -4453,4 +4480,4 @@ public: } }; -LLWearFolderHandler gWearFolderHandler;*/ +LLWearFolderHandler gWearFolderHandler; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index eb1a28576..45fa8dcd7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -304,6 +304,8 @@ const std::string MARKER_FILE_NAME("Singularity.exec_marker"); const std::string ERROR_MARKER_FILE_NAME("Singularity.error_marker"); const std::string LLERROR_MARKER_FILE_NAME("Singularity.llerror_marker"); const std::string LOGOUT_MARKER_FILE_NAME("Singularity.logout_marker"); +const std::string LOG_FILE("Singularity.log"); +extern const std::string OLD_LOG_FILE("Singularity.old"); static BOOL gDoDisconnect = FALSE; static std::string gLaunchFileOnQuit; @@ -353,6 +355,7 @@ void init_default_trans_args() { default_trans_args.insert("SECOND_LIFE"); // World default_trans_args.insert("APP_NAME"); + default_trans_args.insert("SHORT_APP_NAME"); default_trans_args.insert("CAPITALIZED_APP_NAME"); default_trans_args.insert("SECOND_LIFE_GRID"); default_trans_args.insert("SUPPORT_SITE"); @@ -1946,13 +1949,11 @@ bool LLAppViewer::initLogging() LLError::setFatalFunction(errorCallback); // Remove the last ".old" log file. - std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "Singularity.old"); + std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, OLD_LOG_FILE); LLFile::remove(old_log_file); // Rename current log file to ".old" - std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - "Singularity.log"); + std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LOG_FILE); LLFile::rename(log_file, old_log_file); // Set the log file to Singularity.log @@ -2363,23 +2364,6 @@ bool LLAppViewer::initConfiguration() #if LL_DARWIN // Initialize apple menubar and various callbacks init_apple_menu(LLTrans::getString("APP_NAME").c_str()); - -#if __ppc__ - // If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further. - // Only test PowerPC - all Intel Macs have SSE. - if(!gSysCPU.hasAltivec()) - { - std::ostringstream msg; - msg << LLTrans::getString("MBRequiresAltiVec"); - OSMessageBox( - msg.str(), - LLStringUtil::null, - OSMB_OK); - removeMarkerFile(); - return false; - } -#endif - #endif // LL_DARWIN // Display splash screen. Must be after above check for previous @@ -2664,7 +2648,7 @@ void LLAppViewer::writeSystemInfo() // that the crash report will go to the proper location in the case of a // prior freeze. std::string crashHostUrl = gSavedSettings.get("CrashHostUrl"); - if(crashHostUrl != "") + if (!crashHostUrl.empty()) { gDebugInfo["CrashHostUrl"] = crashHostUrl; } @@ -2725,7 +2709,7 @@ void LLAppViewer::handleViewerCrash() // Insert crash host url (url to post crash log to) if configured. std::string crashHostUrl = gSavedSettings.get("CrashHostUrl"); - if(crashHostUrl != "") + if (!crashHostUrl.empty()) { gDebugInfo["Dynamic"]["CrashHostUrl"] = crashHostUrl; } diff --git a/indra/newview/llcrashlogger.cpp b/indra/newview/llcrashlogger.cpp index e0a52cc62..cf06a402d 100644 --- a/indra/newview/llcrashlogger.cpp +++ b/indra/newview/llcrashlogger.cpp @@ -47,6 +47,7 @@ class AIHTTPTimeoutPolicy; extern AIHTTPTimeoutPolicy crashLoggerResponder_timeout; +extern const std::string OLD_LOG_FILE; class LLCrashLoggerResponder : public LLHTTPClient::ResponderWithResult { @@ -284,7 +285,7 @@ void LLCrashLogger::gatherFiles() mCrashInfo["DebugLog"] = mDebugLog; mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_DUMP,"stats.log"); // Singu Note: we have just started again, log has been renamed - mFileMap["SecondLifeLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "Singularity.old"); + mFileMap["SecondLifeLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, OLD_LOG_FILE); llinfos << "Encoding files..." << llendl; diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index ce4b19b82..b27bb9a14 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -373,6 +373,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) BOOL light_enabled = TRUE; BOOL use_shaders = gPipeline.canUseVertexShaders(); + + BOOL depth_only = (pass == 1 && !LLPipeline::sImpostorRender); for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i) { @@ -387,7 +389,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) || group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_CLOUD || group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_HUD_PARTICLE; - bool draw_glow_for_this_partition = mVertexShaderLevel > 0; // no shaders = no glow. + bool draw_glow_for_this_partition = !depth_only && mVertexShaderLevel > 0; // no shaders = no glow. static LLFastTimer::DeclareTimer FTM_RENDER_ALPHA_GROUP_LOOP("Alpha Group"); LLFastTimer t(FTM_RENDER_ALPHA_GROUP_LOOP); @@ -410,7 +412,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) // Fix for bug - NORSPEC-271 // If the face is more than 90% transparent, then don't update the Depth buffer for Dof // We don't want the nearly invisible objects to cause of DoF effects - if(pass == 1 && !LLPipeline::sImpostorRender) + if(depth_only) { LLFace* face = params.mFace; if(face) @@ -443,9 +445,10 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) llassert_always(!LLGLSLShader::sNoFixedFunction); llassert_always(!LLGLSLShader::sCurBoundShaderPtr); - if(params.mFullbright == light_enabled || !initialized_lighting) + bool fullbright = depth_only || params.mFullbright; + if(fullbright == !!light_enabled || !initialized_lighting) { - light_enabled = !params.mFullbright; + light_enabled = !fullbright; initialized_lighting = true; if (light_enabled) // Turn off lighting if it hasn't already been so. diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index eba3d2606..42dcd4547 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1951,7 +1951,7 @@ void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar) LLRender::BF_ONE_MINUS_SOURCE_ALPHA); renderRigged(avatar, RIGGED_ALPHA); - gGL.setSceneBlendType(LLRender::BT_ALPHA); + //gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setColorMask(true, false); } } @@ -1969,7 +1969,7 @@ void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar) LLRender::BF_ONE_MINUS_SOURCE_ALPHA); renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA); - gGL.setSceneBlendType(LLRender::BT_ALPHA); + //gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setColorMask(true, false); } } diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index d9eac7b7b..6a4c1b2ba 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -270,7 +270,7 @@ void LLDrawPoolBump::render(S32 pass) { LLFastTimer t(FTM_RENDER_BUMP); - if (!gPipeline.hasRenderType(LLDrawPool::POOL_SIMPLE)) + if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SIMPLE)) { return; } diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 012a4b9dd..a0d6dbf92 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -548,11 +548,17 @@ void LLDrawPoolFullbright::beginPostDeferredPass(S32 pass) { if (LLPipeline::sUnderWaterRender) { - gDeferredFullbrightWaterProgram.bind(); + //gDeferredFullbrightWaterProgram.bind(); + //Use alpha-mask version to ignore alpha values while still allowing us to occlude glow. + gDeferredFullbrightAlphaMaskWaterProgram.bind(); + gDeferredFullbrightAlphaMaskWaterProgram.setMinimumAlpha(0.f); } else { - gDeferredFullbrightProgram.bind(); + //gDeferredFullbrightProgram.bind(); + //Use alpha-mask version to ignore alpha values while still allowing us to occlude glow. + gDeferredFullbrightAlphaMaskProgram.bind(); + gDeferredFullbrightAlphaMaskProgram.setMinimumAlpha(0.f); } } @@ -573,11 +579,11 @@ void LLDrawPoolFullbright::endPostDeferredPass(S32 pass) { if (LLPipeline::sUnderWaterRender) { - gDeferredFullbrightWaterProgram.unbind(); + gDeferredFullbrightAlphaMaskWaterProgram.unbind(); } else { - gDeferredFullbrightProgram.unbind(); + gDeferredFullbrightAlphaMaskProgram.unbind(); } LLRenderPass::endRenderPass(pass); } diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 0872f5f9d..12f91ea67 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -253,6 +253,7 @@ void LLDrawPoolWater::render(S32 pass) glClearStencil(1); glClear(GL_STENCIL_BUFFER_BIT); + glClearStencil(0); LLGLEnable gls_stencil(GL_STENCIL_TEST); glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP); glStencilFunc(GL_ALWAYS, 0, 0xFFFFFFFF); diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 3d0762132..864975460 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -326,6 +326,7 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass) const F32 camHeightLocal = LLWLParamManager::getInstance()->getDomeOffset() * LLWLParamManager::getInstance()->getDomeRadius(); + LLGLDisable stencil(GL_STENCIL_TEST); LLGLSNoFog disableFog; LLGLDepthTest depth(GL_TRUE, GL_FALSE); LLGLDisable clip(GL_CLIP_PLANE0); diff --git a/indra/newview/llemote.cpp b/indra/newview/llemote.cpp index c83846215..47bd57969 100644 --- a/indra/newview/llemote.cpp +++ b/indra/newview/llemote.cpp @@ -48,7 +48,7 @@ // LLEmote() // Class Constructor //----------------------------------------------------------------------------- -LLEmote::LLEmote(const LLUUID &id) : LLMotion(id) +LLEmote::LLEmote(LLUUID const& id, LLMotionController* controller) : LLMotion(id, controller) { mCharacter = NULL; diff --git a/indra/newview/llemote.h b/indra/newview/llemote.h index 99d05b9a2..173719121 100644 --- a/indra/newview/llemote.h +++ b/indra/newview/llemote.h @@ -55,7 +55,7 @@ class LLEmote : { public: // Constructor - LLEmote(const LLUUID &id); + LLEmote(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLEmote(); @@ -67,7 +67,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLEmote(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLEmote(id, controller); } public: //------------------------------------------------------------------------- diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 5947a0717..15430989e 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1338,9 +1338,12 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } } - if (shiny_in_alpha) + if(getPoolType() == LLDrawPool::POOL_FULLBRIGHT) + { + color.mV[3] = 1.f; //Simple fullbright reads alpha for fog contrib, not shiny/transparency, so since opaque, force to 1. + } + else if (shiny_in_alpha) { - GLfloat alpha[4] = { 0.00f, diff --git a/indra/newview/llfloateravatarlist.cpp b/indra/newview/llfloateravatarlist.cpp index dadab1ee1..86d87d049 100644 --- a/indra/newview/llfloateravatarlist.cpp +++ b/indra/newview/llfloateravatarlist.cpp @@ -291,7 +291,7 @@ LLFloaterAvatarList::~LLFloaterAvatarList() } //static -void LLFloaterAvatarList::toggle(void*) +void LLFloaterAvatarList::toggleInstance(const LLSD&) { // [RLVa:KB] if(gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) @@ -301,7 +301,7 @@ void LLFloaterAvatarList::toggle(void*) } else // [/RLVa:KB] - if(!instanceExists() || !getInstance()->getVisible()) + if (!instanceVisible()) { showInstance(); } @@ -603,8 +603,9 @@ void LLFloaterAvatarList::updateAvatarList() { const LLUUID &avid = avatar_ids[i]; + static const LLCachedControl namesystem("RadarNameSystem"); std::string name; - if (!LLAvatarNameCache::getPNSName(avid, name)) + if (!LLAvatarNameCache::getPNSName(avid, name, namesystem)) continue; //prevent (Loading...) LLAvatarListEntry* entry = getAvatarEntry(avid); diff --git a/indra/newview/llfloateravatarlist.h b/indra/newview/llfloateravatarlist.h index 57eb980dd..a18b4f9cb 100644 --- a/indra/newview/llfloateravatarlist.h +++ b/indra/newview/llfloateravatarlist.h @@ -212,10 +212,10 @@ public: * @brief Toggles interface visibility * There is only one instance of the avatar scanner at any time. */ - static void toggle(void*); + static void toggleInstance(const LLSD& = LLSD()); static void showInstance(); - static bool instanceVisible() { return instanceExists() && instance().getVisible(); } + static bool instanceVisible(const LLSD& = LLSD()) { return instanceExists() && instance().getVisible(); } // Decides which user-chosen columns to show and hide. void assessColumns(); diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp index 58e27b914..251397fa6 100644 --- a/indra/newview/llfloaterbvhpreview.cpp +++ b/indra/newview/llfloaterbvhpreview.cpp @@ -375,6 +375,10 @@ BOOL LLFloaterBvhPreview::postBuild() } } + if (motionp && mInWorld) + { + gAgentAvatarp->removeMotion(mMotionID); + } //setEnabled(FALSE); mMotionID.setNull(); mAnimPreview = NULL; diff --git a/indra/newview/llfloaterbvhpreview.h b/indra/newview/llfloaterbvhpreview.h index 7f31054c0..deae420fb 100644 --- a/indra/newview/llfloaterbvhpreview.h +++ b/indra/newview/llfloaterbvhpreview.h @@ -42,7 +42,7 @@ class LLViewerJointMesh; class LLPreviewAnimation : public LLViewerDynamicTexture { -protected: +public: virtual ~LLPreviewAnimation(); public: diff --git a/indra/newview/llfloatercustomize.cpp b/indra/newview/llfloatercustomize.cpp index 0df0663b9..fdba40110 100644 --- a/indra/newview/llfloatercustomize.cpp +++ b/indra/newview/llfloatercustomize.cpp @@ -253,6 +253,8 @@ void LLFloaterCustomize::editWearable(LLViewerWearable* wearable, bool disable_c //static void LLFloaterCustomize::show() { + if (!gAgentWearables.areWearablesLoaded()) return; + if(!LLFloaterCustomize::instanceExists()) { const BOOL disable_camera_switch = LLWearableType::getDisableCameraSwitch(LLWearableType::WT_SHAPE); diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp index 3cf67821f..33ae1b35f 100644 --- a/indra/newview/llfloaterdaycycle.cpp +++ b/indra/newview/llfloaterdaycycle.cpp @@ -59,6 +59,7 @@ #include "llwlparammanager.h" #include "llfloaterwindlight.h" +#include "rlvactions.h" LLFloaterDayCycle* LLFloaterDayCycle::sDayCycle = NULL; std::map LLFloaterDayCycle::sSliderToKey; @@ -277,6 +278,7 @@ bool LLFloaterDayCycle::isOpen() void LLFloaterDayCycle::show() { + if (RlvActions::hasBehaviour(RLV_BHVR_SETENV)) return; LLFloaterDayCycle* dayCycle = instance(); dayCycle->syncMenu(); syncSliderTrack(); diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp index 57a952244..c28501932 100644 --- a/indra/newview/llfloaterenvsettings.cpp +++ b/indra/newview/llfloaterenvsettings.cpp @@ -50,6 +50,7 @@ #include "llviewerwindow.h" #include "pipeline.h" +#include "rlvactions.h" #include @@ -175,13 +176,12 @@ LLFloaterEnvSettings* LLFloaterEnvSettings::instance() if (!sEnvSettings) { sEnvSettings = new LLFloaterEnvSettings(); - sEnvSettings->open(); - sEnvSettings->setFocus(TRUE); } return sEnvSettings; } void LLFloaterEnvSettings::show() { + if (RlvActions::hasBehaviour(RLV_BHVR_SETENV)) return; LLFloaterEnvSettings* envSettings = instance(); envSettings->syncMenu(); @@ -189,7 +189,10 @@ void LLFloaterEnvSettings::show() //LLUICtrlFactory::getInstance()->buildFloater(envSettings, "floater_env_settings.xml"); //envSettings->initCallbacks(); - envSettings->open(); + if (envSettings->getVisible()) + envSettings->close(); + else + envSettings->open(); } bool LLFloaterEnvSettings::isOpen() diff --git a/indra/newview/llfloaterexploreanimations.cpp b/indra/newview/llfloaterexploreanimations.cpp index 5ffe000b6..bfc08d700 100644 --- a/indra/newview/llfloaterexploreanimations.cpp +++ b/indra/newview/llfloaterexploreanimations.cpp @@ -4,6 +4,7 @@ #include "llfloaterexploreanimations.h" #include "lluictrlfactory.h" #include "llscrolllistctrl.h" +#include "llagentdata.h" #include "llfloaterbvhpreview.h" #include "llvoavatar.h" #include "llviewercamera.h" @@ -14,42 +15,51 @@ #include "llselectmgr.h" // -std::map< LLUUID, std::list< LLAnimHistoryItem* > > LLFloaterExploreAnimations::animHistory; -LLFloaterExploreAnimations* LLFloaterExploreAnimations::sInstance; +std::map< LLUUID, std::list< LLAnimHistoryItem > > LLFloaterExploreAnimations::animHistory; - -LLAnimHistoryItem::LLAnimHistoryItem(LLUUID assetid) +LLAnimHistoryItem::LLAnimHistoryItem(LLUUID assetid, bool playing) +: mAssetID(assetid) +, mPlaying(playing) +, mTimeStarted(LLTimer::getElapsedSeconds()) +, mTimeStopped(playing ? 0.f : mTimeStarted) +{} +bool LLAnimHistoryItem::setPlaying(bool playing) { - mAssetID = assetid; + if (mPlaying == playing) return false; + mPlaying = playing; + playing ? mTimeStarted : mTimeStopped = LLTimer::getElapsedSeconds(); + return true; } -LLFloaterExploreAnimations::LLFloaterExploreAnimations(LLUUID avatarid) -: LLFloater() +void LLFloaterExploreAnimations::show() +{ + LLViewerObject* avatar = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + const LLUUID& id(avatar ? avatar->getID() : gAgentID); + if (LLFloaterExploreAnimations* f = getInstance(id)) + if (avatar) f->open(); + else f->close(); + else + (new LLFloaterExploreAnimations(id))->open(); +} + +LLFloaterExploreAnimations::LLFloaterExploreAnimations(const LLUUID avatarid) +: LLInstanceTracker(avatarid) +, mAnimPreview(256, 256) { mLastMouseX = 0; mLastMouseY = 0; - LLFloaterExploreAnimations::sInstance = this; - mAvatarID = avatarid; - mAnimPreview = new LLPreviewAnimation(256, 256); - mAnimPreview->setZoom(2.0f); + mAnimPreview.setZoom(2.0f); LLUICtrlFactory::getInstance()->buildFloater(this, "floater_explore_animations.xml"); } -void LLFloaterExploreAnimations::close(bool app_quitting) -{ - LLFloater::close(app_quitting); -} - LLFloaterExploreAnimations::~LLFloaterExploreAnimations() { - mAnimPreview = NULL; - LLFloaterExploreAnimations::sInstance = NULL; } -BOOL LLFloaterExploreAnimations::postBuild(void) +BOOL LLFloaterExploreAnimations::postBuild() { - childSetCommitCallback("anim_list", onSelectAnimation, this); + getChild("anim_list")->setCommitCallback(boost::bind(&LLFloaterExploreAnimations::onSelectAnimation, this)); LLRect r = getRect(); mPreviewRect.set(r.getWidth() - 266, r.getHeight() - 25, r.getWidth() - 10, r.getHeight() - 256); update(); @@ -59,29 +69,28 @@ BOOL LLFloaterExploreAnimations::postBuild(void) void LLFloaterExploreAnimations::update() { LLScrollListCtrl* list = getChild("anim_list"); - LLUUID selection = list->getSelectedValue().asUUID(); + LLUUID selection = list->getCurrentID(); list->clearRows(); // do this differently probably - std::list history = animHistory[mAvatarID]; - std::list::iterator iter = history.begin(); - std::list::iterator end = history.end(); - for( ; iter != end; ++iter) + std::list history = animHistory[getKey()]; + std::list::iterator end = history.end(); + for(std::list::iterator iter = history.begin(); iter != end; ++iter) { - LLAnimHistoryItem* item = (*iter); + LLAnimHistoryItem item = (*iter); LLSD element; - element["id"] = item->mAssetID; + element["id"] = item.mAssetID; LLSD& name_column = element["columns"][0]; name_column["column"] = "name"; - name_column["value"] = item->mAssetID.asString(); + name_column["value"] = item.mAssetID.asString(); LLSD& info_column = element["columns"][1]; info_column["column"] = "info"; - if(item->mPlaying) + if(item.mPlaying) info_column["value"] = "Playing"; else - info_column["value"] = llformat("%.1f min ago", (LLTimer::getElapsedSeconds() - item->mTimeStopped) / 60.f); + info_column["value"] = llformat("%.1f min ago", (LLTimer::getElapsedSeconds() - item.mTimeStopped) / 60.f); list->addElement(element, ADD_BOTTOM); } @@ -98,7 +107,7 @@ void LLFloaterExploreAnimations::draw() gGL.color3f(1.f, 1.f, 1.f); - gGL.getTexUnit(0)->bind(mAnimPreview); + gGL.getTexUnit(0)->bind(&mAnimPreview); gGL.begin( LLRender::QUADS ); { @@ -115,157 +124,82 @@ void LLFloaterExploreAnimations::draw() gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - //LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar(); + //LLVOAvatar* avatarp = mAnimPreview.getDummyAvatar(); //if (!avatarp->areAnimationsPaused()) //{ - // mAnimPreview->requestUpdate(); + // mAnimPreview.requestUpdate(); //} } - - - - // static -void LLFloaterExploreAnimations::startAnim(LLUUID avatarid, LLUUID assetid) +void LLFloaterExploreAnimations::processAnim(LLUUID avatarid, LLUUID assetid, bool playing) { std::string asset_str = assetid.asString(); if(asset_str.find("17132261-c061") != std::string::npos) return; // dog1 else if(asset_str.find("fea558cb-8b9b") != std::string::npos) return; // dog2 else if(asset_str.find("50cb5750-0743") != std::string::npos) return; // dog3 - else if(asset_str.find("-dead-") != std::string::npos) return; // emo - LLAnimHistoryItem* item = NULL; - - std::list history = animHistory[avatarid]; - std::list::iterator iter = history.begin(); - std::list::iterator end = history.end(); - for( ; iter != end; ++iter) + std::list& history = animHistory[avatarid]; + std::list::iterator end = history.end(); + for(std::list::iterator iter = history.begin(); iter != end; ++iter) { - if((*iter)->mAssetID == assetid) - { - item = (*iter); - break; - } + LLAnimHistoryItem& item = (*iter); + if (item.mAssetID != assetid) continue; + if (item.setPlaying(playing)) + handleHistoryChange(avatarid); + return; } - if(!item) - { - item = new LLAnimHistoryItem(assetid); - item->mAvatarID = avatarid; - item->mTimeStarted = LLTimer::getElapsedSeconds(); - } - item->mPlaying = true; - history.push_back(item); - animHistory[avatarid] = history; // is this really necessary? - handleHistoryChange(); -} + // Trim it + if (history.size() > 31) + history.resize(31); -// static -void LLFloaterExploreAnimations::stopAnim(LLUUID avatarid, LLUUID assetid) -{ - std::string asset_str = assetid.asString(); - if(asset_str.find("17132261-c061") != std::string::npos) return; // dog1 - else if(asset_str.find("fea558cb-8b9b") != std::string::npos) return; // dog2 - else if(asset_str.find("50cb5750-0743") != std::string::npos) return; // dog3 - else if(asset_str.find("-dead-") != std::string::npos) return; // emo - - LLAnimHistoryItem* item = NULL; - - std::list history = animHistory[avatarid]; - std::list::iterator iter = history.begin(); - std::list::iterator end = history.end(); - for( ; iter != end; ++iter) - { - if((*iter)->mAssetID == assetid) - { - item = (*iter); - break; - } - } - if(!item) - { - item = new LLAnimHistoryItem(assetid); - item->mAvatarID = avatarid; - item->mTimeStarted = LLTimer::getElapsedSeconds(); - history.push_back(item); - } - item->mPlaying = false; - item->mTimeStopped = LLTimer::getElapsedSeconds(); - handleHistoryChange(); + history.push_back(LLAnimHistoryItem(assetid, playing)); + handleHistoryChange(avatarid); } class LLAnimHistoryItemCompare { public: - bool operator() (LLAnimHistoryItem* first, LLAnimHistoryItem* second) + bool operator() (LLAnimHistoryItem first, LLAnimHistoryItem second) { - if(first->mPlaying) + if (first.mPlaying) { - if(second->mPlaying) + if (second.mPlaying) { - return (first->mTimeStarted > second->mTimeStarted); + return (first.mTimeStarted > second.mTimeStarted); } else { return true; } } - else if(second->mPlaying) + else if (second.mPlaying) { return false; } else { - return (first->mTimeStopped > second->mTimeStopped); + return (first.mTimeStopped > second.mTimeStopped); } } }; // static -void LLFloaterExploreAnimations::handleHistoryChange() +void LLFloaterExploreAnimations::handleHistoryChange(LLUUID avatarid) { - std::map< LLUUID, std::list< LLAnimHistoryItem* > >::iterator av_iter = animHistory.begin(); - std::map< LLUUID, std::list< LLAnimHistoryItem* > >::iterator av_end = animHistory.end(); - for( ; av_iter != av_end; ++av_iter) - { - std::list history = (*av_iter).second; - - // Sort it - LLAnimHistoryItemCompare c; - history.sort(c); - - // Remove dupes - history.unique(); - - // Trim it - if(history.size() > 32) - { - history.resize(32); - } - - animHistory[(*av_iter).first] = history; - } + // Sort it + animHistory[avatarid].sort(LLAnimHistoryItemCompare()); // Update floater - if(LLFloaterExploreAnimations::sInstance) - LLFloaterExploreAnimations::sInstance->update(); + if (LLFloaterExploreAnimations* f = getInstance(avatarid)) + f->update(); } - - - - -// static -void LLFloaterExploreAnimations::onSelectAnimation(LLUICtrl* ctrl, void* user_data) +void LLFloaterExploreAnimations::onSelectAnimation() { - LLFloaterExploreAnimations* floater = (LLFloaterExploreAnimations*)user_data; - LLPreviewAnimation* preview = (LLPreviewAnimation*)floater->mAnimPreview; - LLScrollListCtrl* list = floater->getChild("anim_list"); - LLUUID selection = list->getSelectedValue().asUUID(); - - preview->getDummyAvatar()->deactivateAllMotions(); - preview->getDummyAvatar()->startMotion(selection, 0.f); - preview->setZoom(2.0f); + mAnimPreview.getDummyAvatar()->deactivateAllMotions(); + mAnimPreview.getDummyAvatar()->startMotion(getChild("anim_list")->getCurrentID(), 0.f); + mAnimPreview.setZoom(2.0f); } //----------------------------------------------------------------------------- @@ -305,35 +239,35 @@ BOOL LLFloaterExploreAnimations::handleHover(S32 x, S32 y, MASK mask) { MASK local_mask = mask & ~MASK_ALT; - if (mAnimPreview && hasMouseCapture()) + if (hasMouseCapture()) { if (local_mask == MASK_PAN) { // pan here - mAnimPreview->pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f); + mAnimPreview.pan((F32)(x - mLastMouseX) * -0.005f, (F32)(y - mLastMouseY) * -0.005f); } else if (local_mask == MASK_ORBIT) { F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f; F32 pitch_radians = (F32)(y - mLastMouseY) * 0.02f; - mAnimPreview->rotate(yaw_radians, pitch_radians); + mAnimPreview.rotate(yaw_radians, pitch_radians); } else { F32 yaw_radians = (F32)(x - mLastMouseX) * -0.01f; F32 zoom_amt = (F32)(y - mLastMouseY) * 0.02f; - mAnimPreview->rotate(yaw_radians, 0.f); - mAnimPreview->zoom(zoom_amt); + mAnimPreview.rotate(yaw_radians, 0.f); + mAnimPreview.zoom(zoom_amt); } - mAnimPreview->requestUpdate(); + mAnimPreview.requestUpdate(); LLUI::setMousePositionLocal(this, mLastMouseX, mLastMouseY); } - if (!mPreviewRect.pointInRect(x, y) || !mAnimPreview) + if (!mPreviewRect.pointInRect(x, y)) { return LLFloater::handleHover(x, y, mask); } @@ -358,8 +292,8 @@ BOOL LLFloaterExploreAnimations::handleHover(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterExploreAnimations::handleScrollWheel(S32 x, S32 y, S32 clicks) { - mAnimPreview->zoom((F32)clicks * -0.2f); - mAnimPreview->requestUpdate(); + mAnimPreview.zoom((F32)clicks * -0.2f); + mAnimPreview.requestUpdate(); return TRUE; } diff --git a/indra/newview/llfloaterexploreanimations.h b/indra/newview/llfloaterexploreanimations.h index 383b16e6d..95d97c050 100644 --- a/indra/newview/llfloaterexploreanimations.h +++ b/indra/newview/llfloaterexploreanimations.h @@ -2,16 +2,15 @@ #ifndef LL_LLFLOATEREXPLOREANIMATIONS_H #define LL_LLFLOATEREXPLOREANIMATIONS_H -#include "llfloater.h" #include "llfloaterbvhpreview.h" -#include "llviewerwindow.h" // gViewerWindow +#include "llinstancetracker.h" class LLAnimHistoryItem { public: - LLAnimHistoryItem(LLUUID assetid); + LLAnimHistoryItem(LLUUID assetid = LLUUID(), bool playing = true); + bool setPlaying(bool playing); - LLUUID mAvatarID; LLUUID mAssetID; bool mPlaying; F64 mTimeStarted; @@ -19,25 +18,20 @@ public: }; class LLFloaterExploreAnimations -: public LLFloater +: public LLFloater, public LLInstanceTracker { public: + static void show(); LLFloaterExploreAnimations(LLUUID avatarid); - BOOL postBuild(void); - void close(bool app_quitting); + BOOL postBuild(); void update(); - LLUUID mAvatarID; - LLPointer mAnimPreview; - private: virtual ~LLFloaterExploreAnimations(); - -// static stuff! public: - static void onSelectAnimation(LLUICtrl* ctrl, void* user_data); + void onSelectAnimation(); BOOL handleMouseDown(S32 x, S32 y, MASK mask); BOOL handleMouseUp(S32 x, S32 y, MASK mask); @@ -45,16 +39,17 @@ public: BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); void onMouseCaptureLost(); - static void startAnim(LLUUID avatarid, LLUUID assetid); - static void stopAnim(LLUUID avatarid, LLUUID assetid); +// static stuff! + static void processAnim(LLUUID avatarid, LLUUID assetid, bool playing); - static std::map< LLUUID, std::list< LLAnimHistoryItem* > > animHistory; - static LLFloaterExploreAnimations* sInstance; + static std::map< LLUUID, std::list< LLAnimHistoryItem > > animHistory; private: - static void handleHistoryChange(); + static void handleHistoryChange(LLUUID avatarid); protected: void draw(); + + LLPreviewAnimation mAnimPreview; LLRect mPreviewRect; S32 mLastMouseX; S32 mLastMouseY; diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp index 303b985c7..d85ea0f59 100644 --- a/indra/newview/llfloaterfriends.cpp +++ b/indra/newview/llfloaterfriends.cpp @@ -407,6 +407,12 @@ BOOL LLPanelFriends::postBuild() return TRUE; } +static const S32& friend_name_system() +{ + static const LLCachedControl name_system("FriendNameSystem", 0); + return name_system; +} + BOOL LLPanelFriends::addFriend(const LLUUID& agent_id) { LLAvatarTracker& at = LLAvatarTracker::instance(); @@ -417,7 +423,7 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id) bool isOnline = relationInfo->isOnline(); std::string fullname; - BOOL have_name = LLAvatarNameCache::getPNSName(agent_id, fullname); + bool have_name = LLAvatarNameCache::getPNSName(agent_id, fullname, friend_name_system()); if (!have_name) gCacheName->getFullName(agent_id, fullname); LLSD element; @@ -505,7 +511,7 @@ BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationsh bool isOnline = info->isOnline(); std::string fullname; - BOOL have_name = LLAvatarNameCache::getPNSName(agent_id, fullname); + bool have_name = LLAvatarNameCache::getPNSName(agent_id, fullname, friend_name_system()); if (!have_name) gCacheName->getFullName(agent_id, fullname); // Name of the status icon to use @@ -1083,7 +1089,7 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& rights, EGrantRevoke comm { LLSD args; std::string fullname; - if (LLAvatarNameCache::getPNSName(rights.begin()->first, fullname)) + if (LLAvatarNameCache::getPNSName(rights.begin()->first, fullname, friend_name_system())) args["NAME"] = fullname; if (command == GRANT) diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 4a146a4e2..7e2ad97c3 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -174,9 +174,9 @@ void LLFloaterGesture::show() } // static -void LLFloaterGesture::toggleVisibility() +void LLFloaterGesture::toggleInstance(const LLSD&) { - if(sInstance && sInstance->getVisible()) + if (instanceVisible()) { sInstance->close(); } @@ -187,7 +187,7 @@ void LLFloaterGesture::toggleVisibility() } // static -bool LLFloaterGesture::instanceVisible() +bool LLFloaterGesture::instanceVisible(const LLSD&) { return sInstance && sInstance->getVisible(); } diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h index 0ded59467..40bb1de96 100644 --- a/indra/newview/llfloatergesture.h +++ b/indra/newview/llfloatergesture.h @@ -62,9 +62,9 @@ public: virtual BOOL postBuild(); static void show(); - static void toggleVisibility(); + static void toggleInstance(const LLSD& = LLSD()); static void refreshAll(); - static bool instanceVisible(); + static bool instanceVisible(const LLSD& = LLSD()); protected: // Reads from the gesture manager's list of active gestures diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7c5801680..4c063e953 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -882,12 +882,6 @@ void LLPanelLandGeneral::setGroup(const LLUUID& group_id) // static void LLPanelLandGeneral::onClickBuyLand(void* data) { -// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) - if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ) - { - return; - } -// [/RLVa:KB] BOOL* for_group = (BOOL*)data; LLViewerParcelMgr::getInstance()->startBuyLand(*for_group); } diff --git a/indra/newview/llfloatermemleak.cpp b/indra/newview/llfloatermemleak.cpp index df51918e3..a15bd9520 100644 --- a/indra/newview/llfloatermemleak.cpp +++ b/indra/newview/llfloatermemleak.cpp @@ -256,6 +256,10 @@ LLFloaterMemLeak* LLFloaterMemLeak::instance() void LLFloaterMemLeak::show(void*) { +#ifdef LL_RELEASE_FOR_DOWNLOAD + if (!gSavedSettings.getBOOL("QAMode")) + return; // Singu Note: We should probably tell them why this won't work before returning. +#endif instance()->open(); } diff --git a/indra/newview/llfloatermute.cpp b/indra/newview/llfloatermute.cpp index b4ea23ef4..cced63ab1 100644 --- a/indra/newview/llfloatermute.cpp +++ b/indra/newview/llfloatermute.cpp @@ -182,19 +182,12 @@ LLFloaterMute::LLFloaterMute(const LLSD& seed) : LLFloater(std::string("mute floater"), std::string("FloaterMuteRect3"), FLOATER_TITLE, RESIZE_YES, 220, 140, DRAG_ON_TOP, MINIMIZE_YES, CLOSE_YES) { - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_mute.xml", NULL, FALSE); } -// LLMuteListObserver callback interface implementation. -/* virtual */ void LLFloaterMute::onChange() -{ - refreshMuteList(); -} - BOOL LLFloaterMute::postBuild() { - childSetCommitCallback("mutes", onSelectName, this); + childSetCommitCallback("mutes", boost::bind(&LLFloaterMute::updateButtons, this)); childSetAction("Mute resident...", onClickPick, this); childSetAction("Mute object by name...", onClickMuteByName, this); childSetAction("Unmute", onClickRemove, this); @@ -233,17 +226,11 @@ void LLFloaterMute::refreshMuteList() mMuteDict.clear(); std::vector mutes = LLMuteList::getInstance()->getMutes(); - std::vector::iterator it; - U32 count = 0; - for (it = mutes.begin(); it != mutes.end(); ++it) + for (std::vector::iterator it = mutes.begin(); it != mutes.end(); ++it) { std::string display_name = it->mName; LLNameListCtrl::NameItem element; - LLUUID entry_id; - if(it->mType == LLMute::GROUP || it->mType == LLMute::AGENT) - entry_id = it->mID; - else - entry_id.generate(boost::lexical_cast( count++ )); + LLUUID entry_id = it->mID; mMuteDict.insert(std::make_pair(entry_id,*it)); element.value = entry_id; element.name = display_name; @@ -299,24 +286,7 @@ void LLFloaterMute::selectMute(const LLUUID& mute_id) //----------------------------------------------------------------------------- void LLFloaterMute::updateButtons() { - if (mMuteList->getFirstSelected()) - { - childSetEnabled("Unmute", TRUE); - } - else - { - childSetEnabled("Unmute", FALSE); - } -} - -//----------------------------------------------------------------------------- -// onSelectName() -//----------------------------------------------------------------------------- -void LLFloaterMute::onSelectName(LLUICtrl *caller, void *data) -{ - LLFloaterMute *floater = (LLFloaterMute*)data; - - floater->updateButtons(); + getChildView("Unmute")->setEnabled(!!mMuteList->getFirstSelected()); } //----------------------------------------------------------------------------- @@ -328,11 +298,11 @@ void LLFloaterMute::onClickRemove(void *data) S32 last_selected = floater->mMuteList->getFirstSelectedIndex(); bool removed = false; - const std::vector items = floater->mMuteList->getAllSelected(); - for(std::vector::const_iterator it = items.begin(); it != items.end(); ++it) + uuid_vec_t items = floater->mMuteList->getSelectedIDs(); + for(uuid_vec_t::const_iterator it = items.begin(); it != items.end(); ++it) { - std::map::iterator mute_it = floater->mMuteDict.find((*it)->getUUID()); - if(mute_it != floater->mMuteDict.end() && LLMuteList::getInstance()->remove(mute_it->second)) + std::map::iterator mute_it = floater->mMuteDict.find(*it); + if (mute_it != floater->mMuteDict.end() && LLMuteList::getInstance()->remove(mute_it->second)) { floater->mMuteDict.erase(mute_it); removed = true; diff --git a/indra/newview/llfloatermute.h b/indra/newview/llfloatermute.h index 8abb6afdf..1a04ae198 100644 --- a/indra/newview/llfloatermute.h +++ b/indra/newview/llfloatermute.h @@ -63,13 +63,12 @@ public: void updateButtons(); // LLMuteListObserver callback interface implementation. - /* virtual */ void onChange(); + /* virtual */ void onChange() { refreshMuteList(); } private: // UI callbacks static void onClickRemove(void *data); static void onClickPick(void *data); - static void onSelectName(LLUICtrl* caller, void *data); void onPickUser(const uuid_vec_t& ids, const std::vector& names); static void onClickMuteByName(void*); static void callbackMuteByName(const std::string& text, void*); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index d41cbf17a..31cf83c4a 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -43,6 +43,7 @@ #include "llfontgl.h" #include "llimagej2c.h" #include "llinventory.h" +#include "llmenugl.h" #include "llnotificationsutil.h" #include "llstring.h" #include "llsys.h" @@ -462,6 +463,8 @@ void LLFloaterReporter::showFromMenu(EReportType report_type) return; } + // Prevent menu from appearing in screen shot. + LLMenuGL::sMenuContainer->hideMenus(); LLFloaterReporter* f = getInstance(); if (f) { diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp index f444a7cbc..43507d0fd 100644 --- a/indra/newview/llfloaterwater.cpp +++ b/indra/newview/llfloaterwater.cpp @@ -48,6 +48,7 @@ #include "llagent.h" #include "llwaterparammanager.h" #include "llwaterparamset.h" +#include "rlvactions.h" #undef max // Fixes a Windows compiler error @@ -284,6 +285,7 @@ LLFloaterWater* LLFloaterWater::instance() } void LLFloaterWater::show() { + if (RlvActions::hasBehaviour(RLV_BHVR_SETENV)) return; if (!sWaterMenu) { LLFloaterWater* water = instance(); diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index eef650101..9f6acb60b 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -611,8 +611,9 @@ void LLHUDEffectLookAt::update() { if (calcTargetPosition()) { - LLMotion* head_motion = ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->findMotion(ANIM_AGENT_HEAD_ROT); - if (!head_motion || head_motion->isStopped()) + //LLMotion* head_motion = ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->findMotion(ANIM_AGENT_HEAD_ROT); + //if (!head_motion || head_motion->isStopped()) + // singu: startMotion does basically the same as the above two lines... it starts it, unless it was already started. { ((LLVOAvatar*)(LLViewerObject*)mSourceObject)->startMotion(ANIM_AGENT_HEAD_ROT); } diff --git a/indra/newview/llhudmanager.cpp b/indra/newview/llhudmanager.cpp index cb9a2c1d3..15872a0db 100644 --- a/indra/newview/llhudmanager.cpp +++ b/indra/newview/llhudmanager.cpp @@ -80,14 +80,33 @@ void LLHUDManager::updateEffects() void LLHUDManager::sendEffects() { + static LLCachedControl disable_lookat_effect(gSavedSettings, "PrivateLookAt", false); + static LLCachedControl disable_pointat_effect(gSavedSettings, "DisablePointAtAndBeam", false); + static LLCachedControl broadcast_viewer_effects(gSavedSettings, "BroadcastViewerEffects", true); - if(!gSavedSettings.getBOOL("BroadcastViewerEffects")) - return; - S32 i; for (i = 0; i < mHUDEffects.count(); i++) { LLHUDEffect *hep = mHUDEffects[i]; + if (hep->mType == LLHUDObject::LL_HUD_EFFECT_LOOKAT) + { + if (disable_lookat_effect) + { + continue; + } + } + else if (hep->mType == LLHUDObject::LL_HUD_EFFECT_POINTAT || + hep->mType == LLHUDObject::LL_HUD_EFFECT_BEAM) + { + if (disable_pointat_effect) + { + continue; + } + } + else if (!broadcast_viewer_effects) + { + continue; + } if (hep->isDead()) { llwarns << "Trying to send dead effect!" << llendl; diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index f97d320a2..aaf79dbfc 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -60,7 +60,7 @@ #include "llviewerwindow.h" #include "llvoicechannel.h" -#include "boost/algorithm/string.hpp" +#include // [RLVa:KB] - Checked: 2013-05-10 (RLVa-1.4.9) #include "rlvactions.h" @@ -321,6 +321,7 @@ LLFloaterIMPanel::LLFloaterIMPanel( case IM_SESSION_GROUP_START: case IM_SESSION_INVITE: case IM_SESSION_CONFERENCE_START: + mCommitCallbackRegistrar.add("FlipDing", boost::bind(boost::lambda::_1 = !boost::lambda::_1, boost::ref(mDing))); // determine whether it is group or conference session if (gAgent.isInGroup(mSessionUUID)) { @@ -442,12 +443,12 @@ LLFloaterIMPanel::~LLFloaterIMPanel() // virtual void LLFloaterIMPanel::changed(U32 mask) { - if (mask & REMOVE|ADD) // Fix remove/add friend choices + if (mask & (REMOVE|ADD)) // Fix remove/add friend choices rebuildDynamics(getChild("instant_message_flyout")); /* Singu TODO: Chat UI - Online icons? if (mask & ONLINE) // Show online icon here - else if (mask & NONE) + else // Show offline icon here */ } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 5b8ea8410..323263d76 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1766,7 +1766,8 @@ BOOL LLItemBridge::removeItem() cat_array, item_array, LLInventoryModel::INCLUDE_TRASH, - is_linked_item_match); + is_linked_item_match, + true); const U32 num_links = cat_array.size() + item_array.size(); if (num_links > 0) @@ -3254,7 +3255,8 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, - is_type); + is_type, + true); return ((item_array.count() > 0) ? TRUE : FALSE ); } @@ -3542,6 +3544,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, // DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER. // If we have an item of AT_LINK_FOLDER type we should process the linked // category being dragged or dropped into folder. + /* Note: No, we shouldn't, this behavior is misleading, just copy the link as usual. if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType()) { LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID()); @@ -3551,6 +3554,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, } } else + */ { accept = dragItemIntoFolder(inv_item, drop); } @@ -5595,7 +5599,8 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_ cat_array, item_array, LLInventoryModel::EXCLUDE_TRASH, - is_wearable); + is_wearable, + true); S32 i; S32 wearable_count = item_array.count(); @@ -5606,7 +5611,8 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_ obj_cat_array, obj_item_array, LLInventoryModel::EXCLUDE_TRASH, - is_object); + is_object, + true); S32 obj_count = obj_item_array.count(); // Find all gestures in this folder @@ -5617,7 +5623,8 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_ gest_cat_array, gest_item_array, LLInventoryModel::EXCLUDE_TRASH, - is_gesture); + is_gesture, + true); S32 gest_count = gest_item_array.count(); if (wearable_count > 0) //Loop through wearables. If worn, remove. diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index bdbc132c5..f9a3b0cdd 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1676,6 +1676,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal, glStencilMask(stencil_mask); glClearStencil(1); glClear(GL_STENCIL_BUFFER_BIT); + glClearStencil(0); LLGLEnable cull_face(GL_CULL_FACE); LLGLEnable stencil(GL_STENCIL_TEST); LLGLDepthTest depth (GL_TRUE, GL_FALSE, GL_ALWAYS); diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp index 31038b4aa..654cba5a0 100644 --- a/indra/newview/llmediadataclient.cpp +++ b/indra/newview/llmediadataclient.cpp @@ -92,7 +92,7 @@ std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::Request &q); template -static typename T::iterator find_matching_request(T &c, const LLMediaDataClient::Request *request, LLMediaDataClient::Request::Type match_type) +typename T::iterator find_matching_request(T &c, const LLMediaDataClient::Request *request, LLMediaDataClient::Request::Type match_type) { for(typename T::iterator iter = c.begin(); iter != c.end(); ++iter) { @@ -106,7 +106,7 @@ static typename T::iterator find_matching_request(T &c, const LLMediaDataClient: } template -static typename T::iterator find_matching_request(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type) +typename T::iterator find_matching_request(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type) { for(typename T::iterator iter = c.begin(); iter != c.end(); ++iter) { @@ -123,7 +123,7 @@ static typename T::iterator find_matching_request(T &c, const LLUUID &id, LLMedi // to other elements in the container (such as std::vector). // If the implementation is changed to use a container with this property, this will need to be revisited. template -static void remove_matching_requests(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type) +void remove_matching_requests(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type) { for(typename T::iterator iter = c.begin(); iter != c.end();) { @@ -171,10 +171,10 @@ bool LLMediaDataClient::isEmpty() const bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object) { - if(find_matching_request(mQueue, object->getID()) != mQueue.end()) + if(find_matching_request(mQueue, object->getID(), LLMediaDataClient::Request::ANY) != mQueue.end()) return true; - if(find_matching_request(mUnQueuedRequests, object->getID()) != mUnQueuedRequests.end()) + if(find_matching_request(mUnQueuedRequests, object->getID(), LLMediaDataClient::Request::ANY) != mUnQueuedRequests.end()) return true; return false; @@ -183,8 +183,8 @@ bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object) void LLMediaDataClient::removeFromQueue(const LLMediaDataClientObject::ptr_t &object) { LL_DEBUGS("LLMediaDataClient") << "removing requests matching ID " << object->getID() << LL_ENDL; - remove_matching_requests(mQueue, object->getID()); - remove_matching_requests(mUnQueuedRequests, object->getID()); + remove_matching_requests(mQueue, object->getID(), LLMediaDataClient::Request::ANY); + remove_matching_requests(mUnQueuedRequests, object->getID(), LLMediaDataClient::Request::ANY); } void LLMediaDataClient::startQueueTimer() @@ -776,7 +776,7 @@ bool LLObjectMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &ob if(LLMediaDataClient::isInQueue(object)) return true; - if(find_matching_request(mRoundRobinQueue, object->getID()) != mRoundRobinQueue.end()) + if(find_matching_request(mRoundRobinQueue, object->getID(), LLMediaDataClient::Request::ANY) != mRoundRobinQueue.end()) return true; return false; @@ -787,7 +787,7 @@ void LLObjectMediaDataClient::removeFromQueue(const LLMediaDataClientObject::ptr // First, call parent impl. LLMediaDataClient::removeFromQueue(object); - remove_matching_requests(mRoundRobinQueue, object->getID()); + remove_matching_requests(mRoundRobinQueue, object->getID(), LLMediaDataClient::Request::ANY); } bool LLObjectMediaDataClient::processQueueTimer() @@ -937,7 +937,7 @@ void LLObjectMediaNavigateClient::enqueue(Request *request) } // If there's already a matching request in the queue, remove it. - request_queue_t::iterator iter = find_matching_request(mQueue, request); + request_queue_t::iterator iter = find_matching_request(mQueue, request, LLMediaDataClient::Request::ANY); if(iter != mQueue.end()) { LL_DEBUGS("LLMediaDataClient") << "removing matching queued request " << (**iter) << LL_ENDL; @@ -945,7 +945,7 @@ void LLObjectMediaNavigateClient::enqueue(Request *request) } else { - request_set_t::iterator set_iter = find_matching_request(mUnQueuedRequests, request); + request_set_t::iterator set_iter = find_matching_request(mUnQueuedRequests, request, LLMediaDataClient::Request::ANY); if(set_iter != mUnQueuedRequests.end()) { LL_DEBUGS("LLMediaDataClient") << "removing matching unqueued request " << (**set_iter) << LL_ENDL; diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h index 19ea5c6ce..093b84468 100644 --- a/indra/newview/llmediadataclient.h +++ b/indra/newview/llmediadataclient.h @@ -282,9 +282,9 @@ private: bool mQueueTimerIsRunning; - template friend typename T::iterator find_matching_request(T &c, const LLMediaDataClient::Request *request, LLMediaDataClient::Request::Type match_type = LLMediaDataClient::Request::ANY); - template friend typename T::iterator find_matching_request(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type = LLMediaDataClient::Request::ANY); - template friend void remove_matching_requests(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type = LLMediaDataClient::Request::ANY); + template friend typename T::iterator find_matching_request(T &c, const LLMediaDataClient::Request *request, LLMediaDataClient::Request::Type match_type); + template friend typename T::iterator find_matching_request(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type); + template friend void remove_matching_requests(T &c, const LLUUID &id, LLMediaDataClient::Request::Type match_type); }; diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp index 652b3ed31..a8eca6107 100644 --- a/indra/newview/llmenucommands.cpp +++ b/indra/newview/llmenucommands.cpp @@ -34,116 +34,257 @@ #include "llmenucommands.h" -#include "imageids.h" -#include "llfontgl.h" -#include "llrect.h" -#include "llerror.h" -#include "llstring.h" -#include "message.h" - -#include "llagent.h" +#include "aihttpview.h" +#include "floaterao.h" +#include "floaterlocalassetbrowse.h" +#include "hbfloatergrouptitles.h" +#include "jcfloaterareasearch.h" #include "llagentcamera.h" -#include "llcallingcard.h" #include "llchatbar.h" -#include "llviewercontrol.h" -#include "llfirstuse.h" +#include "llconsole.h" +#include "lldebugview.h" +#include "llfasttimerview.h" +#include "llfloaterabout.h" +#include "llfloateractivespeakers.h" +#include "llfloateravatarlist.h" +#include "llfloaterbeacons.h" +#include "llfloaterblacklist.h" +#include "llfloaterbuildoptions.h" +#include "llfloaterbump.h" +#include "llfloaterbuycurrency.h" +#include "llfloatercamera.h" #include "llfloaterchat.h" -#include "llfloaterdirectory.h" +#include "llfloaterchatterbox.h" +#include "llfloatercustomize.h" +#include "llfloaterdaycycle.h" +#include "llfloaterdisplayname.h" +#include "llfloatereditui.h" +#include "llfloaterenvsettings.h" +#include "llfloaterexploreanimations.h" +#include "llfloaterexploresounds.h" +#include "llfloaterfonttest.h" +#include "llfloatergesture.h" +#include "llfloatergodtools.h" +#include "llfloaterhud.h" +#include "llfloaterinspect.h" #include "llfloaterinventory.h" +#include "llfloaterlagmeter.h" +#include "llfloaterland.h" +#include "llfloaterlandholdings.h" #include "llfloatermap.h" +#include "llfloatermemleak.h" +#include "llfloatermessagelog.h" +#include "llfloatermute.h" +#include "llfloaternotificationsconsole.h" +#include "llfloateroutbox.h" +#include "llfloaterpathfindingcharacters.h" +#include "llfloaterpathfindinglinksets.h" +#include "llfloaterperms.h" +#include "llfloaterpostprocess.h" +#include "llfloaterpreference.h" +#include "llfloaterregiondebugconsole.h" +#include "llfloaterregioninfo.h" +#include "llfloaterreporter.h" +#include "llfloaterscriptdebug.h" +#include "llfloaterscriptlimits.h" +#include "llfloatersettingsdebug.h" +#include "llfloatersnapshot.h" +#include "llfloaterstats.h" +#include "llfloaterteleporthistory.h" +#include "llfloatertest.h" +#include "llfloatervoiceeffect.h" +#include "llfloaterwater.h" +#include "llfloaterwebcontent.h" +#include "llfloaterwindlight.h" #include "llfloaterworldmap.h" -#include "llgivemoney.h" -#include "llinventorypanel.h" -#include "llnotify.h" -#include "llstatusbar.h" -#include "llimview.h" -#include "lltextbox.h" -#include "llui.h" -#include "llviewergesture.h" // for triggering gestures -#include "llviewermessage.h" -#include "llviewerparceloverlay.h" -#include "llviewerregion.h" -#include "llviewerstats.h" +#include "llframestatview.h" +#include "llmakeoutfitdialog.h" +#include "llmoveview.h" // LLFloaterMove +#include "lltextureview.h" +#include "lltoolbar.h" +#include "lltoolgrab.h" +#include "lltoolmgr.h" #include "lluictrlfactory.h" -#include "llviewerwindow.h" -#include "llworld.h" -#include "llworldmap.h" -#include "llfocusmgr.h" +#include "llvelocitybar.h" +#include "llviewerparcelmgr.h" +// [RLVa:LF] +#include "rlvfloaters.h" +// [/RLVa:LF] +#include "shfloatermediaticker.h" +#include "slfloatermediafilter.h" -void toggle_search_floater(); - -void handle_track_avatar(const LLUUID& agent_id, const std::string& name) -{ - LLAvatarTracker::instance().track(agent_id, name); - - LLFloaterDirectory::hide(NULL); - LLFloaterWorldMap::show(true); -} - -void handle_mouselook(void*) -{ - gAgentCamera.changeCameraToMouselook(); -} - - -void handle_map(void*) -{ - LLFloaterWorldMap::toggle(); -} - -void handle_mini_map(void*) -{ - LLFloaterMap::toggleInstance(); -} - - -void handle_find(void*) -{ - toggle_search_floater(); -} - - -void handle_events(void*) -{ - LLFloaterDirectory::toggleEvents(NULL); -} - - -void handle_inventory(void*) -{ - // We're using the inventory, possibly for the - // first time. - LLFirstUse::useInventory(); - - LLInventoryView::toggleVisibility(NULL); -} - - -void handle_chat(void*) +void handle_chat() { // give focus to chatbar if it's open but not focused static const LLCachedControl chat_visible("ChatVisible",true); - if (chat_visible && gFocusMgr.childHasKeyboardFocus(gChatBar)) - { - LLChatBar::stopChat(); - } - else - { - LLChatBar::startChat(NULL); - } + (chat_visible && gFocusMgr.childHasKeyboardFocus(gChatBar)) ? LLChatBar::stopChat() : LLChatBar::startChat(NULL); } +void handle_debug_avatar_textures(void*); +template void handle_singleton_toggle(void*); +void show_outfit_dialog() { new LLMakeOutfitDialog(false); } +void toggle_build() { LLToolMgr::getInstance()->toggleBuildMode(); } +void toggle_control(const std::string& name) { if (LLControlVariable* control = gSavedSettings.getControl(name)) control->set(!control->get()); } +void toggle_search_floater(); +void toggle_always_run() { gAgent.getAlwaysRun() ? gAgent.clearAlwaysRun() : gAgent.setAlwaysRun(); } +void toggle_sit(); +void toggle_mouselook() { gAgentCamera.cameraMouselook() ? gAgentCamera.changeCameraToDefault() : gAgentCamera.changeCameraToMouselook(); } -void handle_slash_key(void*) +bool is_visible_view(boost::function get) { - // LLChatBar::startChat("/"); - // - // Don't do this, it results in a double-slash in the input field. - // Another "/" will be automatically typed for us, because the WM_KEYDOWN event - // that generated the menu accelerator call (and hence puts focus in - // the chat edtior) will be followed by a "/" WM_CHAR character message, - // which will type the slash. Yes, it's weird. It only matters for - // menu accelerators that put input focus into a field. And Mac works - // the same way. JC - - LLChatBar::startChat(NULL); + if (LLView* v = get()) + return v->getVisible(); + return false; +} + +struct CommWrapper +{ + static bool only_comm() + { + static const LLCachedControl only("CommunicateSpecificShortcut"); + return only || LLFloaterChatterBox::getInstance()->getFloaterCount(); + } + static bool instanceVisible(const LLSD& key) { return only_comm() ? LLFloaterChatterBox::instanceVisible(key) : LLFloaterMyFriends::instanceVisible(key); } + static void toggleInstance(const LLSD& key) { only_comm() ? LLFloaterChatterBox::toggleInstance(key) : LLFloaterMyFriends::toggleInstance(key); } +}; + +struct MenuFloaterDict : public LLSingleton +{ + typedef std::map, boost::function > > menu_floater_map_t; + menu_floater_map_t mEntries; + + MenuFloaterDict() + { + registerConsole("debug console", gDebugView->mDebugConsolep); + registerConsole("fast timers", gDebugView->mFastTimerView); + registerConsole("frame console", gDebugView->mFrameStatView); + registerConsole("http console", gHttpView); + registerConsole("texture console", gTextureView); + if (gAuditTexture) + { + registerConsole("texture category console", gTextureCategoryView); + registerConsole("texture size console", gTextureSizeView); + } + registerConsole("velocity", gVelocityBar); + registerFloater("about", boost::bind(&LLFloaterAbout::show,(void*)NULL)); + registerFloater("always run", boost::bind(toggle_always_run), boost::bind(&LLAgent::getAlwaysRun, &gAgent)); + registerFloater("anims_explorer", boost::bind(LLFloaterExploreAnimations::show)); + registerFloater("ao", boost::bind(LLFloaterAO::show, (void*)NULL)); + registerFloater("appearance", boost::bind(LLFloaterCustomize::show)); + registerFloater("asset_blacklist", boost::bind(LLFloaterBlacklist::toggle), boost::bind(LLFloaterBlacklist::visible)); + registerFloater("build", boost::bind(toggle_build)); + registerFloater("buy currency", boost::bind(LLFloaterBuyCurrency::buyCurrency)); + registerFloater("buy land", boost::bind(&LLViewerParcelMgr::startBuyLand, boost::bind(LLViewerParcelMgr::getInstance), false)); + registerFloater("chatbar", boost::bind(handle_chat)); + registerFloater("complaint reporter", boost::bind(LLFloaterReporter::showFromMenu, COMPLAINT_REPORT)); + registerFloater("DayCycle", boost::bind(LLFloaterDayCycle::show), boost::bind(LLFloaterDayCycle::isOpen)); + registerFloater("debug avatar", boost::bind(handle_debug_avatar_textures, (void*)NULL)); + registerFloater("debug settings", boost::bind(handle_singleton_toggle, (void*)NULL)); + registerFloater("displayname", boost::bind(LLFloaterDisplayName::show)); + registerFloater("edit ui", boost::bind(LLFloaterEditUI::show, (void*)NULL)); + registerFloater("EnvSettings", boost::bind(LLFloaterEnvSettings::show), boost::bind(LLFloaterEnvSettings::isOpen)); + registerFloater("fly", boost::bind(LLAgent::toggleFlying)); + registerFloater("font test", boost::bind(LLFloaterFontTest::show, (void*)NULL)); + registerFloater("god tools", boost::bind(LLFloaterGodTools::show, (void*)NULL)); + registerFloater("grid options", boost::bind(LLFloaterBuildOptions::show, (void*)NULL)); + registerFloater("group titles", boost::bind(HBFloaterGroupTitles::toggle)); + //Singu TODO: Re-implement f1 help. + //registerFloater("help f1", boost::bind(/*gViewerHtmlHelp.show*/)); + registerFloater("help tutorial", boost::bind(LLFloaterHUD::showHUD)); + registerFloater("inspect", boost::bind(LLFloaterInspect::showInstance)); + registerFloater("inventory", boost::bind(LLInventoryView::toggleVisibility, (void*)NULL), boost::bind(is_visible_view, static_cast >(LLInventoryView::getActiveInventory))); + registerFloater("local assets", boost::bind(FloaterLocalAssetBrowser::show, (void*)0)); + registerFloater("mean events", boost::bind(LLFloaterBump::show, (void*)NULL)); + registerFloater("media ticker", boost::bind(handle_ticker_toggle, (void*)NULL), boost::bind(SHFloaterMediaTicker::instanceExists)); + registerFloater("memleak", boost::bind(LLFloaterMemLeak::show, (void*)NULL)); + registerFloater("messagelog", boost::bind(LLFloaterMessageLog::show)); + registerFloater("mouselook", boost::bind(toggle_mouselook)); + registerFloater("my land", boost::bind(LLFloaterLandHoldings::show, (void*)NULL)); + registerFloater("outfit", boost::bind(show_outfit_dialog)); + registerFloater("PostProcess", boost::bind(LLFloaterPostProcess::show)); + registerFloater("preferences", boost::bind(LLFloaterPreference::show, (void*)NULL)); + registerFloater("RegionDebugConsole", boost::bind(handle_singleton_toggle, (void*)NULL), boost::bind(LLFloaterRegionDebugConsole::instanceExists)); + registerFloater("script errors", boost::bind(LLFloaterScriptDebug::show, LLUUID::null)); + registerFloater("search", boost::bind(toggle_search_floater)); + registerFloater("sit", boost::bind(toggle_sit)); + registerFloater("snapshot", boost::bind(LLFloaterSnapshot::show, (void*)NULL)); + registerFloater("sound_explorer", boost::bind(LLFloaterExploreSounds::toggle), boost::bind(LLFloaterExploreSounds::visible)); + registerFloater("test", boost::bind(LLFloaterTest::show, (void*)NULL)); + // Phoenix: Wolfspirit: Enabled Show Floater out of viewer menu + registerFloater("toolbar", boost::bind(toggle_control, "ShowToolBar"), boost::bind(&LLToolBar::getVisible, gToolBar)); + registerFloater("WaterSettings", boost::bind(LLFloaterWater::show), boost::bind(LLFloaterWater::isOpen)); + registerFloater("web", boost::bind(LLFloaterWebContent::showInstance, "dict web", LLFloaterWebContent::Params())); + registerFloater("Windlight", boost::bind(LLFloaterWindLight::show), boost::bind(LLFloaterWindLight::isOpen)); + registerFloater("world map", boost::bind(LLFloaterWorldMap::toggle)); + registerFloater ("about land"); + registerFloater ("about region"); + registerFloater ("active speakers"); + registerFloater ("areasearch"); + registerFloater ("beacons"); + registerFloater ("camera controls"); + registerFloater ("chat history"); + registerFloater ("communicate"); + registerFloater ("friends", 0); + registerFloater ("gestures"); + registerFloater ("groups", 1); + registerFloater ("im"); + registerFloater ("lag meter"); + registerFloater ("media filter"); + registerFloater ("mini map"); + registerFloater ("movement controls"); + registerFloater ("mute list"); + registerFloater ("notifications console"); + registerFloater ("outbox"); + registerFloater ("pathfinding_characters"); + registerFloater ("pathfinding_linksets"); + registerFloater ("perm prefs"); + registerFloater ("radar"); + registerFloater ("script info"); + registerFloater ("stat bar"); + registerFloater ("teleport history"); + registerFloater ("voice effect"); + // [RLVa:LF] + registerFloater("rlv restrictions"); + registerFloater("rlv locks"); + registerFloater("rlv strings"); + // [/RLVa:LF] + } + template + void registerConsole(const std::string& name, T* console) + { + registerFloater(name, boost::bind(&T::setVisible, console, !boost::bind(&T::getVisible, console)), boost::bind(&T::getVisible, console)); + } + void registerFloater(const std::string& name, boost::function show, boost::function visible = NULL) + { + mEntries.insert( std::make_pair( name, std::make_pair( show, visible ) ) ); + } + template + void registerFloater(const std::string& name, const LLSD& key = LLSD()) + { + registerFloater(name, boost::bind(&T::toggleInstance,key), boost::bind(&T::instanceVisible,key)); + } +}; + +void show_floater(const std::string& floater_name) +{ + if (floater_name.empty()) return; + + MenuFloaterDict::menu_floater_map_t::iterator it = MenuFloaterDict::instance().mEntries.find(floater_name); + if (it == MenuFloaterDict::instance().mEntries.end()) // Simple codeless floater + { + if (LLFloater* floater = LLUICtrlFactory::getInstance()->getBuiltFloater(floater_name)) + gFloaterView->bringToFront(floater); + else + LLUICtrlFactory::getInstance()->buildFloater(new LLFloater(), floater_name); + } + else if (it->second.first) + { + it->second.first(); + } +} + +// Singu TODO: It'd be reallllly nice if we could use this as a control for buttons too. +bool floater_visible(const std::string& floater_name) +{ + MenuFloaterDict::menu_floater_map_t::iterator it = MenuFloaterDict::instance().mEntries.find(floater_name); + return it != MenuFloaterDict::instance().mEntries.end() && it->second.second && it->second.second(); } diff --git a/indra/newview/llmenucommands.h b/indra/newview/llmenucommands.h index 1c4550b07..1ec7be309 100644 --- a/indra/newview/llmenucommands.h +++ b/indra/newview/llmenucommands.h @@ -33,17 +33,4 @@ #ifndef LL_LLMENUCOMMANDS_H #define LL_LLMENUCOMMANDS_H -class LLUUID; - -void handle_track_avatar(const LLUUID& agent_id, const std::string& name); -void handle_mouselook(void*); -void handle_map(void*); -void handle_mini_map(void*); -void handle_find(void*); -void handle_events(void*); -void handle_inventory(void*); -void handle_chat(void*); -void handle_return_key(void*); -void handle_slash_key(void*); - #endif diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index ab2283644..7dd948fc5 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -49,11 +49,11 @@ void LLNameListCtrl::NameTypeNames::declareValues() declare("SPECIAL", LLNameListCtrl::SPECIAL); } -LLNameListCtrl::LLNameListCtrl(const std::string& name, const LLRect& rect, BOOL allow_multiple_selection, BOOL draw_border, bool draw_heading, S32 name_column_index, const std::string& tooltip) +LLNameListCtrl::LLNameListCtrl(const std::string& name, const LLRect& rect, BOOL allow_multiple_selection, BOOL draw_border, bool draw_heading, S32 name_column_index, const std::string& name_system, const std::string& tooltip) : LLScrollListCtrl(name, rect, NULL, allow_multiple_selection, draw_border,draw_heading), mNameColumnIndex(name_column_index), mAllowCallingCardDrop(false), - mShortNames(false), + mNameSystem(name_system), mAvatarNameCacheConnection() { setToolTip(tooltip); @@ -189,10 +189,7 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow( } else if (LLAvatarNameCache::get(id, &av_name)) { - if (mShortNames) - fullname = av_name.mDisplayName; - else - fullname = av_name.getCompleteName(); + LLAvatarNameCache::getPNSName(av_name, fullname, mNameSystem); } else { @@ -266,10 +263,7 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id, //mAvatarNameCacheConnection.disconnect(); std::string name; - if (mShortNames) - name = av_name.mDisplayName; - else - name = av_name.getCompleteName(); + LLAvatarNameCache::getPNSName(av_name, name, mNameSystem); LLNameListItem* list_item = item.get(); if (list_item && list_item->getUUID() == agent_id) @@ -326,7 +320,10 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto S32 name_column_index = 0; node->getAttributeS32("name_column_index", name_column_index); - LLNameListCtrl* name_list = new LLNameListCtrl("name_list", rect, multi_select, draw_border, draw_heading, name_column_index); + std::string name_system("PhoenixNameSystem"); + node->getAttributeString("name_system", name_system); + + LLNameListCtrl* name_list = new LLNameListCtrl("name_list", rect, multi_select, draw_border, draw_heading, name_column_index, name_system); if (node->hasAttribute("heading_height")) { S32 heading_height; diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 451f1ae7c..9552ff02d 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -102,7 +102,7 @@ public: }; protected: - LLNameListCtrl(const std::string& name, const LLRect& rect, BOOL allow_multiple_selection, BOOL draw_border = TRUE, bool draw_heading = false, S32 name_column_index = 0, const std::string& tooltip = LLStringUtil::null); + LLNameListCtrl(const std::string& name, const LLRect& rect, BOOL allow_multiple_selection, BOOL draw_border = TRUE, bool draw_heading = false, S32 name_column_index = 0, const std::string& name_system = "PhoenixNameSystem", const std::string& tooltip = LLStringUtil::null); virtual ~LLNameListCtrl() { if (mAvatarNameCacheConnection.connected()) @@ -148,7 +148,7 @@ private: private: S32 mNameColumnIndex; BOOL mAllowCallingCardDrop; - bool mShortNames; // display name only, no SLID + const LLCachedControl mNameSystem; boost::signals2::connection mAvatarNameCacheConnection; }; diff --git a/indra/newview/llpaneldisplay.cpp b/indra/newview/llpaneldisplay.cpp index 0f7184757..9fc9b96c9 100644 --- a/indra/newview/llpaneldisplay.cpp +++ b/indra/newview/llpaneldisplay.cpp @@ -334,6 +334,16 @@ BOOL LLPanelDisplay::postBuild() mVBOStream = getChild("vbo_stream"); + if(gGLManager.mIsATI) //AMD gpus don't go beyond 8x fsaa. + { + LLComboBox* fsaa = getChild("fsaa"); + fsaa->remove("16x"); + } + if(!gGLManager.mHasAdaptiveVsync) + { + LLComboBox* vsync = getChild("vsync"); + vsync->remove("VSyncAdaptive"); + } refresh(); @@ -447,8 +457,10 @@ void LLPanelDisplay::refresh() mGamma = gSavedSettings.getF32("RenderGamma"); mVideoCardMem = gSavedSettings.getS32("TextureMemory"); mFogRatio = gSavedSettings.getF32("RenderFogRatio"); + mVsyncMode = gSavedSettings.getS32("SHRenderVsyncMode"); childSetValue("fsaa", (LLSD::Integer) mFSAASamples); + childSetValue("vsync", (LLSD::Integer) mVsyncMode); refreshEnabledState(); } @@ -846,13 +858,22 @@ void LLPanelDisplay::cancel() gSavedSettings.setF32("RenderGamma", mGamma); gSavedSettings.setS32("TextureMemory", mVideoCardMem); gSavedSettings.setF32("RenderFogRatio", mFogRatio); + gSavedSettings.setS32("SHRenderVsyncMode", mVsyncMode); } void LLPanelDisplay::apply() { U32 fsaa_value = childGetValue("fsaa").asInteger(); + S32 vsync_value = childGetValue("vsync").asInteger(); + + if(vsync_value == -1 && !gGLManager.mHasAdaptiveVsync) + vsync_value = 0; + bool apply_fsaa_change = !gSavedSettings.getBOOL("RenderUseFBO") && (mFSAASamples != fsaa_value); + bool apply_vsync_change = vsync_value != mVsyncMode; + gSavedSettings.setU32("RenderFSAASamples", fsaa_value); + gSavedSettings.setS32("SHRenderVsyncMode", vsync_value); applyResolution(); @@ -865,7 +886,7 @@ void LLPanelDisplay::apply() // Hardware tab //Still do a bit of voodoo here. V2 forces restart to change FSAA with FBOs off. //Let's not do that, and instead do pre-V2 FSAA change handling for that particular case - if(apply_fsaa_change) + if(apply_fsaa_change || apply_vsync_change) { bool logged_in = (LLStartUp::getStartupState() >= STATE_STARTED); LLWindow* window = gViewerWindow->getWindow(); @@ -875,7 +896,7 @@ void LLPanelDisplay::apply() LLGLState::checkTextureChannels(); gViewerWindow->changeDisplaySettings(window->getFullscreen(), size, - gSavedSettings.getBOOL("DisableVerticalSync"), + vsync_value, logged_in); LLGLState::checkStates(); LLGLState::checkTextureChannels(); diff --git a/indra/newview/llpaneldisplay.h b/indra/newview/llpaneldisplay.h index 9b39ee555..1652b497b 100644 --- a/indra/newview/llpaneldisplay.h +++ b/indra/newview/llpaneldisplay.h @@ -194,6 +194,7 @@ protected: F32 mGamma; S32 mVideoCardMem; F32 mFogRatio; + S32 mVsyncMode; // if the quality radio buttons are changed void onChangeQuality(LLUICtrl* caller); diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp index 19d1a8d82..526ade3e9 100644 --- a/indra/newview/llpanelland.cpp +++ b/indra/newview/llpanelland.cpp @@ -52,10 +52,6 @@ #include "hippogridmanager.h" -// [RLVa:KB] -#include "rlvhandler.h" -// [/RLVa:KB] - LLPanelLandSelectObserver* LLPanelLandInfo::sObserver = NULL; LLPanelLandInfo* LLPanelLandInfo::sInstance = NULL; @@ -239,12 +235,6 @@ void LLPanelLandInfo::refresh() //static void LLPanelLandInfo::onClickClaim(void*) { -// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) - if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) - { - return; - } -// [/RLVa:KB] LLViewerParcelMgr::getInstance()->startBuyLand(); } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 6f0cdf10c..a219868d3 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -647,7 +647,7 @@ void LLPanelLogin::updateLocationSelectorsVisibility() sInstance->getChildView("location_panel")->setVisible(show_start); - bool show_server = true; + bool show_server = gSavedSettings.getBOOL("ForceShowGrid"); sInstance->getChildView("grids_panel")->setVisible(show_server); } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index cd7b2ebd4..71b507ef6 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -30,6 +30,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "lleconomy.h" +#include "llfirstuse.h" #include "llfiltereditor.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" @@ -444,6 +445,8 @@ void LLInventoryView::toggleVisibility() S32 count = sActiveViews.count(); if (0 == count) { + // We're using the inventory, possibly for the first time. + LLFirstUse::useInventory(); showAgentInventory(TRUE); } else if (1 == count) diff --git a/indra/newview/llphysicsmotion.cpp b/indra/newview/llphysicsmotion.cpp index 6fc0ab438..99ff385ee 100644 --- a/indra/newview/llphysicsmotion.cpp +++ b/indra/newview/llphysicsmotion.cpp @@ -314,8 +314,8 @@ void LLPhysicsMotion::getString(std::ostringstream &oss) } } -LLPhysicsMotionController::LLPhysicsMotionController(const LLUUID &id) : - LLMotion(id), +LLPhysicsMotionController::LLPhysicsMotionController(LLUUID const& id, LLMotionController* controller) : + AIMaskedMotion(id, controller, ANIM_AGENT_PHYSICS_MOTION), mCharacter(NULL), mIsDefault(true) { @@ -332,15 +332,6 @@ LLPhysicsMotionController::~LLPhysicsMotionController() } } -BOOL LLPhysicsMotionController::onActivate() -{ - return TRUE; -} - -void LLPhysicsMotionController::onDeactivate() -{ -} - LLMotion::LLMotionInitStatus LLPhysicsMotionController::onInitialize(LLCharacter *character) { mCharacter = character; @@ -889,4 +880,4 @@ void LLPhysicsMotion::reset() mCharacter->setVisualParamWeight((*iter).mParam,(*iter).mParam->getDefaultWeight()); } } -} \ No newline at end of file +} diff --git a/indra/newview/llphysicsmotion.h b/indra/newview/llphysicsmotion.h index 7412c9d88..2ce79b220 100644 --- a/indra/newview/llphysicsmotion.h +++ b/indra/newview/llphysicsmotion.h @@ -42,14 +42,14 @@ class LLPhysicsMotion; // class LLPhysicsMotion //----------------------------------------------------------------------------- class LLPhysicsMotionController : - public LLMotion + public AIMaskedMotion { public: std::string getString(); // Constructor - LLPhysicsMotionController(const LLUUID &id); + LLPhysicsMotionController(LLUUID const& id, LLMotionController* controller); // Destructor virtual ~LLPhysicsMotionController(); @@ -61,7 +61,7 @@ public: // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLPhysicsMotionController(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLPhysicsMotionController(id, controller); } public: //------------------------------------------------------------------------- @@ -93,19 +93,11 @@ public: // must return true to indicate success and be available for activation virtual LLMotionInitStatus onInitialize(LLCharacter *character); - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate(); - // called per time step // must return TRUE while it is active, and // must return FALSE when the motion is completed. virtual BOOL onUpdate(F32 time, U8* joint_mask); - // called when a motion is deactivated - virtual void onDeactivate(); - LLCharacter* getCharacter() { return mCharacter; } protected: diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 4881139df..976397931 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6506,7 +6506,7 @@ void LLSelectMgr::updateSelectionCenter() mSelectionCenterGlobal.clearVec(); mShowSelection = FALSE; mSelectionBBox = LLBBox(); - mPauseRequest = NULL; + mPauseRequests.clear(); resetAgentHUDZoom(); } @@ -6516,27 +6516,18 @@ void LLSelectMgr::updateSelectionCenter() if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid()) { - // Singu Note: Chalice Yao's pause agent on attachment selection - if (object->permYouOwner()) + // Freeze avatars with a selected attachment, and all avatars with synchronized motions, if any. + LLVOAvatar* avatar = object->getAvatar(); + // It is possible that 'avatar' is NULL despite this being an attachment because of some race condition. + // In that case just don't freeze the avatar. + if (avatar) { - mPauseRequest = gAgentAvatarp->requestPause(); - } - else if (LLViewerObject* objectp = mSelectedObjects->getPrimaryObject()) - { - while (objectp && !objectp->isAvatar()) - { - objectp = (LLViewerObject*)objectp->getParent(); - } - - if (objectp) - { - mPauseRequest = objectp->asAvatar()->requestPause(); - } + avatar->pauseAllSyncedCharacters(mPauseRequests); } } else { - mPauseRequest = NULL; + mPauseRequests.clear(); } if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid()) diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 16c960ba8..145c25005 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -793,7 +793,7 @@ private: LLFrameTimer mEffectsTimer; BOOL mForceSelection; - LLAnimPauseRequest mPauseRequest; + std::vector mPauseRequests; // Selected avatar and all synchronized avatars. friend class LLObjectBackup; }; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 68c045ee7..9ad74f7a0 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1529,6 +1529,7 @@ static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW("Draw"); void LLSpatialGroup::doOcclusion(LLCamera* camera) { + LLGLDisable stencil(GL_STENCIL_TEST); if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1) { //static const LLCachedControl render_water_void_culling("RenderWaterVoidCulling", TRUE); @@ -3868,6 +3869,8 @@ public: return; } + LLGLDisable stencil(GL_STENCIL_TEST); + group->rebuildGeom(); group->rebuildMesh(); diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 0f15435dc..215e9f242 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -88,11 +88,11 @@ void LLSpeaker::lookupName() void LLSpeaker::onNameCache(const LLAvatarName& full_name) { - static const LLCachedControl legacy_name("LiruLegacySpeakerNames"); - if (legacy_name) + static const LLCachedControl name_system("SpeakerNameSystem"); + if (!name_system) mDisplayName = gCacheName->cleanFullName(full_name.getLegacyName()); else - LLAvatarNameCache::getPNSName(full_name, mDisplayName); + LLAvatarNameCache::getPNSName(full_name, mDisplayName, name_system); } bool LLSpeaker::isInVoiceChannel() diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 2077ccfec..cc2cc300c 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3455,7 +3455,7 @@ void LLStartUp::initNameCache() // capabilities for display name lookup LLAvatarNameCache::initClass(false); S32 phoenix_name_system = gSavedSettings.getS32("PhoenixNameSystem"); - if(phoenix_name_system <= 0 || phoenix_name_system > 2) LLAvatarNameCache::setUseDisplayNames(false); + if(phoenix_name_system <= 0 || phoenix_name_system > 3) LLAvatarNameCache::setUseDisplayNames(false); else LLAvatarNameCache::setUseDisplayNames(true); } diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 602aa594b..d15900993 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -923,13 +923,6 @@ static void onClickScripts(void*) static void onClickBuyLand(void*) { -// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) - if (RlvActions::isRlvEnabled() && RlvActions::hasBehaviour(RLV_BHVR_SHOWLOC)) - { - return; - } -// [/RLVa:KB] - LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); LLViewerParcelMgr::getInstance()->startBuyLand(); } diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp index 985d27f15..f924b93c2 100644 --- a/indra/newview/lltoolbar.cpp +++ b/indra/newview/lltoolbar.cpp @@ -35,29 +35,21 @@ #include "lltoolbar.h" -#include "llbutton.h" #include "llflyoutbutton.h" #include "llscrolllistitem.h" -#include "llui.h" #include "llagent.h" #include "llagentcamera.h" -#include "llagentwearables.h" -#include "llfirstuse.h" -#include "llviewerparcelmgr.h" -#include "llfloateravatarlist.h" #include "llfloaterchat.h" #include "llfloaterchatterbox.h" -#include "llfloatercustomize.h" #include "llfloaterfriends.h" #include "llfloaterinventory.h" #include "llfloatermute.h" -#include "llfloatersnapshot.h" #include "llimpanel.h" #include "llimview.h" -#include "llmenucommands.h" -#include "lltoolmgr.h" #include "lltoolgrab.h" +#include "lltoolmgr.h" +#include "llviewerparcelmgr.h" #include "llvoavatarself.h" // [RLVa:KB] @@ -102,6 +94,7 @@ F32 LLToolBar::sInventoryAutoOpenTime = 1.f; // // Functions // +void show_floater(const std::string& floater_name); LLToolBar::LLToolBar() : LLLayoutPanel() @@ -111,47 +104,14 @@ LLToolBar::LLToolBar() { setIsChrome(TRUE); setFocusRoot(TRUE); + mCommitCallbackRegistrar.add("ShowFloater", boost::bind(show_floater, _2)); } BOOL LLToolBar::postBuild() { - childSetCommitCallback("communicate_btn", onClickCommunicate, this); - - childSetAction("chat_btn", onClickChat, this); - childSetControlName("chat_btn", "ChatVisible"); - - //childSetAction("appearance_btn", onClickAppearance, this); - //childSetControlName("appearance_btn", ""); - - childSetAction("radar_list_btn", onClickRadarList, this); - childSetControlName("radar_list_btn", "ShowRadar"); - - childSetAction("fly_btn", onClickFly, this); - childSetControlName("fly_btn", "FlyBtnState"); - - //childSetAction("sit_btn", onClickSit, this); - //childSetControlName("sit_btn", "SitBtnState"); - - childSetAction("snapshot_btn", onClickSnapshot, this); - childSetControlName("snapshot_btn", "SnapshotBtnState"); - - childSetAction("directory_btn", onClickDirectory, this); - childSetControlName("directory_btn", "ShowDirectory"); - - childSetAction("build_btn", onClickBuild, this); - childSetControlName("build_btn", "BuildBtnState"); - - childSetAction("radar_btn", onClickRadar, this); - childSetControlName("radar_btn", "ShowMiniMap"); - - childSetAction("map_btn", onClickMap, this); - childSetControlName("map_btn", "ShowWorldMap"); - - childSetAction("inventory_btn", onClickInventory, this); - childSetControlName("inventory_btn", "ShowInventory"); - mCommunicateBtn.connect(this, "communicate_btn"); + mCommunicateBtn->setCommitCallback(boost::bind(&LLToolBar::onClickCommunicate, this, _2)); mFlyBtn.connect(this, "fly_btn"); mBuildBtn.connect(this, "build_btn"); mMapBtn.connect(this, "map_btn"); @@ -202,11 +162,11 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, std::string& tooltip_msg) { LLButton* inventory_btn = getChild("inventory_btn"); - if (!inventory_btn) return FALSE; + if (!inventory_btn || !inventory_btn->getVisible()) return FALSE; LLInventoryView* active_inventory = LLInventoryView::getActiveInventory(); - if(active_inventory && active_inventory->getVisible()) + if (active_inventory && active_inventory->getVisible()) { mInventoryAutoOpen = FALSE; } @@ -230,22 +190,6 @@ BOOL LLToolBar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg); } -// static -void LLToolBar::toggle(void*) -{ - BOOL show = gSavedSettings.getBOOL("ShowToolBar"); - gSavedSettings.setBOOL("ShowToolBar", !show); - gToolBar->setVisible(!show); -} - - -// static -BOOL LLToolBar::visible(void*) -{ - return gToolBar->getVisible(); -} - - void LLToolBar::layoutButtons() { #if LL_DARWIN @@ -294,33 +238,21 @@ void LLToolBar::refresh() return; static LLCachedControl show("ShowToolBar", true); - static LLCachedControl ascent_build_always_enabled("AscentBuildAlwaysEnabled", true); BOOL mouselook = gAgentCamera.cameraMouselook(); setVisible(show && !mouselook); - BOOL sitting = FALSE; static LLCachedControl continue_flying_on_unsit("LiruContinueFlyingOnUnsit"); - if (continue_flying_on_unsit) - { - sitting = false; - } - else if (gAgentAvatarp) - { - sitting = gAgentAvatarp->isSitting(); - } + bool sitting = !continue_flying_on_unsit && gAgentAvatarp && gAgentAvatarp->isSitting(); mFlyBtn->setEnabled((gAgent.canFly() || gAgent.getFlying()) && !sitting ); + static LLCachedControl ascent_build_always_enabled("AscentBuildAlwaysEnabled", true); mBuildBtn->setEnabled((LLViewerParcelMgr::getInstance()->allowAgentBuild() || ascent_build_always_enabled)); // Check to see if we're in build mode - BOOL build_mode = LLToolMgr::getInstance()->inEdit(); // And not just clicking on a scripted object - if (LLToolGrab::getInstance()->getHideBuildHighlight()) - { - build_mode = FALSE; - } + bool build_mode = LLToolMgr::getInstance()->inEdit() && !LLToolGrab::getInstance()->getHideBuildHighlight(); static LLCachedControl build_btn_state("BuildBtnState",false); - if(build_btn_state!=(bool)build_mode) + if (build_btn_state != build_mode) build_btn_state = build_mode; // [RLVa:KB] - Version: 1.23.4 | Checked: 2009-07-10 (RLVa-1.0.0g) @@ -337,63 +269,42 @@ void LLToolBar::refresh() } // [/RLVa:KB] - if (isInVisibleChain()) + if (isInVisibleChain() && mCommunicateBtn->getVisible()) { updateCommunicateList(); } } +void bold_if_equal(const LLFloater* f1, const LLFloater* f2, LLScrollListItem* itemp) +{ + if (f1 != f2) return; + static_cast(itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); +} + void LLToolBar::updateCommunicateList() { - LLFlyoutButton* communicate_button = mCommunicateBtn; - LLSD selected = communicate_button->getValue(); + LLSD selected = mCommunicateBtn->getValue(); - communicate_button->removeall(); + mCommunicateBtn->removeall(); LLFloater* frontmost_floater = LLFloaterChatterBox::getInstance()->getActiveFloater(); - LLScrollListItem* itemp = NULL; + bold_if_equal(LLFloaterMyFriends::getInstance(), frontmost_floater, mCommunicateBtn->add(LLFloaterMyFriends::getInstance()->getShortTitle(), LLSD("contacts"), ADD_TOP)); + bold_if_equal(LLFloaterChat::getInstance(), frontmost_floater, mCommunicateBtn->add(LLFloaterChat::getInstance()->getShortTitle(), LLSD("local chat"), ADD_TOP)); + mCommunicateBtn->addSeparator(ADD_TOP); + mCommunicateBtn->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP); + mCommunicateBtn->addSeparator(ADD_TOP); + bold_if_equal(LLFloaterMute::getInstance(), frontmost_floater, mCommunicateBtn->add(LLFloaterMute::getInstance()->getShortTitle(), LLSD("mute list"), ADD_TOP)); - itemp = communicate_button->add(LLFloaterMyFriends::getInstance()->getShortTitle(), LLSD("contacts"), ADD_TOP); - if (LLFloaterMyFriends::getInstance() == frontmost_floater) + if (gIMMgr->getIMFloaterHandles().size() > 0) mCommunicateBtn->addSeparator(ADD_TOP); + for(std::set >::const_iterator floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it) { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); - // make sure current tab is selected in list - if (selected.isUndefined()) + if (LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get()) { - selected = itemp->getValue(); - } - } - itemp = communicate_button->add(LLFloaterChat::getInstance()->getShortTitle(), LLSD("local chat"), ADD_TOP); - if (LLFloaterChat::getInstance() == frontmost_floater) - { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); - if (selected.isUndefined()) - { - selected = itemp->getValue(); - } - } - communicate_button->addSeparator(ADD_TOP); - communicate_button->add(getString("Redock Windows"), LLSD("redock"), ADD_TOP); - communicate_button->addSeparator(ADD_TOP); - communicate_button->add(LLFloaterMute::getInstance()->getShortTitle(), LLSD("mute list"), ADD_TOP); - - std::set >::const_iterator floater_handle_it; - - if (gIMMgr->getIMFloaterHandles().size() > 0) - { - communicate_button->addSeparator(ADD_TOP); - } - - for(floater_handle_it = gIMMgr->getIMFloaterHandles().begin(); floater_handle_it != gIMMgr->getIMFloaterHandles().end(); ++floater_handle_it) - { - LLFloaterIMPanel* im_floaterp = (LLFloaterIMPanel*)floater_handle_it->get(); - if (im_floaterp) - { - static LLCachedControl show_counts("ShowUnreadIMsCounts", true); S32 count = im_floaterp->getNumUnreadMessages(); std::string floater_title; if (count > 0) floater_title = "*"; floater_title.append(im_floaterp->getShortTitle()); + static LLCachedControl show_counts("ShowUnreadIMsCounts", true); if (show_counts && count > 0) { floater_title += " - "; @@ -408,32 +319,18 @@ void LLToolBar::updateCommunicateList() floater_title += getString("IM"); } } - - itemp = communicate_button->add(floater_title, im_floaterp->getSessionID(), ADD_TOP); - if (im_floaterp == frontmost_floater) - { - ((LLScrollListText*)itemp->getColumn(0))->setFontStyle(LLFontGL::BOLD); - if (selected.isUndefined()) - { - selected = itemp->getValue(); - } - } + bold_if_equal(im_floaterp, frontmost_floater, mCommunicateBtn->add(floater_title, im_floaterp->getSessionID(), ADD_TOP)); } } - communicate_button->setToggleState(gSavedSettings.getBOOL("ShowCommunicate")); - communicate_button->setValue(selected); + mCommunicateBtn->setToggleState(gSavedSettings.getBOOL("ShowCommunicate")); + if (!selected.isUndefined()) mCommunicateBtn->setValue(selected); } // static -void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, void* user_data) +void LLToolBar::onClickCommunicate(const LLSD& selected_option) { - LLToolBar* toolbar = (LLToolBar*)user_data; - LLFlyoutButton* communicate_button = toolbar->getChild("communicate_btn"); - - LLSD selected_option = communicate_button->getValue(); - if (selected_option.asString() == "contacts") { LLFloaterMyFriends::showInstance(); @@ -484,104 +381,3 @@ void LLToolBar::onClickCommunicate(LLUICtrl* ctrl, void* user_data) LLFloaterChatterBox::showInstance(selected_option); } } - - -// static -void LLToolBar::onClickChat(void* user_data) -{ - handle_chat(NULL); -} - -// static -void LLToolBar::onClickAppearance(void*) -{ - if (gAgentWearables.areWearablesLoaded()) - { - LLFloaterCustomize::show(); - } -} - -// static -void LLToolBar::onClickRadarList(void*) -{ - LLFloaterAvatarList::toggle(0); -} - - -// static -void LLToolBar::onClickFly(void*) -{ - gAgent.toggleFlying(); -} - - -// static -void LLToolBar::onClickSit(void*) -{ - if (!(gAgent.getControlFlags() & AGENT_CONTROL_SIT_ON_GROUND)) - { - // sit down - gAgent.setFlying(FALSE); - gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); - - // Might be first sit - LLFirstUse::useSit(); - } - else - { -// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) - // NOTE-RLVa: dead code? - if (gRlvHandler.hasBehaviour(RLV_BHVR_UNSIT)) - { - return; - } -// [/RLVa:KB] - - // stand up - gAgent.setFlying(FALSE); - gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); - } -} - - -// static -void LLToolBar::onClickSnapshot(void*) -{ - LLFloaterSnapshot::show (0); -} - - -// static -void LLToolBar::onClickDirectory(void*) -{ - handle_find(NULL); -} - - -// static -void LLToolBar::onClickBuild(void*) -{ - LLToolMgr::getInstance()->toggleBuildMode(); -} - - -// static -void LLToolBar::onClickRadar(void*) -{ - handle_mini_map(NULL); -} - - -// static -void LLToolBar::onClickMap(void*) -{ - handle_map(NULL); -} - - -// static -void LLToolBar::onClickInventory(void*) -{ - handle_inventory(NULL); -} - diff --git a/indra/newview/lltoolbar.h b/indra/newview/lltoolbar.h index 28fcba9df..23307a78b 100644 --- a/indra/newview/lltoolbar.h +++ b/indra/newview/lltoolbar.h @@ -64,9 +64,6 @@ public: /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - static void toggle(void*); - static BOOL visible(void*); - // Move buttons to appropriate locations based on rect. void layoutButtons(); @@ -74,25 +71,13 @@ public: void refresh(); // callbacks - static void onClickCommunicate(LLUICtrl*, void*); - static void onClickChat(void* data); - static void onClickAppearance(void* data); - static void onClickFly(void*); - static void onClickSit(void*); - static void onClickSnapshot(void* data); - static void onClickDirectory(void* data); - static void onClickBuild(void* data); - static void onClickRadar(void* data); - static void onClickMap(void* data); - static void onClickInventory(void* data); - static void onClickRadarList(void* data); + void onClickCommunicate(const LLSD& selected); static F32 sInventoryAutoOpenTime; private: void updateCommunicateList(); - private: BOOL mInventoryAutoOpen; LLFrameTimer mInventoryAutoOpenTimer; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 1229fef67..d87d82ad5 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -204,6 +204,12 @@ bool handleRenderAvatarComplexityLimitChanged(const LLSD& newvalue) bool handleRenderTransparentWaterChanged(const LLSD& newvalue) { + LLPipeline::sWaterReflections = gGLManager.mHasCubeMap && gSavedSettings.getBOOL("VertexShaderEnable"); + if (gPipeline.isInit()) //If water is opaque then distortion/reflection fbos will not be needed. + { + gPipeline.releaseGLBuffers(); + gPipeline.createGLBuffers(); + } LLWorld::getInstance()->updateWaterObjects(); return true; } @@ -614,7 +620,7 @@ bool handleAscentAvatarModifier(const LLSD& newvalue) static bool handlePhoenixNameSystemChanged(const LLSD& newvalue) { S32 dnval = (S32)newvalue.asInteger(); - if (dnval <= 0 || dnval > 2) LLAvatarNameCache::setUseDisplayNames(false); + if (dnval <= 0 || dnval > 3) LLAvatarNameCache::setUseDisplayNames(false); else LLAvatarNameCache::setUseDisplayNames(true); LLVOAvatar::invalidateNameTags(); return true; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index ba83afd25..52812a7ff 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -42,130 +42,88 @@ #include "llfeaturemanager.h" #include "llsecondlifeurls.h" // -#include "llfloaterexploreanimations.h" -#include "llfloaterexploresounds.h" #include "llfloaterblacklist.h" // #include "statemachine/aifilepicker.h" // newview includes +#include "lfsimfeaturehandler.h" #include "llagent.h" #include "llagentcamera.h" #include "llappearancemgr.h" #include "llagentwearables.h" -#include "jcfloaterareasearch.h" -#include "lfsimfeaturehandler.h" #include "llagentpilot.h" +#include "llavatarpropertiesprocessor.h" +#include "llcallingcard.h" #include "llcompilequeue.h" #include "llconsole.h" #include "lldebugview.h" #include "llenvmanager.h" #include "llfirstuse.h" -#include "llfloaterabout.h" -#include "llfloateractivespeakers.h" -#include "llfloateravatarlist.h" #include "llfloateravatartextures.h" -#include "llfloaterbeacons.h" -#include "llfloaterbuildoptions.h" -#include "llfloaterbump.h" #include "llfloaterbuy.h" #include "llfloaterbuycontents.h" #include "llfloaterbuycurrency.h" #include "llfloaterbuyland.h" #include "llfloaterchat.h" #include "llfloatercustomize.h" -#include "llfloaterdaycycle.h" #include "llfloaterdirectory.h" #include "llfloatereditui.h" -#include "llfloaterchatterbox.h" #include "llfloaterfonttest.h" -#include "llfloatergesture.h" #include "llfloatergodtools.h" #include "llfloaterhtmlcurrency.h" -#include "llfloaterhud.h" -#include "llfloaterinspect.h" -#include "llfloaterinventory.h" -#include "llfloaterlagmeter.h" #include "llfloaterland.h" -#include "llfloaterlandholdings.h" -#include "llfloatermap.h" #include "llfloatermute.h" #include "llfloateropenobject.h" -#include "llfloateroutbox.h" #include "llfloaterpathfindingcharacters.h" #include "llfloaterpathfindinglinksets.h" -#include "llfloaterperms.h" -#include "llfloaterpostprocess.h" -#include "llfloaterpreference.h" #include "llfloaterregiondebugconsole.h" #include "llfloaterregioninfo.h" #include "llfloaterreporter.h" -#include "llfloaterscriptdebug.h" -#include "llfloaterscriptlimits.h" #include "llfloatersettingsdebug.h" - -#include "llfloaterenvsettings.h" -#include "llfloaterstats.h" -#include "llfloaterteleporthistory.h" #include "llfloatertest.h" #include "llfloatertools.h" -#include "llfloatervoiceeffect.h" -#include "llfloaterwater.h" -#include "llfloaterwebcontent.h" -#include "llfloaterwindlight.h" #include "llfloaterworldmap.h" #include "llfloatermemleak.h" #include "llframestats.h" -#include "llgivemoney.h" #include "llavataractions.h" +#include "llgivemoney.h" #include "llgroupmgr.h" #include "llhoverview.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" -#include "llimview.h" -#include "llinventorybridge.h" -#include "llinventorydefines.h" #include "llinventoryfunctions.h" -#include "llmakeoutfitdialog.h" #include "llmimetypes.h" -#include "llmenucommands.h" #include "llmenuoptionpathfindingrebakenavmesh.h" -#include "llmoveview.h" #include "llmutelist.h" #include "llnotify.h" -#include "llpanellogin.h" #include "llparcel.h" #include "llregioninfomodel.h" #include "llselectmgr.h" #include "llstatusbar.h" #include "lltextureview.h" -#include "lltoolbar.h" #include "lltoolcomp.h" +#include "lltoolgrab.h" #include "lltoolmgr.h" #include "lltoolpie.h" #include "lltoolselectland.h" +#include "lltrans.h" #include "lluictrlfactory.h" -#include "lluserauth.h" #include "llvelocitybar.h" #include "llviewercamera.h" #include "llviewergenericmessage.h" +#include "llviewerjoystick.h" #include "llviewertexturelist.h" // gTextureList #include "llviewermenufile.h" // init_menu_file() #include "llviewermessage.h" #include "llviewernetwork.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" -#include "llviewerstats.h" #include "llvoavatarself.h" #include "llworld.h" #include "llworldmap.h" #include "pipeline.h" -#include "llviewerjoystick.h" -#include "llwaterparammanager.h" -#include "llwlanimator.h" -#include "llwlparammanager.h" -#include "llfloatercamera.h" #include "llfloaternotificationsconsole.h" // @@ -176,12 +134,8 @@ // #include "scriptcounter.h" -#include "llfloaterdisplayname.h" -#include "floaterao.h" -#include "slfloatermediafilter.h" #include "llviewerobjectbackup.h" #include "llagentui.h" -#include "lltoolgrab.h" #include "llpathfindingmanager.h" #include @@ -191,8 +145,6 @@ #include "hippogridmanager.h" #include "wlfPanel_AdvSettings.h" -void toggle_search_floater(); - using namespace LLOldEvents; using namespace LLAvatarAppearanceDefines; void init_client_menu(LLMenuGL* menu); @@ -855,7 +807,7 @@ void init_client_menu(LLMenuGL* menu) } sub->addChild(new LLMenuItemCheckGL("HTTP Console", - &AIHTTPView::toggle_visibility, + &toggle_visibility, NULL, &get_visibility, (void*)gHttpView, @@ -1526,16 +1478,8 @@ void init_debug_rendering_menu(LLMenuGL* menu) item = new LLMenuItemCheckGL("Audit Texture", menu_toggle_control, NULL, menu_check_control, (void*)"AuditTexture"); menu->addChild(item); -#ifndef LL_RELEASE_FOR_DOWNLOAD menu->addSeparator(); menu->addChild(new LLMenuItemCallGL("Memory Leaking Simulation", LLFloaterMemLeak::show, NULL, NULL)); -#else - if(gSavedSettings.getBOOL("QAMode")) - { - menu->addSeparator(); - menu->addChild(new LLMenuItemCallGL("Memory Leaking Simulation", LLFloaterMemLeak::show, NULL, NULL)); - } -#endif menu->createJumpKeys(); } @@ -1984,23 +1928,6 @@ class LLViewCheckJoystickFlycam : public view_listener_t } }; -class LLViewCommunicate : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - static LLCachedControl only_comm("CommunicateSpecificShortcut"); - if (!only_comm && LLFloaterChatterBox::getInstance()->getFloaterCount() == 0) - { - LLFloaterMyFriends::toggleInstance(); - } - else - { - LLFloaterChatterBox::toggleInstance(); - } - return true; - } -}; - void handle_toggle_flycam() { @@ -2128,15 +2055,6 @@ void handle_attachment_edit(const LLUUID& idItem) } // [/SL:KB] -class LLObjectInspect : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterInspect::showInstance(); - return true; - } -}; - // Derenderizer. Originally by Phox. class LLObjectDerender : public view_listener_t { @@ -2883,19 +2801,6 @@ class LLObjectPFLinksetsSelected : public view_listener_t } }; -class LLAvatarAnims : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); - if(avatar) - { - new LLFloaterExploreAnimations(avatar->getID()); //temporary - } - return true; - } -}; - // bool handle_go_to() @@ -4220,22 +4125,6 @@ class LLViewLookAtLastChatter : public view_listener_t } }; -class LLViewMouselook : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - if (!gAgentCamera.cameraMouselook()) - { - gAgentCamera.changeCameraToMouselook(); - } - else - { - gAgentCamera.changeCameraToDefault(); - } - return true; - } -}; - class LLViewFullscreen : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -4302,6 +4191,7 @@ void handle_duplicate_in_place(void*) } /* dead code 30-apr-2008 +#include "llviewerstats.h" void handle_deed_object_to_group(void*) { LLUUID group_id; @@ -5660,15 +5550,6 @@ bool enable_object_delete() return new_value; } -class LLEditSearch : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - toggle_search_floater(); - return true; - } -}; - class LLObjectsReturnPackage { public: @@ -5769,15 +5650,6 @@ class LLViewEnableLastChatter : public view_listener_t } }; -class LLViewToggleRadar: public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterAvatarList::toggle(0); - return true; - } -}; - class LLEditEnableDeselect : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -6006,55 +5878,17 @@ class LLWorldTeleportHome : public view_listener_t } }; -class LLWorldAlwaysRun : public view_listener_t +void toggle_sit() { - bool handleEvent(LLPointer event, const LLSD& userdata) - { - // as well as altering the default walk-vs-run state, - // we also change the *current* walk-vs-run state. - if (gAgent.getAlwaysRun()) - { - gAgent.clearAlwaysRun(); -// gAgent.clearRunning(); - } - else - { - gAgent.setAlwaysRun(); -// gAgent.setRunning(); - } - - // tell the simulator. -// gAgent.sendWalkRun(gAgent.getAlwaysRun()); - - return true; - } -}; - -class LLWorldCheckAlwaysRun : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - bool new_value = gAgent.getAlwaysRun(); - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); - return true; - } -}; + if (!gAgentAvatarp) return; + gAgent.setControlFlags(gAgentAvatarp->isSitting() ? AGENT_CONTROL_STAND_UP : AGENT_CONTROL_SIT_ON_GROUND); +} class LLWorldSitOnGround : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - if (gAgentAvatarp) - { - if(!gAgentAvatarp->isSitting()) - { - gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); - } - else - { - gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); - } - } + toggle_sit(); return true; } }; @@ -6146,7 +5980,7 @@ class LLWorldCreateLandmark : public view_listener_t create_inventory_item(gAgent.getID(), gAgent.getSessionID(), folder_id, LLTransactionID::tnull, - pos_string, pos_string, // name, desc + pos_string, agent_parcel->getDesc(), // name, desc, // name, desc LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, NOT_WEARABLE, PERM_ALL, @@ -6449,160 +6283,23 @@ void handle_viewer_disable_message_log(void*) gMessageSystem->stopLogging(); } -struct MenuFloaterDict : public LLSingleton -{ - typedef std::map, boost::function > > menu_floater_map_t; - menu_floater_map_t mEntries; - MenuFloaterDict() - { - registerFloater("about", boost::bind(&LLFloaterAbout::show,(void*)NULL)); - //registerFloater("about region", boost::bind(&LLFloaterRegionInfo::showInstance,LLSD())); - registerFloater("buy currency", boost::bind(&LLFloaterBuyCurrency::buyCurrency)); - registerFloater("displayname", boost::bind(&LLFloaterDisplayName::show)); - //registerFloater("friends", boost::bind(&LLFloaterMyFriends::toggleInstance,0), boost::bind(&LLFloaterMyFriends::instanceVisible,0)); - registerFloater("gestures", boost::bind(&LLFloaterGesture::toggleVisibility), boost::bind(&LLFloaterGesture::instanceVisible)); - registerFloater("grid options", boost::bind(&LLFloaterBuildOptions::show,(void*)NULL)); - registerFloater("help tutorial",boost::bind(&LLFloaterHUD::showHUD)); - registerFloater("im", boost::bind(&LLFloaterChatterBox::toggleInstance,LLSD()), boost::bind(&LLFloaterMyFriends::instanceVisible,0)); - //registerFloater("lag meter", boost::bind(&LLFloaterLagMeter::showInstance,LLSD())); - registerFloater("my land", boost::bind(&LLFloaterLandHoldings::show,(void*)NULL)); - registerFloater("preferences", boost::bind(&LLFloaterPreference::show,(void*)NULL)); - registerFloater("script errors",boost::bind(&LLFloaterScriptDebug::show,LLUUID::null)); - //registerFloater("script info", boost::bind(&LLFloaterScriptLimits::showInstance,LLSD())); - // Phoenix: Wolfspirit: Enabled Show Floater out of viewer menu - registerFloater("toolbar", boost::bind(&LLToolBar::toggle,(void*)NULL), boost::bind(&LLToolBar::visible,(void*)NULL)); - registerFloater("world map", boost::bind(&LLFloaterWorldMap::toggle)); - registerFloater("sound_explorer", boost::bind(&LLFloaterExploreSounds::toggle), boost::bind(&LLFloaterExploreSounds::visible)); - registerFloater("asset_blacklist", boost::bind(&LLFloaterBlacklist::toggle), boost::bind(&LLFloaterBlacklist::visible)); - - registerFloater ("about land"); - registerFloater ("about region"); - registerFloater ("active speakers"); - registerFloater ("areasearch"); - registerFloater ("beacons"); - registerFloater ("camera controls"); - registerFloater ("chat history"); - registerFloater ("communicate"); - registerFloater ("friends",0); - registerFloater ("lag meter"); - registerFloater ("media filter"); - registerFloater ("mini map"); - registerFloater ("movement controls"); - registerFloater ("mute list"); - registerFloater ("outbox"); - registerFloater ("perm prefs"); - registerFloater ("script info"); - registerFloater ("stat bar"); - registerFloater ("teleport history"); - registerFloater ("voice effect"); - registerFloater ("pathfinding_characters"); - registerFloater ("pathfinding_linksets"); - - } - void registerFloater(const std::string& name, boost::function show, boost::function visible = NULL) - { - mEntries.insert( std::make_pair( name, std::make_pair( show, visible ) ) ); - } - template - void registerFloater(const std::string& name, const LLSD& key = LLSD()) - { - registerFloater(name, boost::bind(&T::toggleInstance,key), boost::bind(&T::instanceVisible,key)); - } - -}; - // TomY TODO: Move! +void show_floater(const std::string& floater_name); class LLShowFloater : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - std::string floater_name = userdata.asString(); - if (floater_name.empty()) return false; - MenuFloaterDict::menu_floater_map_t::iterator it = MenuFloaterDict::instance().mEntries.find(floater_name); - if(it != MenuFloaterDict::instance().mEntries.end() && it->second.first != NULL) - { - it->second.first(); - } - else if (floater_name == "appearance") - { - if (gAgentWearables.areWearablesLoaded()) - { - LLFloaterCustomize::show(); - } - } - else if (floater_name == "outfit") - { - new LLMakeOutfitDialog(false); - } - else if (floater_name == "inventory") - { - LLInventoryView::toggleVisibility(NULL); - } - else if (floater_name == "buy land") - { -// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) - if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) - { - return true; - } -// [/RLVa:KB] - if (LLViewerParcelMgr::getInstance()->selectionEmpty()) - { - LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal()); - } - LLViewerParcelMgr::getInstance()->startBuyLand(); - } - - //Singu TODO: Re-implement f1 help. - /*else if (floater_name == "help f1") - { - llinfos << "Spawning HTML help window" << llendl; - gViewerHtmlHelp.show(); - }*/ - - else if (floater_name == "complaint reporter") - { - // Prevent menu from appearing in screen shot. - gMenuHolder->hideMenus(); - LLFloaterReporter::showFromMenu(COMPLAINT_REPORT); - } - else if (floater_name == "mean events") - { - if (!gNoRender) - { - LLFloaterBump::show(NULL); - } - } - else // Simple codeless floater - { - LLFloater* floater = LLUICtrlFactory::getInstance()->getBuiltFloater(floater_name); - if (floater) - gFloaterView->bringToFront(floater); - else - LLUICtrlFactory::getInstance()->buildFloater(new LLFloater(), floater_name); - } + show_floater(userdata.asString()); return true; } }; +bool floater_visible(const std::string& floater_name); class LLFloaterVisible : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - std::string control_name = userdata["control"].asString(); - std::string floater_name = userdata["data"].asString(); - bool new_value = false; - MenuFloaterDict::menu_floater_map_t::iterator it = MenuFloaterDict::instance().mEntries.find(floater_name); - if(it != MenuFloaterDict::instance().mEntries.end() && it->second.second != NULL) - { - new_value = it->second.second(); - } - else if (floater_name == "inventory") - { - LLInventoryView* iv = LLInventoryView::getActiveInventory(); - new_value = (NULL != iv && TRUE == iv->getVisible()); - } - gMenuHolder->findControl(control_name)->setValue(new_value); + gMenuHolder->findControl(userdata["control"].asString())->setValue(floater_visible(userdata["data"].asString())); return true; } }; @@ -6715,15 +6412,6 @@ class LLShowAgentProfile : public view_listener_t } }; -class LLShowAgentGroups : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterMyFriends::toggleInstance(1); - return true; - } -}; - class LLLandEdit : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -9006,15 +8694,6 @@ class LLEditTakeOff : public view_listener_t } }; -class LLWorldChat : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - handle_chat(NULL); - return true; - } -}; - class LLToolsSelectTool : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -9055,22 +8734,6 @@ class LLWorldEnvSettings : public view_listener_t // [/RLVa:KB] std::string tod = userdata.asString(); - - if (tod == "editor") - { - // if not there or is hidden, show it - if( !LLFloaterEnvSettings::isOpen() || - !LLFloaterEnvSettings::instance()->getVisible()) - { - LLFloaterEnvSettings::show(); - } - else - { - // otherwise, close it button acts like a toggle - LLFloaterEnvSettings::instance()->close(); - } - return true; - } if (tod == "sunrise") { @@ -9097,60 +8760,6 @@ class LLWorldEnvSettings : public view_listener_t } }; -/// Water Menu callbacks -class LLWorldWaterSettings : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { -// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) - if (gRlvHandler.hasBehaviour(RLV_BHVR_SETENV)) - { - return true; - } -// [/RLVa:KB] - - // if not there or is hidden, show it - if( !LLFloaterWater::isOpen() || - !LLFloaterWater::instance()->getVisible()) { - LLFloaterWater::show(); - - // otherwise, close it button acts like a toggle - } - else - { - LLFloaterWater::instance()->close(); - } - return true; - } -}; - -/// Post-Process callbacks -class LLWorldPostProcess : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterPostProcess::show(); - return true; - } -}; - -/// Day Cycle callbacks -class LLWorldDayCycle : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { -// [RLVa:KB] - Checked: 2009-07-10 (RLVa-1.0.0g) - if (gRlvHandler.hasBehaviour(RLV_BHVR_SETENV)) - { - return true; - } -// [/RLVa:KB] - - LLFloaterDayCycle::show(); - return true; - } -}; - class SinguCloseAllDialogs : public view_listener_t { @@ -9161,16 +8770,6 @@ class SinguCloseAllDialogs : public view_listener_t } }; -class SinguAnimationOverride : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterAO::show(NULL); - - return true; - } -}; - class SinguNimble : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -9191,36 +8790,6 @@ class SinguCheckNimble : public view_listener_t } }; -class SinguAssetBlacklist : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterBlacklist::toggle(); - - return true; - } -}; - -class SinguStreamingAudioDisplay : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - handle_ticker_toggle(NULL); - - return true; - } -}; - -class SinguCheckStreamingAudioDisplay : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - gMenuHolder->findControl(userdata["control"].asString())->setValue(handle_singleton_check(NULL)); - - return true; - } -}; - class SinguEnableStreamingAudioDisplay : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -9257,33 +8826,12 @@ class SinguRebake : public view_listener_t } }; -class SinguDebugConsole : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - handle_singleton_toggle(NULL); - return true; - } -}; - -class SinguCheckDebugConsole : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - gMenuHolder->findControl(userdata["control"].asString())->setValue(handle_singleton_check(NULL)); - return true; - } -}; - class SinguVisibleDebugConsole : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) { - if (LLViewerRegion* region = gAgent.getRegion()) - { - if (LLView* item = gMenuBarView->getChildView("Region Debug Console", true, false)) - item->setVisible(!(region->getCapability("SimConsoleAsync").empty() || region->getCapability("SimConsole").empty())); - } + LLViewerRegion* region = gAgent.getRegion(); + gMenuHolder->findControl(userdata["control"].asString())->setValue(region && !(region->getCapability("SimConsoleAsync").empty() || region->getCapability("SimConsole").empty())); return true; } }; @@ -9682,7 +9230,6 @@ void initialize_menus() addMenu(new LLEditCopy(), "Edit.Copy"); addMenu(new LLEditPaste(), "Edit.Paste"); addMenu(new LLEditDelete(), "Edit.Delete"); - addMenu(new LLEditSearch(), "Edit.Search"); addMenu(new LLEditSelectAll(), "Edit.SelectAll"); addMenu(new LLEditDeselect(), "Edit.Deselect"); addMenu(new LLEditDuplicate(), "Edit.Duplicate"); @@ -9702,9 +9249,7 @@ void initialize_menus() addMenu(new LLEditEnableChangeDisplayname(), "Edit.EnableChangeDisplayname"); // View menu - addMenu(new LLViewMouselook(), "View.Mouselook"); addMenu(new LLViewJoystickFlycam(), "View.JoystickFlycam"); - addMenu(new LLViewCommunicate(), "View.Communicate"); addMenu(new LLViewResetView(), "View.ResetView"); addMenu(new LLViewResetPresetAngles(), "View.ResetPresetAngles"); addMenu(new LLViewLookAtLastChatter(), "View.LookAtLastChatter"); @@ -9721,7 +9266,6 @@ void initialize_menus() addMenu(new LLViewEnableMouselook(), "View.EnableMouselook"); addMenu(new LLViewEnableJoystickFlycam(), "View.EnableJoystickFlycam"); addMenu(new LLViewEnableLastChatter(), "View.EnableLastChatter"); - addMenu(new LLViewToggleRadar(), "View.ToggleAvatarList"); addMenu(new LLViewCheckJoystickFlycam(), "View.CheckJoystickFlycam"); addMenu(new LLViewCheckShowHoverTips(), "View.CheckShowHoverTips"); @@ -9730,8 +9274,6 @@ void initialize_menus() addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments"); // World menu - addMenu(new LLWorldChat(), "World.Chat"); - addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun"); addMenu(new LLWorldSitOnGround(), "World.SitOnGround"); addMenu(new LLWorldEnableSitOnGround(), "World.EnableSitOnGround"); addMenu(new LLWorldFly(), "World.Fly"); @@ -9747,13 +9289,7 @@ void initialize_menus() addMenu(new LLWorldEnableSetHomeLocation(), "World.EnableSetHomeLocation"); addMenu(new LLWorldEnableTeleportHome(), "World.EnableTeleportHome"); addMenu(new LLWorldEnableBuyLand(), "World.EnableBuyLand"); - - addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun"); - (new LLWorldEnvSettings())->registerListener(gMenuHolder, "World.EnvSettings"); - (new LLWorldWaterSettings())->registerListener(gMenuHolder, "World.WaterSettings"); - (new LLWorldPostProcess())->registerListener(gMenuHolder, "World.PostProcess"); - (new LLWorldDayCycle())->registerListener(gMenuHolder, "World.DayCycle"); // Tools menu @@ -9777,7 +9313,6 @@ void initialize_menus() addMenu(new LLToolsLookAtSelection(), "Tools.LookAtSelection"); addMenu(new LLToolsBuyOrTake(), "Tools.BuyOrTake"); addMenu(new LLToolsTakeCopy(), "Tools.TakeCopy"); - addMenu(new LLToolsTakeCopy(), "Tools.TakeCopy"); // addMenu(new LLToolsEnableAdminDelete(), "Tools.EnableAdminDelete"); @@ -9827,7 +9362,6 @@ void initialize_menus() addMenu(new LLAvatarEject(), "Avatar.Eject"); addMenu(new LLAvatarSendIM(), "Avatar.SendIM"); addMenu(new LLAvatarReportAbuse(), "Avatar.ReportAbuse"); - addMenu(new LLAvatarAnims(),"Avatar.Anims"); addMenu(new LLObjectEnableMute(), "Avatar.EnableMute"); addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend"); addMenu(new LLAvatarEnableFreezeEject(), "Avatar.EnableFreezeEject"); @@ -9858,7 +9392,6 @@ void initialize_menus() addMenu(new LLObjectMute(), "Object.Mute"); addMenu(new LLObjectBuy(), "Object.Buy"); addMenu(new LLObjectEdit(), "Object.Edit"); - addMenu(new LLObjectInspect(), "Object.Inspect"); // Visual mute, originally by Phox. addMenu(new LLObjectDerender(), "Object.DERENDER"); addMenu(new LLAvatarReloadTextures(), "Avatar.ReloadTextures"); @@ -9905,7 +9438,6 @@ void initialize_menus() addMenu(new LLShowFloater(), "ShowFloater"); addMenu(new LLPromptShowURL(), "PromptShowURL"); addMenu(new LLShowAgentProfile(), "ShowAgentProfile"); - addMenu(new LLShowAgentGroups(), "ShowAgentGroups"); addMenu(new LLToggleControl(), "ToggleControl"); addMenu(new LLGoToObject(), "GoToObject"); @@ -9928,17 +9460,12 @@ void initialize_menus() // Singularity menu addMenu(new SinguCloseAllDialogs(), "CloseAllDialogs"); // ---- Fake away handled elsewhere - addMenu(new SinguAnimationOverride(), "AnimationOverride"); addMenu(new SinguNimble(), "Nimble"); addMenu(new SinguCheckNimble(), "CheckNimble"); - addMenu(new SinguStreamingAudioDisplay(), "StreamingAudioDisplay"); addMenu(new SinguEnableStreamingAudioDisplay(), "EnableStreamingAudioDisplay"); - addMenu(new SinguCheckStreamingAudioDisplay(), "CheckStreamingAudioDisplay"); addMenu(new SinguPoseStand(), "PoseStand"); addMenu(new SinguCheckPoseStand(), "CheckPoseStand"); addMenu(new SinguRebake(), "Rebake"); - addMenu(new SinguDebugConsole(), "RegionDebugConsole"); - addMenu(new SinguCheckDebugConsole(), "CheckRegionDebugConsole"); addMenu(new SinguVisibleDebugConsole(), "VisibleRegionDebugConsole"); // [RLVa:KB] - Checked: 2010-01-18 (RLVa-1.1.0m) | Added: RLVa-1.1.0m | OK diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 5eb158997..877bfdce3 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -62,7 +62,6 @@ #include "lltrans.h" #include "llfloaterbuycurrency.h" // -#include "floaterlocalassetbrowse.h" #include "llassettype.h" #include "llinventorytype.h" // @@ -517,15 +516,6 @@ class LLFileMinimizeAllWindows : public view_listener_t return true; } }; - -class LLFileLocalAssetBrowser : public view_listener_t -{ - bool handleEvent(LLPointer, const LLSD&) - { - FloaterLocalAssetBrowser::show(0); - return true; - } -}; // class LLFileSavePreview : public view_listener_t @@ -541,15 +531,6 @@ class LLFileSavePreview : public view_listener_t } }; -class LLFileTakeSnapshot : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloaterSnapshot::show(NULL); - return true; - } -}; - class LLFileTakeSnapshotToDisk : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -979,21 +960,21 @@ void temp_upload_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt { LLUUID item_id; item_id.generate(); - LLPermissions* perms = new LLPermissions(); - perms->set(LLPermissions::DEFAULT); - perms->setOwnerAndGroup(gAgentID, gAgentID, gAgentID, false); + LLPermissions perms; + perms.set(LLPermissions::DEFAULT); + perms.setOwnerAndGroup(gAgentID, gAgentID, gAgentID, false); - perms->setMaskBase(PERM_ALL); - perms->setMaskOwner(PERM_ALL); - perms->setMaskEveryone(PERM_ALL); - perms->setMaskGroup(PERM_ALL); - perms->setMaskNext(PERM_ALL); + perms.setMaskBase(PERM_ALL); + perms.setMaskOwner(PERM_ALL); + perms.setMaskEveryone(PERM_ALL); + perms.setMaskGroup(PERM_ALL); + perms.setMaskNext(PERM_ALL); LLViewerInventoryItem* item = new LLViewerInventoryItem( item_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE), - *perms, + perms, uuid, (LLAssetType::EType)data->mAssetInfo.mType, (LLInventoryType::EType)data->mInventoryType, @@ -1368,10 +1349,8 @@ void init_menu_file() (new LLFileEnableCloseAllWindows())->registerListener(gMenuHolder, "File.EnableCloseAllWindows"); // (new LLFileMinimizeAllWindows())->registerListener(gMenuHolder, "File.MinimizeAllWindows"); - (new LLFileLocalAssetBrowser())->registerListener(gMenuHolder, "File.LocalAssetBrowser"); // (new LLFileSavePreview())->registerListener(gMenuHolder, "File.SavePreview"); - (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit"); (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a2adc49a9..ceea596b0 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5772,7 +5772,7 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data) } } - if (num_blocks) + //if (num_blocks) Singu note: commented out; having blocks or not is totally irrelevant! { avatarp->processAnimationStateChanges(); } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 4fdca26c8..977d8fede 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -69,6 +69,7 @@ #include "lloverlaybar.h" #include "roles_constants.h" #include "llweb.h" +#include "rlvactions.h" const F32 PARCEL_COLLISION_DRAW_SECS = 1.f; @@ -2226,6 +2227,12 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const void LLViewerParcelMgr::startBuyLand(BOOL is_for_group) { +// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) + if (RlvActions::isRlvEnabled() && !RlvActions::canShowLocation()) + return; +// [/RLVa:KB] + if (selectionEmpty()) selectParcelAt(gAgent.getPositionGlobal()); + LLFloaterBuyLand::buyLand(getSelectionRegion(), mCurrentParcelSelection, is_for_group == TRUE); } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index b5a819032..453a1e076 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -190,7 +190,7 @@ LLGLSLShader gDeferredWaterProgram(LLViewerShaderMgr::SHADER_DEFERRED); //calc LLGLSLShader gDeferredUnderWaterProgram(LLViewerShaderMgr::SHADER_DEFERRED); LLGLSLShader gDeferredDiffuseProgram(LLViewerShaderMgr::SHADER_DEFERRED);//Not in mShaderList LLGLSLShader gDeferredDiffuseAlphaMaskProgram(LLViewerShaderMgr::SHADER_DEFERRED); -LLGLSLShader gDeferredNonIndexedDiffuseProgram(LLViewerShaderMgr::SHADER_DEFERRED); +//LLGLSLShader gDeferredNonIndexedDiffuseProgram(LLViewerShaderMgr::SHADER_DEFERRED); LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram(LLViewerShaderMgr::SHADER_DEFERRED); LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram(LLViewerShaderMgr::SHADER_DEFERRED); LLGLSLShader gDeferredSkinnedDiffuseProgram(LLViewerShaderMgr::SHADER_DEFERRED); @@ -552,6 +552,7 @@ void LLViewerShaderMgr::setShaders() else { LLGLSLShader::sNoFixedFunction = false; + LLGLSLShader::sIndexedTextureChannels = 1; gPipeline.mVertexShadersEnabled = FALSE; gPipeline.mVertexShadersLoaded = 0; for (S32 i = 0; i < SHADER_COUNT; i++) @@ -569,6 +570,7 @@ void LLViewerShaderMgr::setShaders() else { LLGLSLShader::sNoFixedFunction = false; + LLGLSLShader::sIndexedTextureChannels = 1; gPipeline.mVertexShadersEnabled = FALSE; gPipeline.mVertexShadersLoaded = 0; for (S32 i = 0; i < SHADER_COUNT; i++) @@ -673,14 +675,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders() // (in order of shader function call depth for reference purposes, deepest level first) shaders.clear(); - S32 ch = 1; - - if (gGLManager.mGLSLVersionMajor > 1 || gGLManager.mGLSLVersionMinor >= 30) - { //use indexed texture rendering for GLSL >= 1.30 - static const LLCachedControl no_texture_indexing("ShyotlUseLegacyTextureBatching",false); - if(!no_texture_indexing) - ch = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1); - } + S32 ch = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1); std::vector index_channels; index_channels.push_back(-1); shaders.push_back( make_pair( "windlight/atmosphericsVarsF.glsl", mVertexShaderLevel[SHADER_WINDLIGHT] ) ); @@ -1078,7 +1073,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.createShader(NULL, NULL); } - if (success) + /*if (success) { gDeferredNonIndexedDiffuseProgram.mName = "Non Indexed Deferred Diffuse Shader"; gDeferredNonIndexedDiffuseProgram.mShaderFiles.clear(); @@ -1086,7 +1081,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredNonIndexedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredNonIndexedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredNonIndexedDiffuseProgram.createShader(NULL, NULL); - } + }*/ if (success) diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 99374c31a..feea7cfbc 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -300,7 +300,7 @@ extern LLGLSLShader gDeferredDiffuseProgram; extern LLGLSLShader gDeferredDiffuseAlphaMaskProgram; extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram; extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram; -extern LLGLSLShader gDeferredNonIndexedDiffuseProgram; +//extern LLGLSLShader gDeferredNonIndexedDiffuseProgram; extern LLGLSLShader gDeferredSkinnedDiffuseProgram; extern LLGLSLShader gDeferredSkinnedBumpProgram; extern LLGLSLShader gDeferredSkinnedAlphaProgram; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 4728f0ffd..62dba3ca5 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -878,8 +878,9 @@ void send_stats() llinfos << "Misc Stats: int_1: " << misc["int_1"] << " int_2: " << misc["int_2"] << llendl; llinfos << "Misc Stats: string_1: " << misc["string_1"] << " string_2: " << misc["string_2"] << llendl; - body["DisplayNamesEnabled"] = gSavedSettings.getS32("PhoenixNameSystem") == 1 || gSavedSettings.getS32("PhoenixNameSystem") == 2; - body["DisplayNamesShowUsername"] = gSavedSettings.getS32("PhoenixNameSystem") == 1; + const S32 namesys = gSavedSettings.getS32("PhoenixNameSystem"); + body["DisplayNamesEnabled"] = namesys > 0 && namesys < 4; + body["DisplayNamesShowUsername"] = namesys == 1 || namesys == 3; body["MinimalSkin"] = false; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index e5ae8553c..1e77f7b43 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1640,12 +1640,18 @@ LLViewerWindow::LLViewerWindow( LLViewerWindow::sMovieBaseName = "SLmovie"; resetSnapshotLoc(); + S32 vsync_mode = gSavedSettings.getS32("SHRenderVsyncMode"); + if(vsync_mode == -1 && !gGLManager.mHasAdaptiveVsync) + { + vsync_mode = 0; //Disable vsync if adaptive is desired yet isn't supported. + } + // create window mWindow = LLWindowManager::createWindow(this, title, name, x, y, width, height, 0, fullscreen, gNoRender, - gSavedSettings.getBOOL("DisableVerticalSync"), + vsync_mode, !gNoRender, ignore_pixel_depth, gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled @@ -4436,14 +4442,20 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height) BORDERHEIGHT = size.mY- y; LLCoordScreen new_size(new_width + BORDERWIDTH, new_height + BORDERHEIGHT); - BOOL disable_sync = gSavedSettings.getBOOL("DisableVerticalSync"); + + S32 vsync_mode = gSavedSettings.getS32("SHRenderVsyncMode"); + if(vsync_mode == -1 && !gGLManager.mHasAdaptiveVsync) + { + vsync_mode = 0; //Disable vsync if adaptive is desired yet isn't supported. + } + if (gViewerWindow->getWindow()->getFullscreen()) { LLGLState::checkStates(); LLGLState::checkTextureChannels(); gViewerWindow->changeDisplaySettings(FALSE, new_size, - disable_sync, + vsync_mode, TRUE); LLGLState::checkStates(); LLGLState::checkTextureChannels(); @@ -5421,9 +5433,16 @@ BOOL LLViewerWindow::checkSettings() LLGLState::checkStates(); LLGLState::checkTextureChannels(); + + S32 vsync_mode = gSavedSettings.getS32("SHRenderVsyncMode"); + if(vsync_mode == -1 && !gGLManager.mHasAdaptiveVsync) + { + vsync_mode = 0; //Disable vsync if adaptive is desired yet isn't supported. + } + changeDisplaySettings(TRUE, desired_screen_size, - gSavedSettings.getBOOL("DisableVerticalSync"), + vsync_mode, mShowFullscreenProgress); LLGLState::checkStates(); LLGLState::checkTextureChannels(); @@ -5464,7 +5483,7 @@ void LLViewerWindow::restartDisplay(BOOL show_progress_bar) } } -BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar) +BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, const S32 vsync_mode, BOOL show_progress_bar) { BOOL was_maximized = gSavedSettings.getBOOL("WindowMaximized"); mWantFullscreen = fullscreen; @@ -5483,6 +5502,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, U32 fsaa = gSavedSettings.getU32("RenderFSAASamples"); U32 old_fsaa = mWindow->getFSAASamples(); + // going from windowed to windowed if (!old_fullscreen && !fullscreen) { @@ -5492,7 +5512,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, mWindow->setSize(size); } - if (fsaa == old_fsaa) + if (fsaa == old_fsaa && vsync_mode == mWindow->getFSAASamples()) { return TRUE; } @@ -5531,13 +5551,14 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, } mWindow->setFSAASamples(fsaa); + mWindow->setVsyncMode(vsync_mode); - result_first_try = mWindow->switchContext(fullscreen, size, disable_vsync, &new_pos); + result_first_try = mWindow->switchContext(fullscreen, size, vsync_mode, &new_pos); if (!result_first_try) { // try to switch back mWindow->setFSAASamples(old_fsaa); - result_second_try = mWindow->switchContext(old_fullscreen, old_size, disable_vsync, &new_pos); + result_second_try = mWindow->switchContext(old_fullscreen, old_size, vsync_mode, &new_pos); if (!result_second_try) { diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 7ec0f3ec3..7e47a1a1b 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -386,7 +386,7 @@ public: void requestResolutionUpdate(bool fullscreen_checked); BOOL checkSettings(); void restartDisplay(BOOL show_progress_bar); - BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar); + BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, const S32 vsync_mode, BOOL show_progress_bar); BOOL getIgnoreDestroyWindow() { return mIgnoreActivate; } F32 getDisplayAspectRatio() const; const LLVector2& getDisplayScale() const { return mDisplayScale; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 453525da9..901340a57 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -145,18 +145,106 @@ using namespace LLAvatarAppearanceDefines; //----------------------------------------------------------------------------- // Global constants //----------------------------------------------------------------------------- -const LLUUID ANIM_AGENT_BODY_NOISE = LLUUID("9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad"); //"body_noise" -const LLUUID ANIM_AGENT_BREATHE_ROT = LLUUID("4c5a103e-b830-2f1c-16bc-224aa0ad5bc8"); //"breathe_rot" -const LLUUID ANIM_AGENT_EDITING = LLUUID("2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb"); //"editing" -const LLUUID ANIM_AGENT_EYE = LLUUID("5c780ea8-1cd1-c463-a128-48c023f6fbea"); //"eye" -const LLUUID ANIM_AGENT_FLY_ADJUST = LLUUID("db95561f-f1b0-9f9a-7224-b12f71af126e"); //"fly_adjust" -const LLUUID ANIM_AGENT_HAND_MOTION = LLUUID("ce986325-0ba7-6e6e-cc24-b17c4b795578"); //"hand_motion" -const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d"); //"head_rot" -const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix" -const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target" -const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust" -const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"); //"physics_motion" +const LLUUID ANIM_AGENT_BODY_NOISE_ID = LLUUID("9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad"); //"body_noise" +const LLUUID ANIM_AGENT_BREATHE_ROT_ID = LLUUID("4c5a103e-b830-2f1c-16bc-224aa0ad5bc8"); //"breathe_rot" +const LLUUID ANIM_AGENT_PHYSICS_MOTION_ID = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"); //"physics_motion" +const LLUUID ANIM_AGENT_EDITING_ID = LLUUID("2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb"); //"editing" +const LLUUID ANIM_AGENT_EYE_ID = LLUUID("5c780ea8-1cd1-c463-a128-48c023f6fbea"); //"eye" +const LLUUID ANIM_AGENT_FLY_ADJUST_ID = LLUUID("db95561f-f1b0-9f9a-7224-b12f71af126e"); //"fly_adjust" +const LLUUID ANIM_AGENT_HAND_MOTION_ID = LLUUID("ce986325-0ba7-6e6e-cc24-b17c4b795578"); //"hand_motion" +const LLUUID ANIM_AGENT_HEAD_ROT_ID = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d"); //"head_rot" +const LLUUID ANIM_AGENT_PELVIS_FIX_ID = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix" +const LLUUID ANIM_AGENT_TARGET_ID = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target" +const LLUUID ANIM_AGENT_WALK_ADJUST_ID = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust" +// +// This must be in the same order as ANIM_AGENT_BODY_NOISE through ANIM_AGENT_WALK_ADJUST (see llmotion.h)! +static LLUUID const* lookup[] = { + &ANIM_AGENT_BODY_NOISE_ID, + &ANIM_AGENT_BREATHE_ROT_ID, + &ANIM_AGENT_PHYSICS_MOTION_ID, + &ANIM_AGENT_EDITING_ID, + &ANIM_AGENT_EYE_ID, + &ANIM_AGENT_FLY_ADJUST_ID, + &ANIM_AGENT_HAND_MOTION_ID, + &ANIM_AGENT_HEAD_ROT_ID, + &ANIM_AGENT_PELVIS_FIX_ID, + &ANIM_AGENT_TARGET_ID, + &ANIM_AGENT_WALK_ADJUST_ID +}; + +LLUUID const& mask2ID(U32 bit) +{ + int const lookupsize = sizeof(lookup) / sizeof(LLUUID const*); + int i = lookupsize - 1; + U32 mask = 1 << i; + for(;;) + { + if (bit == mask) + { + return *lookup[i]; + } + --i; + mask >>= 1; + llassert_always(i >= 0); + } +} + +#ifdef CWDEBUG +static char const* strlookup[] = { + "ANIM_AGENT_BODY_NOISE", + "ANIM_AGENT_BREATHE_ROT", + "ANIM_AGENT_PHYSICS_MOTION", + "ANIM_AGENT_EDITING", + "ANIM_AGENT_EYE", + "ANIM_AGENT_FLY_ADJUST", + "ANIM_AGENT_HAND_MOTION", + "ANIM_AGENT_HEAD_ROT", + "ANIM_AGENT_PELVIS_FIX", + "ANIM_AGENT_TARGET", + "ANIM_AGENT_WALK_ADJUST" +}; + +char const* mask2str(U32 bit) +{ + int const lookupsize = sizeof(lookup) / sizeof(LLUUID const*); + int i = lookupsize - 1; + U32 mask = 1 << i; + do + { + if (bit == mask) + { + return strlookup[i]; + } + --i; + mask >>= 1; + } + while(i >= 0); + return ""; +} +#endif + +// stopMotion(ANIM_AGENT_WALK_ADJUST) is called every frame, and for every avatar on the radar. +// That can be like 1000 times per second, so... speed that up a bit and lets not lookup the same LLUUID 1000 times +// per second in a std::map. Added the rest of the animations while I was at it. +void LLVOAvatar::startMotion(U32 bit, F32 time_offset) +{ + if (!isMotionActive(bit)) + { + mMotionController.disable_syncing(); // Don't attempt to synchronize AIMaskedMotion. + startMotion(mask2ID(bit), time_offset); + mMotionController.enable_syncing(); + } +} + +void LLVOAvatar::stopMotion(U32 bit, BOOL stop_immediate) +{ + if (isMotionActive(bit)) + { + stopMotion(mask2ID(bit), stop_immediate); + } +} +// //----------------------------------------------------------------------------- // Constants @@ -257,12 +345,12 @@ struct LLTextureMaskData // class LLBodyNoiseMotion //----------------------------------------------------------------------------- class LLBodyNoiseMotion : - public LLMotion + public AIMaskedMotion { public: // Constructor - LLBodyNoiseMotion(const LLUUID &id) - : LLMotion(id) + LLBodyNoiseMotion(LLUUID const& id, LLMotionController* controller) + : AIMaskedMotion(id, controller, ANIM_AGENT_BODY_NOISE) { mName = "body_noise"; mTorsoState = new LLJointState; @@ -277,7 +365,7 @@ public: //------------------------------------------------------------------------- // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLBodyNoiseMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLBodyNoiseMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -320,11 +408,6 @@ public: return STATUS_SUCCESS; } - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate() { return TRUE; } - // called per time step // must return TRUE while it is active, and // must return FALSE when the motion is completed. @@ -348,9 +431,6 @@ public: return TRUE; } - // called when a motion is deactivated - virtual void onDeactivate() {} - private: //------------------------------------------------------------------------- // joint states to be animated @@ -362,12 +442,12 @@ private: // class LLBreatheMotionRot //----------------------------------------------------------------------------- class LLBreatheMotionRot : - public LLMotion + public AIMaskedMotion { public: // Constructor - LLBreatheMotionRot(const LLUUID &id) : - LLMotion(id), + LLBreatheMotionRot(LLUUID const& id, LLMotionController* controller) : + AIMaskedMotion(id, controller, ANIM_AGENT_BREATHE_ROT), mBreatheRate(1.f), mCharacter(NULL) { @@ -384,7 +464,7 @@ public: //------------------------------------------------------------------------- // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID &id) { return new LLBreatheMotionRot(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLBreatheMotionRot(id, controller); } public: //------------------------------------------------------------------------- @@ -437,11 +517,6 @@ public: } } - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate() { return TRUE; } - // called per time step // must return TRUE while it is active, and // must return FALSE when the motion is completed. @@ -456,9 +531,6 @@ public: return TRUE; } - // called when a motion is deactivated - virtual void onDeactivate() {} - private: //------------------------------------------------------------------------- // joint states to be animated @@ -472,12 +544,12 @@ private: // class LLPelvisFixMotion //----------------------------------------------------------------------------- class LLPelvisFixMotion : - public LLMotion + public AIMaskedMotion { public: // Constructor - LLPelvisFixMotion(const LLUUID &id) - : LLMotion(id), mCharacter(NULL) + LLPelvisFixMotion(LLUUID const& id, LLMotionController* controller) + : AIMaskedMotion(id, controller, ANIM_AGENT_PELVIS_FIX), mCharacter(NULL) { mName = "pelvis_fix"; @@ -493,7 +565,7 @@ public: //------------------------------------------------------------------------- // static constructor // all subclasses must implement such a function and register it - static LLMotion *create(const LLUUID& id) { return new LLPelvisFixMotion(id); } + static LLMotion* create(LLUUID const& id, LLMotionController* controller) { return new LLPelvisFixMotion(id, controller); } public: //------------------------------------------------------------------------- @@ -538,11 +610,6 @@ public: return STATUS_SUCCESS; } - // called when a motion is activated - // must return TRUE to indicate success, or else - // it will be deactivated - virtual BOOL onActivate() { return TRUE; } - // called per time step // must return TRUE while it is active, and // must return FALSE when the motion is completed. @@ -553,9 +620,6 @@ public: return TRUE; } - // called when a motion is deactivated - virtual void onDeactivate() {} - private: //------------------------------------------------------------------------- // joint states to be animated @@ -1438,17 +1502,17 @@ void LLVOAvatar::deleteCachedImages(bool clearAll) //------------------------------------------------------------------------ void LLVOAvatar::initClass() { - gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise"); - gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot"); - gAnimLibrary.animStateSetString(ANIM_AGENT_PHYSICS_MOTION,"physics_motion"); - gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING,"editing"); - gAnimLibrary.animStateSetString(ANIM_AGENT_EYE,"eye"); - gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST,"fly_adjust"); - gAnimLibrary.animStateSetString(ANIM_AGENT_HAND_MOTION,"hand_motion"); - gAnimLibrary.animStateSetString(ANIM_AGENT_HEAD_ROT,"head_rot"); - gAnimLibrary.animStateSetString(ANIM_AGENT_PELVIS_FIX,"pelvis_fix"); - gAnimLibrary.animStateSetString(ANIM_AGENT_TARGET,"target"); - gAnimLibrary.animStateSetString(ANIM_AGENT_WALK_ADJUST,"walk_adjust"); + gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE_ID,"body_noise"); + gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT_ID,"breathe_rot"); + gAnimLibrary.animStateSetString(ANIM_AGENT_PHYSICS_MOTION_ID,"physics_motion"); + gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING_ID,"editing"); + gAnimLibrary.animStateSetString(ANIM_AGENT_EYE_ID,"eye"); + gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST_ID,"fly_adjust"); + gAnimLibrary.animStateSetString(ANIM_AGENT_HAND_MOTION_ID,"hand_motion"); + gAnimLibrary.animStateSetString(ANIM_AGENT_HEAD_ROT_ID,"head_rot"); + gAnimLibrary.animStateSetString(ANIM_AGENT_PELVIS_FIX_ID,"pelvis_fix"); + gAnimLibrary.animStateSetString(ANIM_AGENT_TARGET_ID,"target"); + gAnimLibrary.animStateSetString(ANIM_AGENT_WALK_ADJUST_ID,"walk_adjust"); SHClientTagMgr::instance(); //Instantiate. Parse. Will fetch a new tag file if AscentUpdateTagsOnLoad is true. } @@ -1506,19 +1570,19 @@ void LLVOAvatar::initInstance(void) registerMotion( ANIM_AGENT_WALK_NEW, LLKeyframeWalkMotion::create ); //v2 // motions without a start/stop bit - registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create ); - registerMotion( ANIM_AGENT_BREATHE_ROT, LLBreatheMotionRot::create ); - registerMotion( ANIM_AGENT_PHYSICS_MOTION, LLPhysicsMotionController::create ); - registerMotion( ANIM_AGENT_EDITING, LLEditingMotion::create ); - registerMotion( ANIM_AGENT_EYE, LLEyeMotion::create ); - registerMotion( ANIM_AGENT_FLY_ADJUST, LLFlyAdjustMotion::create ); - registerMotion( ANIM_AGENT_HAND_MOTION, LLHandMotion::create ); - registerMotion( ANIM_AGENT_HEAD_ROT, LLHeadRotMotion::create ); - registerMotion( ANIM_AGENT_PELVIS_FIX, LLPelvisFixMotion::create ); - registerMotion( ANIM_AGENT_SIT_FEMALE, LLKeyframeMotion::create ); - registerMotion( ANIM_AGENT_TARGET, LLTargetingMotion::create ); - registerMotion( ANIM_AGENT_WALK_ADJUST, LLWalkAdjustMotion::create ); + registerMotion( ANIM_AGENT_BODY_NOISE_ID, LLBodyNoiseMotion::create ); + registerMotion( ANIM_AGENT_BREATHE_ROT_ID, LLBreatheMotionRot::create ); + registerMotion( ANIM_AGENT_PHYSICS_MOTION_ID, LLPhysicsMotionController::create ); + registerMotion( ANIM_AGENT_EDITING_ID, LLEditingMotion::create ); + registerMotion( ANIM_AGENT_EYE_ID, LLEyeMotion::create ); + registerMotion( ANIM_AGENT_FLY_ADJUST_ID, LLFlyAdjustMotion::create ); + registerMotion( ANIM_AGENT_HAND_MOTION_ID, LLHandMotion::create ); + registerMotion( ANIM_AGENT_HEAD_ROT_ID, LLHeadRotMotion::create ); + registerMotion( ANIM_AGENT_PELVIS_FIX_ID, LLPelvisFixMotion::create ); + registerMotion( ANIM_AGENT_TARGET_ID, LLTargetingMotion::create ); + registerMotion( ANIM_AGENT_WALK_ADJUST_ID, LLWalkAdjustMotion::create ); + registerMotion( ANIM_AGENT_SIT_FEMALE, LLKeyframeMotion::create ); } LLAvatarAppearance::initInstance(); @@ -3312,7 +3376,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) static const LLCachedControl phoenix_name_system("PhoenixNameSystem", 0); - bool show_display_names = phoenix_name_system == 1 || phoenix_name_system == 2; + bool show_display_names = phoenix_name_system > 0 || phoenix_name_system < 4; bool show_usernames = phoenix_name_system != 2; if (show_display_names && LLAvatarNameCache::useDisplayNames()) { @@ -3332,7 +3396,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) // Might be blank if name not available yet, that's OK if (show_display_names) { - firstnameText=av_name.mDisplayName; //Defer for later formatting + firstnameText = phoenix_name_system == 3 ? av_name.mUsername : av_name.mDisplayName; //Defer for later formatting //addNameTagLine(av_name.mDisplayName, name_tag_color, LLFontGL::NORMAL, // LLFontGL::getFontSansSerif()); } @@ -3341,7 +3405,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) { firstnameText.push_back(' '); firstnameText.push_back('('); - firstnameText.append(av_name.mUsername); //Defer for later formatting + firstnameText.append(phoenix_name_system == 3 ? av_name.mDisplayName : av_name.mUsername); //Defer for later formatting firstnameText.push_back(')'); // *HACK: Desaturate the color //LLColor4 username_color = name_tag_color * 0.83f; @@ -3748,6 +3812,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) if (LLVOAvatar::sShowAnimationDebug) { + addDebugText(llformat("at=%.1f", mMotionController.getAnimTime())); for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin(); iter != mMotionController.getActiveMotions().end(); ++iter) { @@ -3767,6 +3832,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) motionp->getName().c_str(), (U32)motionp->getPriority()); } + if (motionp->server()) + { +#ifdef SHOW_ASSERT + output += llformat(" rt=%.1f r=%d s=0x%xl", motionp->getRuntime(), motionp->mReadyEvents, motionp->server()); +#else + output += llformat(" rt=%.1f s=0x%xl", motionp->getRuntime(), motionp->server()); +#endif + } addDebugText(output); } } @@ -3884,7 +3957,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) getOffObject(); // //Singu note: this appears to be a safety catch: - // when getParent() is NULL and we're note playing ANIM_AGENT_SIT_GROUND_CONSTRAINED then we aren't sitting! + // when getParent() is NULL and we're not playing ANIM_AGENT_SIT_GROUND_CONSTRAINED then we aren't sitting! // The previous call existed in an attempt to fix this inconsistent state by standing up from an object. // However, since getParent() is NULL that function would crash! // Since we never got crash reports regarding to this, that apparently never happened, except, I discovered @@ -5437,6 +5510,7 @@ void LLVOAvatar::processAnimationStateChanges() } // clear all current animations + BOOL const AOEnabled = gSavedSettings.getBOOL("AOEnabled"); // Singu note: put this outside the loop. AnimIterator anim_it; for (anim_it = mPlayingAnimations.begin(); anim_it != mPlayingAnimations.end();) { @@ -5446,9 +5520,9 @@ void LLVOAvatar::processAnimationStateChanges() if (found_anim == mSignaledAnimations.end()) { - if (isSelf()) + if (AOEnabled && isSelf()) { - if ((gSavedSettings.getBOOL("AOEnabled")) && LLFloaterAO::stopMotion(anim_it->first, FALSE)) // if the AO replaced this anim serverside then stop it serverside + if (LLFloaterAO::stopMotion(anim_it->first, FALSE)) // if the AO replaced this anim serverside then stop it serverside { // return TRUE; //no local stop needed } @@ -5456,7 +5530,7 @@ void LLVOAvatar::processAnimationStateChanges() processSingleAnimationStateChange(anim_it->first, FALSE); // - LLFloaterExploreAnimations::stopAnim(getID(), anim_it->first); + LLFloaterExploreAnimations::processAnim(getID(), anim_it->first, false); // mPlayingAnimations.erase(anim_it++); continue; @@ -5474,11 +5548,11 @@ void LLVOAvatar::processAnimationStateChanges() if (found_anim == mPlayingAnimations.end() || found_anim->second != anim_it->second) { // - LLFloaterExploreAnimations::startAnim(getID(), anim_it->first); + LLFloaterExploreAnimations::processAnim(getID(), anim_it->first, true); // if (processSingleAnimationStateChange(anim_it->first, TRUE)) { - if (isSelf() && gSavedSettings.getBOOL("AOEnabled")) // AO is only for ME + if (AOEnabled && isSelf()) // AO is only for ME { LLFloaterAO::startMotion(anim_it->first, 0,FALSE); // AO overrides the anim if needed } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 891fae7d9..ded74c50b 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -54,6 +54,9 @@ #include "llavatarname.h" +// +#if 0 +// Hide these: should be using the bit masks everywhere. extern const LLUUID ANIM_AGENT_BODY_NOISE; extern const LLUUID ANIM_AGENT_BREATHE_ROT; extern const LLUUID ANIM_AGENT_PHYSICS_MOTION; @@ -65,6 +68,8 @@ 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; +#endif +// class LLAPRFile; class LLViewerWearable; @@ -230,6 +235,10 @@ public: /*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); + // + void startMotion(U32 bit, F32 start_offset = 0.f); + void stopMotion(U32 bit, BOOL stop_immediate = FALSE); + // virtual void stopMotionFromSource(const LLUUID& source_id); virtual void requestStopMotion(LLMotion* motion); LLMotion* findMotion(const LLUUID& id) const; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 6f0a4bd9f..c3ead99db 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -897,9 +897,9 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) //virtual void LLVOAvatarSelf::idleUpdateTractorBeam() { - - - if(gSavedSettings.getBOOL("DisablePointAtAndBeam")) + // + static LLCachedControl disable_pointat_effect("DisablePointAtAndBeam"); + if (disable_pointat_effect) { return; } diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 86c5120b4..58f8dbcf0 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -843,7 +843,13 @@ void LLVivoxVoiceClient::stateMachine() } args += " -ll "; +// Singu Note: hard code log level to -1 for Linux, as we are using 2.x version of the SDK there +// Singu TODO: Remove this when the Vivox SDK 4.x is working on Linux +#if LL_LINUX + args += "-1"; +#else args += loglevel; +#endif // If we allow multiple instances of the viewer to start the voicedaemon if (gSavedSettings.getBOOL("VoiceMultiInstance")) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index ea9e5605c..a94d9e856 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -40,6 +40,7 @@ #include "llviewercontrol.h" #include "lldir.h" #include "llflexibleobject.h" +#include "llfloaterinspect.h" #include "llfloatertools.h" #include "llmaterialid.h" #include "llmaterialtable.h" @@ -3643,7 +3644,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& if (mDrawable->isState(LLDrawable::RIGGED)) { static const LLCachedControl allow_mesh_picking("SGAllowRiggedMeshSelection"); - if (allow_mesh_picking && gFloaterTools->getVisible() && getAvatar()->isSelf()) + if (allow_mesh_picking && (gFloaterTools->getVisible() || LLFloaterInspect::instanceExists())) { updateRiggedVolume(); //genBBoxes(FALSE); @@ -3825,10 +3826,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& bool LLVOVolume::treatAsRigged() { - return gFloaterTools->getVisible() && + return (gFloaterTools->getVisible() || LLFloaterInspect::instanceExists()) && isAttachment() && - getAvatar() && - getAvatar()->isSelf() && mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED); } @@ -4191,10 +4190,14 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, //drawable->getVObj()->setDebugText(llformat("%d", drawable->isState(LLDrawable::ANIMATED_CHILD))); LLMaterial* mat = facep->getTextureEntry()->getMaterialParams().get(); + + U32 pool_type = facep->getPoolType(); bool cmp_bump = (type == LLRenderPass::PASS_BUMP) || (type == LLRenderPass::PASS_POST_BUMP); - bool cmp_shiny = !alt_batching ? !!mat : ((type == LLRenderPass::PASS_SHINY) || (type == LLRenderPass::PASS_FULLBRIGHT_SHINY) || (type == LLRenderPass::PASS_INVISI_SHINY)); - bool cmp_mat = !alt_batching || LLPipeline::sRenderDeferred && ((facep->getPoolType() == LLDrawPool::POOL_MATERIALS) || (facep->getPoolType() == LLDrawPool::POOL_ALPHA)); + bool cmp_mat = (!alt_batching) || LLPipeline::sRenderDeferred && /*facep->getTextureEntry()->getColor().mV[3] >= 0.999f &&*/ + ((pool_type == LLDrawPool::POOL_MATERIALS) || (pool_type == LLDrawPool::POOL_ALPHA)); + bool cmp_shiny = (!alt_batching) ? !!mat : (mat && cmp_mat); + bool cmp_fullbright = !alt_batching || cmp_shiny || pool_type == LLDrawPool::POOL_ALPHA; U8 bump = facep->getTextureEntry()->getBumpmap(); U8 shiny = facep->getTextureEntry()->getShiny(); @@ -4209,7 +4212,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 shader_mask = 0xFFFFFFFF; //no shader - if (mat) + if (mat && cmp_mat) { if (type == LLRenderPass::PASS_ALPHA) { @@ -4255,9 +4258,9 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, #endif (!cmp_mat || draw_vec[idx]->mMaterial == mat) && //draw_vec[idx]->mMaterialID == mat_id && - draw_vec[idx]->mFullbright == fullbright && + (!cmp_fullbright || draw_vec[idx]->mFullbright == fullbright) && (!cmp_bump || draw_vec[idx]->mBump == bump) && - (!cmp_shiny || !!draw_vec[idx]->mShiny == !!shiny) && + (!cmp_shiny || draw_vec[idx]->mShiny == shiny) && //(!mat || (draw_vec[idx]->mShiny == shiny)) && // need to break batches when a material is shared, but legacy settings are different draw_vec[idx]->mTextureMatrix == tex_mat && draw_vec[idx]->mModelMatrix == model_mat && @@ -4539,6 +4542,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) bool is_rigged = false; + static const LLCachedControl alt_batching("SHAltBatching",true); + //for each face for (S32 i = 0; i < drawablep->getNumFaces(); i++) { @@ -4647,7 +4652,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) } LLMaterial* mat = te->getMaterialParams().get(); - + + if(!alt_batching) + { if (mat && LLPipeline::sRenderDeferred) { U8 alpha_mode = mat->getDiffuseAlphaMode(); @@ -4760,6 +4767,68 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) } } } + } + else + { + if(type == LLDrawPool::POOL_ALPHA) + { + if(te->getColor().mV[3] > 0.f) + { + U32 mask = te->getFullbright() ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA : LLDrawPoolAvatar::RIGGED_ALPHA; + if (mat && LLPipeline::sRenderDeferred && te->getColor().mV[3] >= 0.999f ) + { + if(mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) + mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND); + else + mask = mat->getShaderMask(); + } + pool->addRiggedFace(facep, mask); + } + } + else if(!LLPipeline::sRenderDeferred) + { + if(type == LLDrawPool::POOL_FULLBRIGHT || type == LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT); + } + else if(type == LLDrawPool::POOL_SIMPLE || type == LLDrawPool::POOL_ALPHA_MASK) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); + } + else if(type == LLDrawPool::POOL_BUMP) //Either shiny, or bump (which isn't used in non-deferred) + { + if(te->getShiny()) + pool->addRiggedFace(facep, te->getFullbright() ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT_SHINY : LLDrawPoolAvatar::RIGGED_SHINY); + else + pool->addRiggedFace(facep, te->getFullbright() ? LLDrawPoolAvatar::RIGGED_FULLBRIGHT : LLDrawPoolAvatar::RIGGED_SIMPLE); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE); + } + } + + else + { + if( type == LLDrawPool::POOL_FULLBRIGHT || type == LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT); + } + //Annoying exception to the rule. getPoolTypeFromTE will return POOL_ALPHA_MASK for legacy bumpmaps, but there is no POOL_ALPHA_MASK in deferred. + else if(type == LLDrawPool::POOL_MATERIALS || (type == LLDrawPool::POOL_ALPHA_MASK && mat)) + { + pool->addRiggedFace(facep, mat->getShaderMask()); + } + else if (type == LLDrawPool::POOL_BUMP && te->getBumpmap()) + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_BUMP); + } + else + { + pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_DEFERRED_SIMPLE); + } + } + } } continue; @@ -4804,8 +4873,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) } } - static const LLCachedControl alt_batching("SHAltBatching",true); - bool force_fullbright = group->isHUDGroup(); BOOL force_simple = (facep->getPixelArea() < FORCE_SIMPLE_RENDER_AREA); U32 type = gPipeline.getPoolTypeFromTE(te, tex); @@ -4836,7 +4903,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) } } } - else if (force_fullbright) + else if (force_fullbright) //Hud is done in a forward render. Fullbright cannot be shared with simple. { if(type == LLDrawPool::POOL_ALPHA_MASK) type = LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK; @@ -5368,11 +5435,9 @@ struct CompareBatchBreakerModified return lte->getMaterialParams() < rte->getMaterialParams(); } else if (LLPipeline::sRenderDeferred && (lte->getMaterialParams() == rte->getMaterialParams()) && (lte->getShiny() != rte->getShiny())) - { return lte->getShiny() < rte->getShiny(); } - else { return lhs->getTexture() < rhs->getTexture(); @@ -5396,9 +5461,11 @@ struct CompareBatchBreakerModified return !(batch_left < batch_right); } - bool batch_shiny = (!LLPipeline::sRenderDeferred || lhs->isState(LLFace::FULLBRIGHT)) && lhs->getPoolType() == LLDrawPool::POOL_BUMP; + static const LLCachedControl sh_fullbright_deferred("SHFullbrightDeferred",true); + bool batch_shiny = (!LLPipeline::sRenderDeferred || (sh_fullbright_deferred && lhs->isState(LLFace::FULLBRIGHT))) && lhs->getPoolType() == LLDrawPool::POOL_BUMP; + bool batch_fullbright = sh_fullbright_deferred || !LLPipeline::sRenderDeferred && lhs->getPoolType() == LLDrawPool::POOL_ALPHA; - if (lhs->isState(LLFace::FULLBRIGHT) != rhs->isState(LLFace::FULLBRIGHT)) + if (batch_fullbright && lhs->isState(LLFace::FULLBRIGHT) != rhs->isState(LLFace::FULLBRIGHT)) { return lhs->isState(LLFace::FULLBRIGHT) < rhs->isState(LLFace::FULLBRIGHT); } @@ -6196,21 +6263,40 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac llassert_always(mask & LLVertexBuffer::MAP_NORMAL); } - if (is_fullbright) + if(LLPipeline::sRenderDeferred) { - registerFace(group, facep, is_shiny_shader ? LLRenderPass::PASS_FULLBRIGHT_SHINY : LLRenderPass::PASS_FULLBRIGHT); - if(is_bump) - registerFace(group, facep, LLPipeline::sRenderDeferred ? LLRenderPass::PASS_POST_BUMP : LLRenderPass::PASS_BUMP); + static const LLCachedControl sh_fullbright_deferred("SHFullbrightDeferred",true); + if(sh_fullbright_deferred && is_fullbright) + { + registerFace(group, facep, is_shiny_shader ? LLRenderPass::PASS_FULLBRIGHT_SHINY : LLRenderPass::PASS_FULLBRIGHT); + if(is_bump) + { + registerFace(group, facep, LLRenderPass::PASS_POST_BUMP); + } + } + else + { + //is_bump should always be true. + registerFace(group, facep, is_bump ? LLRenderPass::PASS_BUMP : LLRenderPass::PASS_SIMPLE); + } } else { - registerFace(group, facep, (LLPipeline::sRenderDeferred || !is_shiny_shader) ? LLRenderPass::PASS_SIMPLE : LLRenderPass::PASS_SHINY); + if (is_fullbright ) + { + registerFace(group, facep, is_shiny_shader ? LLRenderPass::PASS_FULLBRIGHT_SHINY : LLRenderPass::PASS_FULLBRIGHT); + } + else + { + registerFace(group, facep, is_shiny_shader ? LLRenderPass::PASS_SHINY : LLRenderPass::PASS_SIMPLE); + } + if(is_bump) registerFace(group, facep, LLRenderPass::PASS_BUMP); - } - if(is_shiny_fixed) - registerFace(group, facep, LLRenderPass::PASS_SHINY); + if(is_shiny_fixed) + registerFace(group, facep, LLRenderPass::PASS_SHINY); + } } } if (!is_alpha && LLPipeline::sRenderGlow && te->getGlow() > 0.f) diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index c4e73d90b..b4ab34d36 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -166,7 +166,7 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable) static const LLCachedControl render_transparent_water("RenderTransparentWater",false); static const LLCachedControl water_subdiv("SianaVoidWaterSubdivision", 16); - const S32 size = (render_transparent_water && LLGLSLShader::sNoFixedFunction) ? water_subdiv : 1; + const S32 size = ((render_transparent_water || LLPipeline::sRenderDeferred) && LLGLSLShader::sNoFixedFunction) ? water_subdiv : 1; const S32 num_quads = size * size; face->setSize(vertices_per_quad * num_quads, indices_per_quad * num_quads); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 560f150c8..2593391be 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1577,34 +1577,39 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima } else { + static const LLCachedControl sh_fullbright_deferred("SHFullbrightDeferred",true); + + //Bump goes into bump pool unless using deferred and there's a normal map that takes precedence. + bool legacy_bump = (!LLPipeline::sRenderDeferred || !mat || mat->getNormalID().isNull()) && LLPipeline::sRenderBump && te->getBumpmap() && te->getBumpmap() < 18; if (alpha) { return LLDrawPool::POOL_ALPHA; } - else if ((!LLPipeline::sRenderDeferred || !mat || mat->getNormalID().isNull()) && LLPipeline::sRenderBump && te->getBumpmap() && te->getBumpmap() < 18) - { - return LLDrawPool::POOL_BUMP; //Bump goes into bump pool unless using deferred and there's a normal map that takes precedence. - } else if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) { - if(te->getFullbright()) + if(!LLPipeline::sRenderDeferred || legacy_bump) + { + return te->getFullbright() ? LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK : LLDrawPool::POOL_ALPHA_MASK; + } + else if(te->getFullbright() && !mat->getEnvironmentIntensity() && !te->getShiny()) { return LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK; } - else - { - return LLPipeline::sRenderDeferred ? LLDrawPool::POOL_MATERIALS : LLDrawPool::POOL_ALPHA_MASK; - } + return LLDrawPool::POOL_MATERIALS; + } + else if (legacy_bump) + { + return LLDrawPool::POOL_BUMP; } else if(LLPipeline::sRenderDeferred && mat) { - if(te->getFullbright() && mat->getEnvironmentIntensity()) + if(te->getFullbright() && !mat->getEnvironmentIntensity() && !te->getShiny()) { - return LLDrawPool::POOL_FULLBRIGHT; + return sh_fullbright_deferred ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE; } return LLDrawPool::POOL_MATERIALS; } - else if(te->getFullbright()) + else if((sh_fullbright_deferred || !LLPipeline::sRenderDeferred) && te->getFullbright()) { return (LLPipeline::sRenderBump && te->getShiny()) ? LLDrawPool::POOL_BUMP : LLDrawPool::POOL_FULLBRIGHT; } @@ -2339,6 +2344,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl LLGLDisable blend(GL_BLEND); LLGLDisable test(GL_ALPHA_TEST); + LLGLDisable stencil(GL_STENCIL_TEST); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); @@ -2554,15 +2560,13 @@ void LLPipeline::downsampleDepthBuffer(LLRenderTarget& source, LLRenderTarget& d { mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0); mDeferredVB->allocateBuffer(8, 0, true); - } - - LLStrider vert; - mDeferredVB->getVertexStrider(vert); - LLStrider tc0; + LLStrider vert; + mDeferredVB->getVertexStrider(vert); - vert[0].set(-1,1,0); - vert[1].set(-1,-3,0); - vert[2].set(3,1,0); + vert[0].set(-1,1,0); + vert[1].set(-1,-3,0); + vert[2].set(3,1,0); + } if (source.getUsage() == LLTexUnit::TT_RECT_TEXTURE) { @@ -7967,15 +7971,14 @@ void LLPipeline::renderDeferredLighting() { mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0); mDeferredVB->allocateBuffer(8, 0, true); + LLStrider vert; + mDeferredVB->getVertexStrider(vert); + + vert[0].set(-1,1,0); + vert[1].set(-1,-3,0); + vert[2].set(3,1,0); } - LLStrider vert; - mDeferredVB->getVertexStrider(vert); - - vert[0].set(-1,1,0); - vert[1].set(-1,-3,0); - vert[2].set(3,1,0); - { setupHWLights(NULL); //to set mSunDir; LLVector4 dir(mSunDir, 0.f); @@ -8397,12 +8400,6 @@ void LLPipeline::renderDeferredLighting() unbindDeferredShader(gDeferredSpotLightProgram); } - //reset mDeferredVB to fullscreen triangle - mDeferredVB->getVertexStrider(vert); - vert[0].set(-1,1,0); - vert[1].set(-1,-3,0); - vert[2].set(3,1,0); - { LLGLDepthTest depth(GL_FALSE); @@ -8515,14 +8512,10 @@ void LLPipeline::renderDeferredLighting() { LLGLDepthTest depth(GL_FALSE, GL_FALSE); - LLVector2 tc1(0,0); - LLVector2 tc2((F32) mScreen.getWidth()*2, - (F32) mScreen.getHeight()*2); - mScreen.bindTarget(); // Apply gamma correction to the frame here. gDeferredPostGammaCorrectProgram.bind(); - //mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); S32 channel = 0; channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); if (channel > -1) @@ -8533,21 +8526,7 @@ void LLPipeline::renderDeferredLighting() gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); - //F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); - - //gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f)); - - gGL.begin(LLRender::TRIANGLE_STRIP); - gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); - gGL.vertex2f(-1,-1); - - gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); - gGL.vertex2f(-1,3); - - gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); - gGL.vertex2f(3,-1); - - gGL.end(); + mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); gGL.getTexUnit(channel)->unbind(mScreen.getUsage()); gDeferredPostGammaCorrectProgram.unbind(); @@ -8568,10 +8547,10 @@ void LLPipeline::renderDeferredLighting() pushRenderTypeMask(); andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA, LLPipeline::RENDER_TYPE_FULLBRIGHT, - //LLPipeline::RENDER_TYPE_VOLUME, + LLPipeline::RENDER_TYPE_VOLUME, LLPipeline::RENDER_TYPE_GLOW, LLPipeline::RENDER_TYPE_BUMP, - /*LLPipeline::RENDER_TYPE_PASS_SIMPLE, //These aren't used. + LLPipeline::RENDER_TYPE_PASS_SIMPLE, LLPipeline::RENDER_TYPE_PASS_ALPHA, LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, LLPipeline::RENDER_TYPE_PASS_BUMP, @@ -8583,7 +8562,7 @@ void LLPipeline::renderDeferredLighting() LLPipeline::RENDER_TYPE_PASS_GRASS, LLPipeline::RENDER_TYPE_PASS_SHINY, LLPipeline::RENDER_TYPE_PASS_INVISIBLE, - LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,*/ + LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, LLPipeline::RENDER_TYPE_AVATAR, LLPipeline::RENDER_TYPE_ALPHA_MASK, LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, @@ -9191,10 +9170,10 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) pushRenderTypeMask(); andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA, LLPipeline::RENDER_TYPE_FULLBRIGHT, - //LLPipeline::RENDER_TYPE_VOLUME, + LLPipeline::RENDER_TYPE_VOLUME, LLPipeline::RENDER_TYPE_GLOW, LLPipeline::RENDER_TYPE_BUMP, - /*LLPipeline::RENDER_TYPE_PASS_SIMPLE, //These aren't used. + LLPipeline::RENDER_TYPE_PASS_SIMPLE, LLPipeline::RENDER_TYPE_PASS_ALPHA, LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, LLPipeline::RENDER_TYPE_PASS_BUMP, @@ -9206,7 +9185,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) LLPipeline::RENDER_TYPE_PASS_GRASS, LLPipeline::RENDER_TYPE_PASS_SHINY, LLPipeline::RENDER_TYPE_PASS_INVISIBLE, - LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,*/ + LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, LLPipeline::RENDER_TYPE_AVATAR, LLPipeline::RENDER_TYPE_ALPHA_MASK, LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, @@ -9411,7 +9390,8 @@ inline float sgn(float a) void LLPipeline::generateWaterReflection(LLCamera& camera_in) { - if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate) + static const LLCachedControl render_transparent_water("RenderTransparentWater",false); + if ((render_transparent_water || LLPipeline::sRenderDeferred) && LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate) { BOOL skip_avatar_update = FALSE; if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson) diff --git a/indra/newview/res/singularity.icns b/indra/newview/res/singularity_icon.icns similarity index 100% rename from indra/newview/res/singularity.icns rename to indra/newview/res/singularity_icon.icns diff --git a/indra/newview/res/viewerRes.rc.in b/indra/newview/res/viewerRes.rc.in index 0ca054f5a..0119f9fd9 100644 --- a/indra/newview/res/viewerRes.rc.in +++ b/indra/newview/res/viewerRes.rc.in @@ -61,8 +61,8 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_LL_ICON ICON "singularity_icon.ico" -IDI_LCD_LL_ICON ICON "singularity_icon.ico" +IDI_LL_ICON ICON "${VIEWER_BRANDING_ID}_icon.ico" +IDI_LCD_LL_ICON ICON "${VIEWER_BRANDING_ID}_icon.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -74,7 +74,7 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN ICON IDI_LL_ICON,IDC_STATIC,7,7,20,20 - LTEXT "Loading Second Life...",666,36,13,91,8 + LTEXT "Loading ${VIEWER_CHANNEL}...",666,36,13,91,8 END diff --git a/indra/newview/res/viewerRes_bc.rc.in b/indra/newview/res/viewerRes_bc.rc.in index a9bdd7c8d..3413cf937 100644 --- a/indra/newview/res/viewerRes_bc.rc.in +++ b/indra/newview/res/viewerRes_bc.rc.in @@ -61,8 +61,8 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_LL_ICON ICON "singularity_icon_bc.ico" -IDI_LCD_LL_ICON ICON "singularity_icon_bc.ico" +IDI_LL_ICON ICON "${VIEWER_BRANDING_ID}_icon_bc.ico" +IDI_LCD_LL_ICON ICON "${VIEWER_BRANDING_ID}_icon_bc.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -74,7 +74,7 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN ICON IDI_LL_ICON,IDC_STATIC,7,7,20,20 - LTEXT "Loading Second Life...",666,36,13,91,8 + LTEXT "Loading ${VIEWER_CHANNEL}...",666,36,13,91,8 END diff --git a/indra/newview/rlvui.cpp b/indra/newview/rlvui.cpp index da06f3110..aa1f83153 100644 --- a/indra/newview/rlvui.cpp +++ b/indra/newview/rlvui.cpp @@ -48,6 +48,7 @@ #include "llfloateravatarlist.h" #include "llfloaterworldmap.h" #include "llmenugl.h" +#include "lltoolbar.h" #include "lluictrlfactory.h" #include "llviewerregion.h" @@ -188,13 +189,13 @@ void RlvUIEnabler::onToggleSetEnv() if (!fEnable) { // Only close the floaters if their instance exists and they're actually visible - if ( (LLFloaterEnvSettings::isOpen()) && (LLFloaterEnvSettings::instance()->getVisible()) ) + if ( (LLFloaterEnvSettings::isOpen()) ) LLFloaterEnvSettings::instance()->close(); - if ( (LLFloaterWindLight::isOpen()) && (LLFloaterWindLight::instance()->getVisible()) ) + if ( (LLFloaterWindLight::isOpen()) ) LLFloaterWindLight::instance()->close(); - if ( (LLFloaterWater::isOpen()) && (LLFloaterWater::instance()->getVisible()) ) + if ( (LLFloaterWater::isOpen()) ) LLFloaterWater::instance()->close(); - if ( (LLFloaterDayCycle::isOpen()) && (LLFloaterDayCycle::instance()->getVisible()) ) + if ( (LLFloaterDayCycle::isOpen()) ) LLFloaterDayCycle::instance()->close(); } @@ -251,6 +252,8 @@ void RlvUIEnabler::onToggleShowInv(bool fQuitting) LLMenuGL::sMenuContainer->childSetEnabled("My Outfits", true); LLMenuGL::sMenuContainer->childSetEnabled("Favorites", true); } + gToolBar->childSetEnabled("outfits_btn", fEnable); + gToolBar->childSetEnabled("favs_btn", fEnable); } // Checked: 2010-04-22 (RLVa-1.2.0f) | Modified: RLVa-1.2.0f @@ -299,14 +302,15 @@ void RlvUIEnabler::onToggleShowNames(bool fQuitting) // Close the "Active Speakers" panel if it's currently visible LLFloaterChat::getInstance()->childSetVisible("active_speakers_panel", false); // Close the "Avatar List/Radar" floater if it's currently visible - if ( LLFloaterAvatarList::instanceExists() && LLFloaterAvatarList::getInstance()->getVisible() ) - LLFloaterAvatarList::toggle(NULL); + if (LLFloaterAvatarList::instanceVisible()) + LLFloaterAvatarList::toggleInstance(); LLAvatarNameCache::setForceDisplayNames(true); } else { LLAvatarNameCache::setForceDisplayNames(false); - LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getS32("PhoenixNameSystem") == 1 || gSavedSettings.getS32("PhoenixNameSystem") == 2); + const S32 namesys = gSavedSettings.getS32("PhoenixNameSystem"); + LLAvatarNameCache::setUseDisplayNames(namesys > 0 && namesys < 4); } LLVOAvatar::invalidateNameTags(); // See handleDisplayNamesOptionChanged() } diff --git a/indra/newview/singularity.icns b/indra/newview/singularity_icon.icns similarity index 100% rename from indra/newview/singularity.icns rename to indra/newview/singularity_icon.icns diff --git a/indra/newview/skins/default/textures/icn_toolbar_about_land.tga b/indra/newview/skins/default/textures/icn_toolbar_about_land.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_about_land.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_about_region.tga b/indra/newview/skins/default/textures/icn_toolbar_about_region.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_about_region.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_about_viewer.tga b/indra/newview/skins/default/textures/icn_toolbar_about_viewer.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_about_viewer.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_anims_explorer.tga b/indra/newview/skins/default/textures/icn_toolbar_anims_explorer.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_anims_explorer.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_ao.tga b/indra/newview/skins/default/textures/icn_toolbar_ao.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_ao.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_appearance.tga b/indra/newview/skins/default/textures/icn_toolbar_appearance.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_appearance.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_areasearch.tga b/indra/newview/skins/default/textures/icn_toolbar_areasearch.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_areasearch.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_asset_blacklist.tga b/indra/newview/skins/default/textures/icn_toolbar_asset_blacklist.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_asset_blacklist.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_beacons.tga b/indra/newview/skins/default/textures/icn_toolbar_beacons.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_beacons.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_bumps.tga b/indra/newview/skins/default/textures/icn_toolbar_bumps.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_bumps.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_buy_currency.tga b/indra/newview/skins/default/textures/icn_toolbar_buy_currency.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_buy_currency.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_buy_land.tga b/indra/newview/skins/default/textures/icn_toolbar_buy_land.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_buy_land.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_camera_controls.tga b/indra/newview/skins/default/textures/icn_toolbar_camera_controls.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_camera_controls.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_change_buttons.tga b/indra/newview/skins/default/textures/icn_toolbar_change_buttons.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_change_buttons.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_day_cycle_editor.tga b/indra/newview/skins/default/textures/icn_toolbar_day_cycle_editor.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_day_cycle_editor.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_debug_avatar.tga b/indra/newview/skins/default/textures/icn_toolbar_debug_avatar.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_debug_avatar.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_debug_console.tga b/indra/newview/skins/default/textures/icn_toolbar_debug_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_debug_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_debug_settings.tga b/indra/newview/skins/default/textures/icn_toolbar_debug_settings.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_debug_settings.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_display_name.tga b/indra/newview/skins/default/textures/icn_toolbar_display_name.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_display_name.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_edit_ui.tga b/indra/newview/skins/default/textures/icn_toolbar_edit_ui.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_edit_ui.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_env_editor.tga b/indra/newview/skins/default/textures/icn_toolbar_env_editor.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_env_editor.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_fast_timers.tga b/indra/newview/skins/default/textures/icn_toolbar_fast_timers.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_fast_timers.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_favorites.tga b/indra/newview/skins/default/textures/icn_toolbar_favorites.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_favorites.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_font_test.tga b/indra/newview/skins/default/textures/icn_toolbar_font_test.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_font_test.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_frame_console.tga b/indra/newview/skins/default/textures/icn_toolbar_frame_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_frame_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_friends.tga b/indra/newview/skins/default/textures/icn_toolbar_friends.tga new file mode 100644 index 000000000..0a1a235f3 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_friends.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_gestures.tga b/indra/newview/skins/default/textures/icn_toolbar_gestures.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_gestures.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_god_tools.tga b/indra/newview/skins/default/textures/icn_toolbar_god_tools.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_god_tools.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_grid_options.tga b/indra/newview/skins/default/textures/icn_toolbar_grid_options.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_grid_options.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_group_titles.tga b/indra/newview/skins/default/textures/icn_toolbar_group_titles.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_group_titles.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_groups.tga b/indra/newview/skins/default/textures/icn_toolbar_groups.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_groups.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_http_console.tga b/indra/newview/skins/default/textures/icn_toolbar_http_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_http_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_im.tga b/indra/newview/skins/default/textures/icn_toolbar_im.tga new file mode 100644 index 000000000..0a1a235f3 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_im.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_inspect.tga b/indra/newview/skins/default/textures/icn_toolbar_inspect.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_inspect.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_lag_meter.tga b/indra/newview/skins/default/textures/icn_toolbar_lag_meter.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_lag_meter.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_local_assets.tga b/indra/newview/skins/default/textures/icn_toolbar_local_assets.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_local_assets.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_local_chat.tga b/indra/newview/skins/default/textures/icn_toolbar_local_chat.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_local_chat.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_make_outfit.tga b/indra/newview/skins/default/textures/icn_toolbar_make_outfit.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_make_outfit.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_media_filter.tga b/indra/newview/skins/default/textures/icn_toolbar_media_filter.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_media_filter.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_media_ticker.tga b/indra/newview/skins/default/textures/icn_toolbar_media_ticker.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_media_ticker.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_memleak.tga b/indra/newview/skins/default/textures/icn_toolbar_memleak.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_memleak.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_message_log.tga b/indra/newview/skins/default/textures/icn_toolbar_message_log.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_message_log.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_mouselook.tga b/indra/newview/skins/default/textures/icn_toolbar_mouselook.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_mouselook.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_movement_controls.tga b/indra/newview/skins/default/textures/icn_toolbar_movement_controls.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_movement_controls.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_mute_list.tga b/indra/newview/skins/default/textures/icn_toolbar_mute_list.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_mute_list.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_my_land.tga b/indra/newview/skins/default/textures/icn_toolbar_my_land.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_my_land.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_notifications_console.tga b/indra/newview/skins/default/textures/icn_toolbar_notifications_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_notifications_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_outbox.tga b/indra/newview/skins/default/textures/icn_toolbar_outbox.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_outbox.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_outfits.tga b/indra/newview/skins/default/textures/icn_toolbar_outfits.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_outfits.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_pathfinding_characters.tga b/indra/newview/skins/default/textures/icn_toolbar_pathfinding_characters.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_pathfinding_characters.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_pathing_linksets.tga b/indra/newview/skins/default/textures/icn_toolbar_pathing_linksets.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_pathing_linksets.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_post_process.tga b/indra/newview/skins/default/textures/icn_toolbar_post_process.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_post_process.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_preferences.tga b/indra/newview/skins/default/textures/icn_toolbar_preferences.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_preferences.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_region_console.tga b/indra/newview/skins/default/textures/icn_toolbar_region_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_region_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_report_abuse.tga b/indra/newview/skins/default/textures/icn_toolbar_report_abuse.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_report_abuse.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_rlv_locks.tga b/indra/newview/skins/default/textures/icn_toolbar_rlv_locks.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_rlv_locks.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_rlv_restrictions.tga b/indra/newview/skins/default/textures/icn_toolbar_rlv_restrictions.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_rlv_restrictions.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_rlv_strings.tga b/indra/newview/skins/default/textures/icn_toolbar_rlv_strings.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_rlv_strings.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_run.tga b/indra/newview/skins/default/textures/icn_toolbar_run.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_run.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_script_errors.tga b/indra/newview/skins/default/textures/icn_toolbar_script_errors.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_script_errors.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_script_info.tga b/indra/newview/skins/default/textures/icn_toolbar_script_info.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_script_info.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_sit.tga b/indra/newview/skins/default/textures/icn_toolbar_sit.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_sit.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_sound_explorer.tga b/indra/newview/skins/default/textures/icn_toolbar_sound_explorer.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_sound_explorer.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_stats.tga b/indra/newview/skins/default/textures/icn_toolbar_stats.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_stats.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_teleport_history.tga b/indra/newview/skins/default/textures/icn_toolbar_teleport_history.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_teleport_history.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_test.tga b/indra/newview/skins/default/textures/icn_toolbar_test.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_test.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_texture_category_console.tga b/indra/newview/skins/default/textures/icn_toolbar_texture_category_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_texture_category_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_texture_console.tga b/indra/newview/skins/default/textures/icn_toolbar_texture_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_texture_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_texture_size_console.tga b/indra/newview/skins/default/textures/icn_toolbar_texture_size_console.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_texture_size_console.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_tutorial.tga b/indra/newview/skins/default/textures/icn_toolbar_tutorial.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_tutorial.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_upload_perms.tga b/indra/newview/skins/default/textures/icn_toolbar_upload_perms.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_upload_perms.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_voice_effects.tga b/indra/newview/skins/default/textures/icn_toolbar_voice_effects.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_voice_effects.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_water_editor.tga b/indra/newview/skins/default/textures/icn_toolbar_water_editor.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_water_editor.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_web.tga b/indra/newview/skins/default/textures/icn_toolbar_web.tga new file mode 100644 index 000000000..49e5d11a2 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_web.tga differ diff --git a/indra/newview/skins/default/textures/icn_toolbar_windlight.tga b/indra/newview/skins/default/textures/icn_toolbar_windlight.tga new file mode 100644 index 000000000..0a1a235f3 Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_windlight.tga differ diff --git a/indra/newview/skins/default/xui/en-us/floater_about.xml b/indra/newview/skins/default/xui/en-us/floater_about.xml index 151fdb0ec..a94a96aa9 100644 --- a/indra/newview/skins/default/xui/en-us/floater_about.xml +++ b/indra/newview/skins/default/xui/en-us/floater_about.xml @@ -2,7 +2,7 @@ + title="About [SHORT_APP_NAME]" width="470"> @@ -31,7 +31,7 @@ Collada DOM Copyright 2006 Sony Computer Entertainment Inc. cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se) DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. expat Copyright (C) 1998-2000 Thai Open Source Software Center Ltd., 2001-2006 Expat maintainers. -FMOD Sound System, Copyright (C) 1994-2012 Firelight Technologies Pty, Ltd. +FMOD Sound System, Copyright (C) 1994-2013 Firelight Technologies Pty, Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. GLOD Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia. diff --git a/indra/newview/skins/default/xui/en-us/floater_about_land.xml b/indra/newview/skins/default/xui/en-us/floater_about_land.xml index eac223645..24669cf48 100644 --- a/indra/newview/skins/default/xui/en-us/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en-us/floater_about_land.xml @@ -1382,7 +1382,7 @@ Select the thumbnail to choose a different texture. + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en-us/strings.xml b/indra/newview/skins/default/xui/en-us/strings.xml index 7453a18f6..b23b8e948 100644 --- a/indra/newview/skins/default/xui/en-us/strings.xml +++ b/indra/newview/skins/default/xui/en-us/strings.xml @@ -27,6 +27,7 @@ Make sure you entered the correct Login URI. An example of a Login URI is: \"htt Second Life Singularity Viewer SINGULARITY VIEWER + Singularity Second Life Grid Second Life Support Portal @@ -66,7 +67,7 @@ Make sure you entered the correct Login URI. An example of a Login URI is: \"htt Requesting region capabilities, attempt [NUMBER]... Waiting for region handshake... Connecting to region... - Downloading clothing... + Dry cleaning clothing... Login failed. Quit diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2a1c336b0..9a284bcf2 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -406,6 +406,8 @@ class WindowsManifest(ViewerManifest): 'inst_name':self.channel_oneword() + ' (64 bit)' if self.is_win64() else self.channel_oneword(), 'installer_file':self.installer_file(), 'viewer_name': "%s%s" % (self.channel(), " (64 bit)" if self.is_win64() else "" ), + 'install_icon': "install_icon_%s.ico" % self.viewer_branding_id(), + 'uninstall_icon': "uninstall_icon_%s.ico" % self.viewer_branding_id(), } version_vars = """ @@ -422,8 +424,9 @@ class WindowsManifest(ViewerManifest): !define INSTNAME "%(inst_name)s" !define SHORTCUT "%(viewer_name)s Viewer" !define URLNAME "secondlife" - !define INSTALL_ICON "install_icon_singularity.ico" - !define UNINSTALL_ICON "install_icon_singularity.ico" + !define INSTALL_ICON "%(install_icon)s" + !define UNINSTALL_ICON "%(uninstall_icon)s" + !define AUTHOR "Linden Research, Inc." #TODO: Hook this up to cmake et al for easier branding. Caption "${VIEWERNAME} ${VERSION_LONG}" """ if 'installer_name' in self.args: @@ -493,8 +496,7 @@ class DarwinManifest(ViewerManifest): self.path("featuretable_mac.txt") self.path("SecondLife.nib") - # SG:TODO - self.path("../newview/res/singularity.icns", dst="singularity.icns") + self.path(("../newview/res/%s_icon.icns" % self.viewer_branding_id()), dst=("%s_icon.icns" % self.viewer_branding_id())) # Translations self.path("English.lproj") @@ -856,9 +858,6 @@ class Linux_i686Manifest(LinuxManifest): self.end_prefix() if self.prefix(src="vivox-runtime/i686-linux", dst="lib"): self.path("libortp.so") - self.path("libsndfile.so.1") - self.path("libvivoxoal.so.1") - self.path("libvivoxplatform.so") self.path("libvivoxsdk.so") self.end_prefix("lib") @@ -917,9 +916,6 @@ class Linux_x86_64Manifest(LinuxManifest): if self.prefix(src="vivox-runtime/i686-linux", dst="lib32"): #self.path("libalut.so") self.path("libortp.so") - self.path("libsndfile.so.1") - self.path("libvivoxoal.so.1") - self.path("libvivoxplatform.so") self.path("libvivoxsdk.so") self.end_prefix("lib32") diff --git a/install.xml b/install.xml index c4d2cb6b2..2ce264078 100644 --- a/install.xml +++ b/install.xml @@ -1360,16 +1360,16 @@ linux md5sum - 2d7bf76438a6a13f1b3ee682af446f93 + 01573510dce7f380f44e561ef2f3dd9f url - https://bitbucket.org/SingularityViewer/libraries/downloads/slvoice-4.5.0009.17865-linux-20140312.tar.bz2 + https://bitbucket.org/SingularityViewer/libraries/downloads/vivox-2.1.3010.6270-linux-20090309.tar.bz2 linux64 md5sum - 2d7bf76438a6a13f1b3ee682af446f93 + 01573510dce7f380f44e561ef2f3dd9f url - https://bitbucket.org/SingularityViewer/libraries/downloads/slvoice-4.5.0009.17865-linux-20140312.tar.bz2 + https://bitbucket.org/SingularityViewer/libraries/downloads/vivox-2.1.3010.6270-linux-20090309.tar.bz2 windows