diff options
author | Josh Bell <josh@lindenlab.com> | 2007-03-31 01:41:19 +0000 |
---|---|---|
committer | Josh Bell <josh@lindenlab.com> | 2007-03-31 01:41:19 +0000 |
commit | ea8fb7238e6f12383ee4bc081475fa6235637581 (patch) | |
tree | f384da93c884353bef55cf887f6c86f2081db271 /indra | |
parent | ffc6680d956069625fc1fe5da133bdf7922cea83 (diff) |
svn merge -r 59364:59813 svn+ssh://svn.lindenlab.com/svn/linden/branches/maintenance --> release
Diffstat (limited to 'indra')
153 files changed, 3264 insertions, 3466 deletions
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h index 0ed22f81f7..44fb6d0833 100644 --- a/indra/llcharacter/llcharacter.h +++ b/indra/llcharacter/llcharacter.h @@ -108,7 +108,7 @@ public: // updates all visual parameters for this character virtual void updateVisualParams(); - virtual void addDebugText( const char* text ) = 0; + virtual void addDebugText( const std::string& text ) = 0; virtual const LLUUID& getID() = 0; //------------------------------------------------------------------------- diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 0aeefb1a21..7c8a7160e7 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -29,7 +29,7 @@ // Static Definitions //----------------------------------------------------------------------------- LLVFS* LLKeyframeMotion::sVFS = NULL; -LLKeyframeDataCache::LLKeyframeDataMap LLKeyframeDataCache::sKeyframeDataMap; +LLKeyframeDataCache::keyframe_data_map_t LLKeyframeDataCache::sKeyframeDataMap; //----------------------------------------------------------------------------- // Globals @@ -45,8 +45,20 @@ static F32 MIN_ACCELERATION_SQUARED = 0.0005f * 0.0005f; static F32 MAX_CONSTRAINTS = 10; //----------------------------------------------------------------------------- -// JointMotionList::dumpDiagInfo() +// JointMotionList //----------------------------------------------------------------------------- +LLKeyframeMotion::JointMotionList::JointMotionList() + : mNumJointMotions(0), + mJointMotionArray(NULL) +{ +} + +LLKeyframeMotion::JointMotionList::~JointMotionList() +{ + for_each(mConstraints.begin(), mConstraints.end(), DeletePointer()); + delete [] mJointMotionArray; +} + U32 LLKeyframeMotion::JointMotionList::dumpDiagInfo() { S32 total_size = sizeof(JointMotionList); @@ -415,7 +427,7 @@ LLKeyframeMotion::~LLKeyframeMotion() { delete [] mJointStates; } - mConstraints.deleteAllData(); + for_each(mConstraints.begin(), mConstraints.end(), DeletePointer()); } //----------------------------------------------------------------------------- @@ -550,8 +562,7 @@ LLMotion::LLMotionInitStatus LLKeyframeMotion::onInitialize(LLCharacter *charact BOOL LLKeyframeMotion::setupPose() { // add all valid joint states to the pose - U32 jm; - for (jm=0; jm<mJointMotionList->mNumJointMotions; jm++) + for (U32 jm=0; jm<mJointMotionList->mNumJointMotions; jm++) { if ( mJointStates[jm].getJoint() ) { @@ -560,16 +571,16 @@ BOOL LLKeyframeMotion::setupPose() } // initialize joint constraints - for (JointConstraintSharedData* shared_constraintp = mJointMotionList->mConstraints.getFirstData(); - shared_constraintp; - shared_constraintp = mJointMotionList->mConstraints.getNextData()) - { - JointConstraint* constraintp = new JointConstraint(shared_constraintp); - initializeConstraint(constraintp); - mConstraints.addData(constraintp); - } + for (JointMotionList::constraint_list_t::iterator iter = mJointMotionList->mConstraints.begin(); + iter != mJointMotionList->mConstraints.end(); ++iter) + { + JointConstraintSharedData* shared_constraintp = *iter; + JointConstraint* constraintp = new JointConstraint(shared_constraintp); + initializeConstraint(constraintp); + mConstraints.push_front(constraintp); + } - if (mJointMotionList->mConstraints.getLength()) + if (mJointMotionList->mConstraints.size()) { mPelvisp = mCharacter->getJoint("mPelvis"); if (!mPelvisp) @@ -692,21 +703,21 @@ void LLKeyframeMotion::applyConstraints(F32 time, U8* joint_mask) if (mCharacter->getSkeletonSerialNum() != mLastSkeletonSerialNum) { mLastSkeletonSerialNum = mCharacter->getSkeletonSerialNum(); - for (JointConstraint* constraintp = mConstraints.getFirstData(); - constraintp; - constraintp = mConstraints.getNextData()) - { - initializeConstraint(constraintp); - } + for (constraint_list_t::iterator iter = mConstraints.begin(); + iter != mConstraints.end(); ++iter) + { + JointConstraint* constraintp = *iter; + initializeConstraint(constraintp); + } } // apply constraints - for (JointConstraint* constraintp = mConstraints.getFirstData(); - constraintp; - constraintp = mConstraints.getNextData()) - { - applyConstraint(constraintp, time, joint_mask); - } + for (constraint_list_t::iterator iter = mConstraints.begin(); + iter != mConstraints.end(); ++iter) + { + JointConstraint* constraintp = *iter; + applyConstraint(constraintp, time, joint_mask); + } } //----------------------------------------------------------------------------- @@ -714,12 +725,12 @@ void LLKeyframeMotion::applyConstraints(F32 time, U8* joint_mask) //----------------------------------------------------------------------------- void LLKeyframeMotion::onDeactivate() { - for (JointConstraint* constraintp = mConstraints.getFirstData(); - constraintp; - constraintp = mConstraints.getNextData()) - { - deactivateConstraint(constraintp); - } + for (constraint_list_t::iterator iter = mConstraints.begin(); + iter != mConstraints.end(); ++iter) + { + JointConstraint* constraintp = *iter; + deactivateConstraint(constraintp); + } } //----------------------------------------------------------------------------- @@ -1586,7 +1597,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp) return FALSE; } - mJointMotionList->mConstraints.addData(constraintp); + mJointMotionList->mConstraints.push_front(constraintp); constraintp->mJointStateIndices = new S32[constraintp->mChainLength + 1]; @@ -1694,10 +1705,19 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const } } - success &= dp.packS32(mJointMotionList->mConstraints.getLength(), "num_constraints"); - for (JointConstraintSharedData* shared_constraintp = mJointMotionList->mConstraints.getFirstData(); - shared_constraintp; - shared_constraintp = mJointMotionList->mConstraints.getNextData()) + success &= dp.packS32(mJointMotionList->mConstraints.size(), "num_constraints"); + for (JointMotionList::constraint_list_t::iterator iter = mJointMotionList->mConstraints.begin(); + iter != mJointMotionList->mConstraints.end(); ++iter) + { + JointConstraintSharedData* shared_constraintp = *iter; + success &= dp.packU8(shared_constraintp->mChainLength, "chain_length"); + success &= dp.packU8(shared_constraintp->mConstraintType, "constraint_type"); + char volume_name[16]; /* Flawfinder: ignore */ + snprintf(volume_name, sizeof(volume_name), "%s", /* Flawfinder: ignore */ + mCharacter->findCollisionVolume(shared_constraintp->mSourceConstraintVolume)->getName().c_str()); + success &= dp.packBinaryDataFixed((U8*)volume_name, 16, "source_volume"); + success &= dp.packVector3(shared_constraintp->mSourceConstraintOffset, "source_offset"); + if (shared_constraintp->mConstraintTargetType == TYPE_GROUND) { success &= dp.packU8(shared_constraintp->mChainLength, "chain_length"); success &= dp.packU8(shared_constraintp->mConstraintType, "constraint_type"); @@ -1708,7 +1728,7 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const success &= dp.packVector3(shared_constraintp->mSourceConstraintOffset, "source_offset"); if (shared_constraintp->mConstraintTargetType == TYPE_GROUND) { - snprintf(volume_name,sizeof(volume_name), "%s", "GROUND"); /* Flawfinder: ignore */ + snprintf(volume_name,sizeof(volume_name), "%s", "GROUND"); /* Flawfinder: ignore */ } else { @@ -1723,6 +1743,19 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const success &= dp.packF32(shared_constraintp->mEaseOutStartTime, "ease_out_start"); success &= dp.packF32(shared_constraintp->mEaseOutStopTime, "ease_out_stop"); } + else + { + snprintf(volume_name, sizeof(volume_name),"%s", /* Flawfinder: ignore */ + mCharacter->findCollisionVolume(shared_constraintp->mTargetConstraintVolume)->getName().c_str()); + } + success &= dp.packBinaryDataFixed((U8*)volume_name, 16, "target_volume"); + success &= dp.packVector3(shared_constraintp->mTargetConstraintOffset, "target_offset"); + success &= dp.packVector3(shared_constraintp->mTargetConstraintDir, "target_dir"); + success &= dp.packF32(shared_constraintp->mEaseInStartTime, "ease_in_start"); + success &= dp.packF32(shared_constraintp->mEaseInStopTime, "ease_in_stop"); + success &= dp.packF32(shared_constraintp->mEaseOutStartTime, "ease_out_start"); + success &= dp.packF32(shared_constraintp->mEaseOutStopTime, "ease_out_stop"); + } return success; } @@ -1813,7 +1846,8 @@ void LLKeyframeMotion::setEaseOut(F32 ease_in) //----------------------------------------------------------------------------- void LLKeyframeMotion::flushKeyframeCache() { - LLKeyframeDataCache::clear(); + // TODO: Make this safe to do +// LLKeyframeDataCache::clear(); } //----------------------------------------------------------------------------- @@ -2022,8 +2056,8 @@ void LLKeyframeDataCache::dumpDiagInfo() llinfos << "-----------------------------------------------------" << llendl; // print each loaded mesh, and it's memory usage - LLKeyframeDataMap::iterator map_it; - for (map_it = sKeyframeDataMap.begin(); map_it != sKeyframeDataMap.end(); ++map_it) + for (keyframe_data_map_t::iterator map_it = sKeyframeDataMap.begin(); + map_it != sKeyframeDataMap.end(); ++map_it) { U32 joint_motion_kb; @@ -2057,12 +2091,12 @@ void LLKeyframeDataCache::addKeyframeData(const LLUUID& id, LLKeyframeMotion::Jo //-------------------------------------------------------------------- void LLKeyframeDataCache::removeKeyframeData(const LLUUID& id) { - LLKeyframeMotion::JointMotionList* joint_motion_listp = getKeyframeData(id); - if (joint_motion_listp) + keyframe_data_map_t::iterator found_data = sKeyframeDataMap.find(id); + if (found_data != sKeyframeDataMap.end()) { - delete joint_motion_listp; + delete found_data->second; + sKeyframeDataMap.erase(found_data); } - sKeyframeDataMap.erase(id); } //-------------------------------------------------------------------- @@ -2070,7 +2104,7 @@ void LLKeyframeDataCache::removeKeyframeData(const LLUUID& id) //-------------------------------------------------------------------- LLKeyframeMotion::JointMotionList* LLKeyframeDataCache::getKeyframeData(const LLUUID& id) { - LLKeyframeDataMap::iterator found_data = sKeyframeDataMap.find(id); + keyframe_data_map_t::iterator found_data = sKeyframeDataMap.find(id); if (found_data == sKeyframeDataMap.end()) { return NULL; diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h index daa501af89..9b8c04ac92 100644 --- a/indra/llcharacter/llkeyframemotion.h +++ b/indra/llcharacter/llkeyframemotion.h @@ -16,7 +16,6 @@ #include <string> #include "llassetstorage.h" -#include "llassoclist.h" #include "llbboxlocal.h" #include "llhandmotion.h" #include "lljointstate.h" @@ -386,11 +385,12 @@ public: LLJoint::JointPriority mBasePriority; LLHandMotion::eHandPose mHandPose; LLJoint::JointPriority mMaxPriority; - LLLinkedList<JointConstraintSharedData> mConstraints; + typedef std::list<JointConstraintSharedData*> constraint_list_t; + constraint_list_t mConstraints; LLBBoxLocal mPelvisBBox; public: - JointMotionList() : mNumJointMotions(0), mJointMotionArray(NULL) {}; - ~JointMotionList() { mConstraints.deleteAllData(); delete [] mJointMotionArray; } + JointMotionList(); + ~JointMotionList(); U32 dumpDiagInfo(); }; @@ -406,7 +406,8 @@ protected: LLJoint* mPelvisp; LLCharacter* mCharacter; std::string mEmoteName; - LLLinkedList<JointConstraint> mConstraints; + typedef std::list<JointConstraint*> constraint_list_t; + constraint_list_t mConstraints; U32 mLastSkeletonSerialNum; F32 mLastUpdateTime; F32 mLastLoopedTime; @@ -420,8 +421,8 @@ public: LLKeyframeDataCache(){}; ~LLKeyframeDataCache(); - typedef std::map<LLUUID, class LLKeyframeMotion::JointMotionList*> LLKeyframeDataMap; - static LLKeyframeDataMap sKeyframeDataMap; + typedef std::map<LLUUID, class LLKeyframeMotion::JointMotionList*> keyframe_data_map_t; + static keyframe_data_map_t sKeyframeDataMap; static void addKeyframeData(const LLUUID& id, LLKeyframeMotion::JointMotionList*); static LLKeyframeMotion::JointMotionList* getKeyframeData(const LLUUID& id); diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 2856803c4b..c0b072c357 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -161,9 +161,9 @@ LLMotionController::~LLMotionController() //----------------------------------------------------------------------------- void LLMotionController::deleteAllMotions() { - mLoadingMotions.removeAllNodes(); + mLoadingMotions.clear(); mLoadedMotions.clear(); - mActiveMotions.removeAllNodes(); + mActiveMotions.clear(); for_each(mAllMotions.begin(), mAllMotions.end(), DeletePairedPointer()); mAllMotions.clear(); @@ -215,16 +215,16 @@ void LLMotionController::setTimeStep(F32 step) if (step != 0.f) { // make sure timestamps conform to new quantum - for( LLMotion* motionp = mActiveMotions.getFirstData(); - motionp != NULL; - motionp = mActiveMotions.getNextData() ) - { - motionp->mActivationTimestamp = (F32)llfloor(motionp->mActivationTimestamp / step) * step; - BOOL stopped = motionp->isStopped(); - motionp->setStopTime((F32)llfloor(motionp->getStopTime() / step) * step); - motionp->setStopped(stopped); - motionp->mSendStopTimestamp = (F32)llfloor(motionp->mSendStopTimestamp / step) * step; - } + for (motion_list_t::iterator iter = mActiveMotions.begin(); + iter != mActiveMotions.end(); ++iter) + { + LLMotion* motionp = *iter; + motionp->mActivationTimestamp = (F32)llfloor(motionp->mActivationTimestamp / step) * step; + BOOL stopped = motionp->isStopped(); + motionp->setStopTime((F32)llfloor(motionp->getStopTime() / step) * step); + motionp->setStopped(stopped); + motionp->mSendStopTimestamp = (F32)llfloor(motionp->mSendStopTimestamp / step) * step; + } } } @@ -238,23 +238,6 @@ void LLMotionController::setTimeFactor(F32 time_factor) } //----------------------------------------------------------------------------- -// getFirstActiveMotion() -//----------------------------------------------------------------------------- -LLMotion* LLMotionController::getFirstActiveMotion() -{ - return mActiveMotions.getFirstData(); -} - -//----------------------------------------------------------------------------- -// getNextActiveMotion() -//----------------------------------------------------------------------------- -LLMotion* LLMotionController::getNextActiveMotion() -{ - return mActiveMotions.getNextData(); -} - - -//----------------------------------------------------------------------------- // setCharacter() //----------------------------------------------------------------------------- void LLMotionController::setCharacter(LLCharacter *character) @@ -281,17 +264,9 @@ void LLMotionController::removeMotion( const LLUUID& id) { stopMotionLocally(id, TRUE); - mLoadingMotions.deleteData(motionp); - std::deque<LLMotion*>::iterator motion_it; - for (motion_it = mLoadedMotions.begin(); motion_it != mLoadedMotions.end(); ++motion_it) - { - if(*motion_it == motionp) - { - mLoadedMotions.erase(motion_it); - break; - } - } - mActiveMotions.deleteData(motionp); + mLoadingMotions.erase(motionp); + mLoadedMotions.remove(motionp); + mActiveMotions.remove(motionp); mAllMotions.erase(id); delete motionp; } @@ -332,7 +307,7 @@ LLMotion* LLMotionController::createMotion( const LLUUID &id ) delete motion; return NULL; case LLMotion::STATUS_HOLD: - mLoadingMotions.addData(motion); + mLoadingMotions.insert(motion); break; case LLMotion::STATUS_SUCCESS: // add motion to our list @@ -451,10 +426,10 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty memset(&last_joint_signature, 0, sizeof(U8) * LL_CHARACTER_MAX_JOINTS); // iterate through active motions in chronological order - for(LLMotion* motionp = mActiveMotions.getFirstData(); - motionp != NULL; - motionp = mActiveMotions.getNextData()) + for (motion_list_t::iterator iter = mActiveMotions.begin(); + iter != mActiveMotions.end(); ++iter) { + LLMotion* motionp = *iter; if (motionp->getBlendType() != anim_type) { continue; @@ -468,9 +443,8 @@ void LLMotionController::updateMotionsByType(LLMotion::LLMotionBlendType anim_ty } else { - S32 i; // NUM_JOINT_SIGNATURE_STRIDES should be multiple of 4 - for (i = 0; i < NUM_JOINT_SIGNATURE_STRIDES; i++) + for (S32 i = 0; i < NUM_JOINT_SIGNATURE_STRIDES; i++) { U32 *current_signature = (U32*)&(mJointSignature[0][i * 4]); U32 test_signature = *(U32*)&(motionp->mJointSignature[0][i * 4]); @@ -726,16 +700,15 @@ void LLMotionController::updateMotion() } // query pending motions for completion - LLMotion* motionp; - - for ( motionp = mLoadingMotions.getFirstData(); - motionp != NULL; - motionp = mLoadingMotions.getNextData() ) + for (motion_set_t::iterator iter = mLoadingMotions.begin(); + iter != mLoadingMotions.end(); ) { + motion_set_t::iterator curiter = iter++; + LLMotion* motionp = *curiter; LLMotion::LLMotionInitStatus status = motionp->onInitialize(mCharacter); if (status == LLMotion::STATUS_SUCCESS) { - mLoadingMotions.removeCurrentData(); + mLoadingMotions.erase(curiter); // add motion to our loaded motion list addLoadedMotion(motionp); // this motion should be playing @@ -748,7 +721,7 @@ void LLMotionController::updateMotion() { llinfos << "Motion " << motionp->getID() << " init failed." << llendl; sRegistry.markBad(motionp->getID()); - mLoadingMotions.removeCurrentData(); + mLoadingMotions.erase(curiter); mAllMotions.erase(motionp->getID()); delete motionp; } @@ -785,7 +758,7 @@ void LLMotionController::updateMotion() //----------------------------------------------------------------------------- BOOL LLMotionController::activateMotion(LLMotion *motion, F32 time) { - if (mLoadingMotions.checkData(motion)) + if (mLoadingMotions.find(motion) != mLoadingMotions.end()) { // we want to start this motion, but we can't yet, so flag it as started motion->setStopped(FALSE); @@ -816,7 +789,7 @@ BOOL LLMotionController::activateMotion(LLMotion *motion, F32 time) motion->mSendStopTimestamp = F32_MAX; } - mActiveMotions.addData(motion); + mActiveMotions.push_front(motion); motion->activate(); motion->onUpdate(0.f, mJointSignature[1]); @@ -830,7 +803,7 @@ BOOL LLMotionController::activateMotion(LLMotion *motion, F32 time) BOOL LLMotionController::deactivateMotion(LLMotion *motion) { motion->deactivate(); - mActiveMotions.removeData(motion); + mActiveMotions.remove(motion); return TRUE; } @@ -838,22 +811,17 @@ BOOL LLMotionController::deactivateMotion(LLMotion *motion) //----------------------------------------------------------------------------- // isMotionActive() //----------------------------------------------------------------------------- -BOOL LLMotionController::isMotionActive(LLMotion *motion) +bool LLMotionController::isMotionActive(LLMotion *motion) { - if (motion && motion->isActive()) - { - return TRUE; - } - - return FALSE; + return (motion && motion->isActive()); } //----------------------------------------------------------------------------- // isMotionLoading() //----------------------------------------------------------------------------- -BOOL LLMotionController::isMotionLoading(LLMotion* motion) +bool LLMotionController::isMotionLoading(LLMotion* motion) { - return mLoadingMotions.checkData(motion); + return (mLoadingMotions.find(motion) != mLoadingMotions.end()); } @@ -871,15 +839,14 @@ LLMotion *LLMotionController::findMotion(const LLUUID& id) //----------------------------------------------------------------------------- void LLMotionController::flushAllMotions() { - LLDynamicArray<LLUUID> active_motions; - LLDynamicArray<F32> active_motion_times; - - for (LLMotion* motionp = mActiveMotions.getFirstData(); - motionp; - motionp = mActiveMotions.getNextData()) + std::vector<std::pair<LLUUID,F32> > active_motions; + active_motions.reserve(mActiveMotions.size()); + for (motion_list_t::iterator iter = mActiveMotions.begin(); + iter != mActiveMotions.end(); ++iter) { - active_motions.put(motionp->getID()); - active_motion_times.put(mTime - motionp->mActivationTimestamp); + LLMotion* motionp = *iter; + F32 dtime = mTime - motionp->mActivationTimestamp; + active_motions.push_back(std::make_pair(motionp->getID(),dtime)); motionp->deactivate(); } @@ -891,9 +858,10 @@ void LLMotionController::flushAllMotions() mCharacter->removeAnimationData("Hand Pose"); // restart motions - for (S32 i = 0; i < active_motions.count(); i++) + for (std::vector<std::pair<LLUUID,F32> >::iterator iter = active_motions.begin(); + iter != active_motions.end(); ++iter) { - startMotion(active_motions[i], active_motion_times[i]); + startMotion(iter->first, iter->second); } } diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h index d43d6d9a8f..a19e704643 100644 --- a/indra/llcharacter/llmotioncontroller.h +++ b/indra/llcharacter/llmotioncontroller.h @@ -16,7 +16,6 @@ #include <map> #include <deque> -#include "linked_lists.h" #include "lluuidhashmap.h" #include "llmotion.h" #include "llpose.h" @@ -90,6 +89,10 @@ protected: class LLMotionController { public: + typedef std::list<LLMotion*> motion_list_t; + typedef std::set<LLMotion*> motion_set_t; + +public: // Constructor LLMotionController(); @@ -145,12 +148,11 @@ public: void setTimeFactor(F32 time_factor); F32 getTimeFactor() { return mTimeFactor; } - LLMotion* getFirstActiveMotion(); - LLMotion* getNextActiveMotion(); + motion_list_t& getActiveMotions() { return mActiveMotions; } //protected: - BOOL isMotionActive( LLMotion *motion ); - BOOL isMotionLoading( LLMotion *motion ); + bool isMotionActive( LLMotion *motion ); + bool isMotionLoading( LLMotion *motion ); LLMotion *findMotion( const LLUUID& id ); protected: @@ -180,9 +182,9 @@ protected: std::map<LLUUID, LLMotion*> mAllMotions; - LLLinkedList<LLMotion> mLoadingMotions; - std::deque<LLMotion*> mLoadedMotions; - LLLinkedList<LLMotion> mActiveMotions; + motion_set_t mLoadingMotions; + motion_list_t mLoadedMotions; + motion_list_t mActiveMotions; LLFrameTimer mTimer; F32 mTime; diff --git a/indra/llcharacter/llpose.cpp b/indra/llcharacter/llpose.cpp index ff56dba585..e1b24d62cb 100644 --- a/indra/llcharacter/llpose.cpp +++ b/indra/llcharacter/llpose.cpp @@ -15,6 +15,7 @@ #include "llmotion.h" #include "llmath.h" +#include "llstl.h" //----------------------------------------------------------------------------- // Static @@ -438,7 +439,7 @@ LLPoseBlender::LLPoseBlender() LLPoseBlender::~LLPoseBlender() { - mJointStateBlenderPool.deleteAllData(); + for_each(mJointStateBlenderPool.begin(), mJointStateBlenderPool.end(), DeletePairedPointer()); } //----------------------------------------------------------------------------- @@ -452,15 +453,16 @@ BOOL LLPoseBlender::addMotion(LLMotion* motion) { LLJoint *jointp = jsp->getJoint(); LLJointStateBlender* joint_blender; - if (!mJointStateBlenderPool.checkData(jointp)) + if (mJointStateBlenderPool.find(jointp) == mJointStateBlenderPool.end()) { // this is the first time we are animating this joint // so create new jointblender and add it to our pool joint_blender = new LLJointStateBlender(); - mJointStateBlenderPool.addData(jointp, joint_blender); - } else + mJointStateBlenderPool[jointp] = joint_blender; + } + else { - joint_blender = mJointStateBlenderPool.getData(jointp); + joint_blender = mJointStateBlenderPool[jointp]; } if (jsp->getPriority() == LLJoint::USE_MOTION_PRIORITY) @@ -473,9 +475,9 @@ BOOL LLPoseBlender::addMotion(LLMotion* motion) } // add it to our list of active blenders - if(!mActiveBlenders.checkData(joint_blender)) + if (std::find(mActiveBlenders.begin(), mActiveBlenders.end(), joint_blender) == mActiveBlenders.end()) { - mActiveBlenders.addData(joint_blender); + mActiveBlenders.push_front(joint_blender); } } return TRUE; @@ -486,15 +488,15 @@ BOOL LLPoseBlender::addMotion(LLMotion* motion) //----------------------------------------------------------------------------- void LLPoseBlender::blendAndApply() { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; jsbp->blendJointStates(); } // we're done now so there are no more active blenders for this frame - mActiveBlenders.removeAllNodes(); + mActiveBlenders.clear(); } //----------------------------------------------------------------------------- @@ -502,10 +504,10 @@ void LLPoseBlender::blendAndApply() //----------------------------------------------------------------------------- void LLPoseBlender::blendAndCache(BOOL reset_cached_joints) { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; if (reset_cached_joints) { jsbp->resetCachedJoint(); @@ -519,10 +521,10 @@ void LLPoseBlender::blendAndCache(BOOL reset_cached_joints) //----------------------------------------------------------------------------- void LLPoseBlender::interpolate(F32 u) { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; jsbp->interpolate(u); } } @@ -532,13 +534,13 @@ void LLPoseBlender::interpolate(F32 u) //----------------------------------------------------------------------------- void LLPoseBlender::clearBlenders() { - for (LLJointStateBlender* jsbp = mActiveBlenders.getFirstData(); - jsbp; - jsbp = mActiveBlenders.getNextData()) + for (blender_list_t::iterator iter = mActiveBlenders.begin(); + iter != mActiveBlenders.end(); ++iter) { + LLJointStateBlender* jsbp = *iter; jsbp->clear(); } - mActiveBlenders.removeAllNodes(); + mActiveBlenders.clear(); } diff --git a/indra/llcharacter/llpose.h b/indra/llcharacter/llpose.h index e286c14e21..5d17bd8458 100644 --- a/indra/llcharacter/llpose.h +++ b/indra/llcharacter/llpose.h @@ -87,8 +87,10 @@ class LLMotion; class LLPoseBlender { protected: - LLMap<LLJoint*,LLJointStateBlender*> mJointStateBlenderPool; - LLLinkedList<LLJointStateBlender> mActiveBlenders; + typedef std::list<LLJointStateBlender*> blender_list_t; + typedef std::map<LLJoint*,LLJointStateBlender*> blender_map_t; + blender_map_t mJointStateBlenderPool; + blender_list_t mActiveBlenders; S32 mNextPoseSlot; LLPose mBlendedPose; diff --git a/indra/llcommon/llframetimer.cpp b/indra/llcommon/llframetimer.cpp index c66410651f..fca2bd2e85 100644 --- a/indra/llcommon/llframetimer.cpp +++ b/indra/llcommon/llframetimer.cpp @@ -33,6 +33,50 @@ void LLFrameTimer::updateFrameTime() sFrameCount++; } +void LLFrameTimer::start() +{ + reset(); + mStarted = TRUE; +} + +void LLFrameTimer::stop() +{ + mStarted = FALSE; +} + +void LLFrameTimer::reset() +{ + mStartTime = sFrameTime; + mExpiry = sFrameTime; +} + +// Don't combine pause/unpause with start/stop +// Useage: +// LLFrameTime foo; // starts automatically +// foo.unpause(); // noop but safe +// foo.pause(); // pauses timer +// foo.unpause() // unpauses +// F32 elapsed = foo.getElapsedTimeF32() // does not include time between pause() and unpause() +// Note: elapsed would also be valid with no unpause() call (= time run until pause() called) +void LLFrameTimer::pause() +{ + if (mStarted) + mStartTime = sFrameTime - mStartTime; // save dtime + mStarted = FALSE; +} + +void LLFrameTimer::unpause() +{ + if (!mStarted) + mStartTime = sFrameTime - mStartTime; // restore dtime + mStarted = TRUE; +} + +void LLFrameTimer::setTimerExpirySec(F32 expiration) +{ + mExpiry = expiration + mStartTime; +} + void LLFrameTimer::setExpiryAt(F64 seconds_since_epoch) { mStartTime = sFrameTime; diff --git a/indra/llcommon/llframetimer.h b/indra/llcommon/llframetimer.h index 05b01e6a72..c7c1c50c7b 100644 --- a/indra/llcommon/llframetimer.h +++ b/indra/llcommon/llframetimer.h @@ -44,8 +44,7 @@ public: return sTotalSeconds; } - // Call this method once per frame to update the current frame - // time. + // Call this method once per frame to update the current frame time. static void updateFrameTime(); static S32 getFrameCount() { return sFrameCount; } @@ -53,10 +52,12 @@ public: static F32 getFrameDeltaTimeF32(); // MANIPULATORS - void start() { reset(); mStarted = TRUE; } - void stop() { mStarted = FALSE; } - void reset() { mStartTime = sFrameTime; mExpiry = sFrameTime; } - void setTimerExpirySec(F32 expiration) { mExpiry = expiration + mStartTime; } + void start(); + void stop(); + void reset(); + void pause(); + void unpause(); + void setTimerExpirySec(F32 expiration); void setExpiryAt(F64 seconds_since_epoch); BOOL checkExpirationAndReset(F32 expiration); F32 getElapsedTimeAndResetF32() { F32 t = F32(sFrameTime - mStartTime); reset(); return t; } @@ -66,7 +67,7 @@ public: // ACCESSORS BOOL hasExpired() const { return (sFrameTime >= mExpiry); } F32 getTimeToExpireF32() const { return (F32)(mExpiry - sFrameTime); } - F32 getElapsedTimeF32() const { return (F32)(sFrameTime - mStartTime); } + F32 getElapsedTimeF32() const { return mStarted ? (F32)(sFrameTime - mStartTime) : (F32)mStartTime; } BOOL getStarted() const { return mStarted; } // return the seconds since epoch when this timer will expire. diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 1063de5a8c..addda19775 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -11,11 +11,6 @@ #include "llmemory.h" #include "llmemtype.h" -// not defining nullfunc will currently crash when trying to use a LLHandle -template< typename _Ty > - const typename LLHandle< _Ty >::NullFunc - LLHandle< _Ty >::sNullFunc = LLHandle< _Ty >::defaultNullFunc; - //---------------------------------------------------------------------------- //static diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index f7f4818740..2a58db659e 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -220,29 +220,28 @@ class LLHandle { public: LLHandle() : - mPointer(sNullFunc()) + mPointer(NULL) { - ref(); } LLHandle(Type* ptr) : - mPointer(nonNull(ptr)) + mPointer(NULL) { - ref(); + assign(ptr); } LLHandle(const LLHandle<Type>& ptr) : - mPointer(ptr.mPointer) + mPointer(NULL) { - ref(); + assign(ptr.mPointer); } // support conversion up the type hierarchy. See Item 45 in Effective C++, 3rd Ed. template<typename Subclass> LLHandle(const LLHandle<Subclass>& ptr) : - mPointer(ptr.get()) + mPointer(NULL) { - ref(); + assign(ptr.get()); } ~LLHandle() @@ -250,47 +249,39 @@ public: unref(); } + const Type* operator->() const { return nonNull(mPointer); } + Type* operator->() { return nonNull(mPointer); } + Type* get() const { return mPointer; } - const Type* operator->() const { return mPointer; } - Type* operator->() { return mPointer; } - const Type& operator*() const { return *mPointer; } - Type& operator*() { return *mPointer; } + // we disallow these operations as they expose our null objects to direct manipulation + // and bypass the reference counting semantics + //const Type& operator*() const { return *nonNull(mPointer); } + //Type& operator*() { return *nonNull(mPointer); } - operator BOOL() const { return (mPointer != sNullFunc()); } - operator bool() const { return (mPointer != sNullFunc()); } - bool operator!() const { return (mPointer == sNullFunc()); } - bool isNull() const { return (mPointer == sNullFunc()); } - bool notNull() const { return (mPointer != sNullFunc()); } + operator BOOL() const { return mPointer != NULL; } + operator bool() const { return mPointer != NULL; } + bool operator!() const { return mPointer == NULL; } + bool isNull() const { return mPointer == NULL; } + bool notNull() const { return mPointer != NULL; } operator Type*() const { return mPointer; } operator const Type*() const { return mPointer; } - bool operator !=(Type* ptr) const { return (mPointer != nonNull(ptr)); } - bool operator ==(Type* ptr) const { return (mPointer == nonNull(ptr)); } + bool operator !=(Type* ptr) const { return (mPointer != ptr); } + bool operator ==(Type* ptr) const { return (mPointer == ptr); } bool operator ==(const LLHandle<Type>& ptr) const { return (mPointer == ptr.mPointer); } bool operator < (const LLHandle<Type>& ptr) const { return (mPointer < ptr.mPointer); } bool operator > (const LLHandle<Type>& ptr) const { return (mPointer > ptr.mPointer); } LLHandle<Type>& operator =(Type* ptr) { - if( mPointer != ptr ) - { - unref(); - mPointer = nonNull(ptr); - ref(); - } - + assign(ptr); return *this; } LLHandle<Type>& operator =(const LLHandle<Type>& ptr) { - if( mPointer != ptr.mPointer ) - { - unref(); - mPointer = ptr.mPointer; - ref(); - } + assign(ptr.mPointer); return *this; } @@ -298,12 +289,7 @@ public: template<typename Subclass> LLHandle<Type>& operator =(const LLHandle<Subclass>& ptr) { - if( mPointer != ptr.get() ) - { - unref(); - mPointer = ptr.get(); - ref(); - } + assign(ptr.get()); return *this; } @@ -325,9 +311,9 @@ protected: if (mPointer) { Type *tempp = mPointer; - mPointer = sNullFunc(); + mPointer = NULL; tempp->unref(); - if (mPointer != sNullFunc()) + if (mPointer != NULL) { llwarns << "Unreference did assignment to non-NULL because of destructor" << llendl; unref(); @@ -335,19 +321,22 @@ protected: } } - static Type* nonNull(Type* ptr) + void assign(Type* ptr) { - return ptr == NULL ? sNullFunc() : ptr; + if( mPointer != ptr ) + { + unref(); + mPointer = ptr; + ref(); + } } - static Type* defaultNullFunc() + static Type* nonNull(Type* ptr) { - llerrs << "No null value provided for LLHandle" << llendl; - return NULL; + return ptr == NULL ? sNullFunc() : ptr; } protected: - Type* mPointer; }; diff --git a/indra/llimage/llimagejpeg.h b/indra/llimage/llimagejpeg.h index 5684e3720f..b068090882 100644 --- a/indra/llimage/llimagejpeg.h +++ b/indra/llimage/llimagejpeg.h @@ -14,7 +14,6 @@ #include "llimage.h" extern "C" { -#include "jpeglib/jinclude.h" #include "jpeglib/jpeglib.h" #include "jpeglib/jerror.h" } diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 52549e5d11..1587b6a21c 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -30,22 +30,23 @@ void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl) /** sample error callback expecting a FILE* client object */ -void error_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); +void error_callback(const char* msg, void*) +{ + llwarns << "LLImageJ2CImpl: " << msg << llendl; } /** sample warning callback expecting a FILE* client object */ -void warning_callback(const char *msg, void *client_data) { - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); +void warning_callback(const char* msg, void*) +{ + llinfos << "LLImageJ2CImpl: " << msg << llendl; } /** sample debug callback expecting no client object */ -void info_callback(const char *msg, void *client_data) { - fprintf(stdout, "[INFO] %s", msg); +void info_callback(const char* msg, void*) +{ + lldebugs << "LLImageJ2CImpl: " << msg << llendl; } diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 9a49f32b7d..b85a0b65e6 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -677,7 +677,7 @@ S32 LLFontGL::render(const LLWString &wstr, if (use_ellipses && halign == LEFT) { // check for too long of a string - if (getWidthF32(wstr.c_str(), 0, max_chars) > scaled_max_pixels) + if (getWidthF32(wstr.c_str(), 0, max_chars) * sScaleX > scaled_max_pixels) { // use four dots for ellipsis width to generate padding const LLWString dots(utf8str_to_wstring(LLString("...."))); diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index ffa9262e21..8e81fec33b 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -46,7 +46,9 @@ LLButton::LLButton( const LLString& name, const LLRect& rect, const LLString& co mMouseUpCallback( NULL ), mHeldDownCallback( NULL ), mGLFont( NULL ), + mMouseDownFrame( 0 ), mHeldDownDelay( 0.5f ), // seconds until held-down callback is called + mHeldDownFrameDelay( 0 ), mImageUnselected( NULL ), mImageSelected( NULL ), mImageHoverSelected( NULL ), @@ -99,7 +101,9 @@ LLButton::LLButton(const LLString& name, const LLRect& rect, mMouseUpCallback( NULL ), mHeldDownCallback( NULL ), mGLFont( NULL ), + mMouseDownFrame( 0 ), mHeldDownDelay( 0.5f ), // seconds until held-down callback is called + mHeldDownFrameDelay( 0 ), mImageUnselected( NULL ), mImageSelected( NULL ), mImageHoverSelected( NULL ), @@ -196,9 +200,9 @@ void LLButton::init(void (*click_callback)(void*), void *callback_data, const LL LLButton::~LLButton() { - if( this == gFocusMgr.getMouseCapture() ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); } } @@ -284,7 +288,7 @@ BOOL LLButton::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent ) BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) - gFocusMgr.setMouseCapture( this, &LLButton::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); if (hasTabStop() && !getIsChrome()) { @@ -297,6 +301,7 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) } mMouseDownTimer.start(); + mMouseDownFrame = LLFrameTimer::getFrameCount(); if (mSoundFlags & MOUSE_DOWN) { @@ -310,19 +315,17 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) { // We only handle the click if the click both started and ended within us - if( this == gFocusMgr.getMouseCapture() ) + if( hasMouseCapture() ) { + // Always release the mouse + gFocusMgr.setMouseCapture( NULL ); + // Regardless of where mouseup occurs, handle callback if (mMouseUpCallback) { (*mMouseUpCallback)(mCallbackUserData); } - mMouseDownTimer.stop(); - - // Always release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); - // DO THIS AT THE VERY END to allow the button to be destroyed as a result of being clicked. // If mouseup in the widget, it's been clicked if (pointInView(x, y)) @@ -337,6 +340,9 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) (*mClickedCallback)( mCallbackUserData ); } } + + mMouseDownTimer.stop(); + mMouseDownTimer.reset(); } return TRUE; @@ -356,14 +362,14 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask) if (mMouseDownTimer.getStarted() && NULL != mHeldDownCallback) { F32 elapsed = mMouseDownTimer.getElapsedTimeF32(); - if( mHeldDownDelay < elapsed ) + if( mHeldDownDelay <= elapsed && mHeldDownFrameDelay <= LLFrameTimer::getFrameCount() - mMouseDownFrame) { mHeldDownCallback( mCallbackUserData ); } } // We only handle the click if the click both started and ended within us - if( this == gFocusMgr.getMouseCapture() ) + if( hasMouseCapture() ) { handled = TRUE; } @@ -412,7 +418,7 @@ void LLButton::draw() cursor_pos_gl.mY = llround((F32)cursor_pos_gl.mY / LLUI::sGLScaleFactor.mV[VY]); screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &local_mouse_x, &local_mouse_y); - BOOL pressed = pressed_by_keyboard || (this == gFocusMgr.getMouseCapture() && pointInView(local_mouse_x, local_mouse_y)); + BOOL pressed = pressed_by_keyboard || (hasMouseCapture() && pointInView(local_mouse_x, local_mouse_y)); BOOL display_state = FALSE; if( pressed ) @@ -800,11 +806,10 @@ void LLButton::setHoverImages( const LLString& image_name, const LLString& selec setImageHoverSelected(selected_name); } -// static -void LLButton::onMouseCaptureLost( LLMouseHandler* old_captor ) +void LLButton::onMouseCaptureLost() { - LLButton* self = (LLButton*) old_captor; - self->mMouseDownTimer.stop(); + mMouseDownTimer.stop(); + mMouseDownTimer.reset(); } //------------------------------------------------------------------------- diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 1982c2e36f..3dea4434a9 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -75,6 +75,8 @@ public: virtual BOOL handleHover(S32 x, S32 y, MASK mask); virtual void draw(); + virtual void onMouseCaptureLost(); + // HACK: "committing" a button is the same as clicking on it. virtual void onCommit(); @@ -85,7 +87,7 @@ public: void setMouseDownCallback( void (*cb)(void *data) ) { mMouseDownCallback = cb; } // mouse down within button void setMouseUpCallback( void (*cb)(void *data) ) { mMouseUpCallback = cb; } // mouse up, EVEN IF NOT IN BUTTON void setHeldDownCallback( void (*cb)(void *data) ) { mHeldDownCallback = cb; } // Mouse button held down and in button - void setHeldDownDelay( F32 seconds) { mHeldDownDelay = seconds; } + void setHeldDownDelay( F32 seconds, S32 frames = 0) { mHeldDownDelay = seconds; mHeldDownFrameDelay = frames; } F32 getHeldDownTime() const { return mMouseDownTimer.getElapsedTimeF32(); } @@ -140,7 +142,6 @@ public: void setBorderEnabled(BOOL b) { mBorderEnabled = b; } static void onHeldDown(void *userdata); // to be called by gIdleCallbacks - static void onMouseCaptureLost(LLMouseHandler* old_captor); void setFixedBorder(S32 width, S32 height) { mFixedWidth = width; mFixedHeight = height; } void setHoverGlowStrength(F32 strength) { mHoverGlowStrength = strength; } @@ -175,7 +176,9 @@ protected: const LLFontGL *mGLFont; LLFrameTimer mMouseDownTimer; + S32 mMouseDownFrame; F32 mHeldDownDelay; // seconds, after which held-down callbacks get called + S32 mHeldDownFrameDelay; // frames, after which held-down callbacks get called LLPointer<LLImageGL> mImageUnselected; LLUIString mUnselectedLabel; diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 667985c699..e439cd0acc 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -40,7 +40,7 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString ) : LLUICtrl(name, rect, TRUE, commit_callback, callback_userdata, FOLLOWS_LEFT | FOLLOWS_TOP), - mDrawButton(TRUE), + mDrawArrow(TRUE), mTextEntry(NULL), mArrowImage(NULL), mArrowImageWidth(8), @@ -48,8 +48,8 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString mMaxChars(20), mTextEntryTentative(TRUE), mPrearrangeCallback( NULL ), - mTextEntryCallback( NULL ), - mListWidth(list_width) + mListPosition(BELOW), + mTextEntryCallback( NULL ) { // For now, all comboboxes don't take keyboard focus when clicked. // This might change if it is part of a modal dialog. @@ -57,7 +57,7 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString // Revert to standard behavior. When this control's parent is hidden, it needs to // hide this ctrl--which won't just happen automatically since when LLComboBox is - // showing its list, it's also set to TopView. When keyboard focus is cleared all + // showing its list, it's also set to TopCtrl. When keyboard focus is cleared all // controls (including this one) know that they are no longer editing. mKeyboardFocusOnClick = TRUE; @@ -68,7 +68,8 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString // Text label button mButton = new LLSquareButton("comboxbox button", r, label, NULL, LLString::null, - &LLComboBox::onButtonClick, this); + NULL, this); + mButton->setMouseDownCallback(onButtonDown); mButton->setFont(LLFontGL::sSansSerifSmall); mButton->setFollows(FOLLOWS_LEFT | FOLLOWS_BOTTOM | FOLLOWS_RIGHT); mButton->setHAlign( LLFontGL::LEFT ); @@ -91,6 +92,7 @@ LLComboBox::LLComboBox( const LLString& name, const LLRect &rect, const LLString mList->setVisible(FALSE); mList->setBgWriteableColor( LLColor4(1,1,1,1) ); mList->setCommitOnKeyboardMovement(FALSE); + mList->setFocusChangedCallback(onListFocusChanged); addChild(mList); LLRect border_rect(0, mRect.getHeight(), mRect.getWidth(), 0); @@ -204,111 +206,6 @@ void LLComboBox::setEnabled(BOOL enabled) mButton->setEnabled(enabled); } -// *HACK: these are all hacks to support the fact that the combobox -// has mouse capture so we can hide the list when we don't handle the -// mouse up event -BOOL LLComboBox::handleHover(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleHover(local_x, local_y, mask); - } - } - return LLUICtrl::handleHover(x, y, mask); -} - -BOOL LLComboBox::handleMouseDown(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleMouseDown(local_x, local_y, mask); - } - } - BOOL has_focus_now = hasFocus(); - BOOL handled = LLUICtrl::handleMouseDown(x, y, mask); - if (handled && !has_focus_now) - { - onFocusReceived(); - } - - return handled; -} - -BOOL LLComboBox::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleRightMouseDown(local_x, local_y, mask); - } - } - return LLUICtrl::handleRightMouseDown(x, y, mask); -} - -BOOL LLComboBox::handleRightMouseUp(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleRightMouseUp(local_x, local_y, mask); - } - } - return LLUICtrl::handleRightMouseUp(x, y, mask); -} - -BOOL LLComboBox::handleDoubleClick(S32 x, S32 y, MASK mask) -{ - if (mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - return mList->handleDoubleClick(local_x, local_y, mask); - } - } - return LLUICtrl::handleDoubleClick(x, y, mask); -} - -BOOL LLComboBox::handleMouseUp(S32 x, S32 y, MASK mask) -{ - BOOL handled = childrenHandleMouseUp(x, y, mask) != NULL; - - if (!handled && mList->getVisible()) - { - S32 local_x, local_y; - LLView::localPointToOtherView(x, y, &local_x, &local_y, mList); - if (mList->pointInView(local_x, local_y)) - { - handled = mList->handleMouseUp(local_x, local_y, mask); - } - } - - if( !handled && gFocusMgr.getMouseCapture() == this ) - { - // Mouse events that we didn't handle cause the list to be hidden. - // Eat mouse event, regardless of where on the screen it happens. - hideList(); - handled = TRUE; - } - - return handled; -} - void LLComboBox::clear() { if (mTextEntry) @@ -493,12 +390,13 @@ void LLComboBox::onFocusLost() { mTextEntry->selectAll(); } + LLUICtrl::onFocusLost(); } void LLComboBox::setButtonVisible(BOOL visible) { mButton->setVisible(visible); - mDrawButton = visible; + mDrawArrow = visible; if (mTextEntry) { LLRect text_entry_rect(0, mRect.getHeight(), mRect.getWidth(), 0); @@ -522,15 +420,17 @@ void LLComboBox::draw() // Draw children LLUICtrl::draw(); - if (mDrawButton) + if (mDrawArrow) { // Paste the graphic on the right edge if (!mArrowImage.isNull()) { - S32 left = mRect.getWidth() - mArrowImageWidth - LLUI::sConfigGroup->getS32("DropShadowButton"); + S32 arrow_height = llmin(mRect.getHeight(), mArrowImage->getHeight()); + S32 arrow_width = llround((F32)mArrowImage->getWidth() * ((F32)arrow_height / (F32)mArrowImage->getHeight())); + + S32 left = mRect.getWidth() - mArrowImage->getWidth() - LLUI::sConfigGroup->getS32("DropShadowButton"); - gl_draw_image( left, 0, mArrowImage, - LLColor4::white); + gl_draw_scaled_image( left, 0, arrow_width, arrow_height, mArrowImage, LLColor4::white); } } } @@ -576,18 +476,60 @@ void LLComboBox::showList() //HACK: shouldn't have to know about scale here mList->arrange( 192, llfloor((F32)window_size.mY / LLUI::sGLScaleFactor.mV[VY]) - 50 ); - // Move rect so it hangs off the bottom of this view + // Make sure that we can see the whole list + LLRect floater_area_local; + gFloaterView->localRectToOtherView(gFloaterView->getLocalSnapRect(), &floater_area_local, this); + LLRect rect = mList->getRect(); - rect.setLeftTopAndSize(0, 0, rect.getWidth(), rect.getHeight() ); - mList->setRect(rect); + if (mListPosition == BELOW) + { + if (rect.getHeight() <= -floater_area_local.mBottom) + { + // Move rect so it hangs off the bottom of this view + rect.setLeftTopAndSize(0, 0, rect.getWidth(), rect.getHeight() ); + } + else + { + // stack on top or bottom, depending on which has more room + if (-floater_area_local.mBottom > floater_area_local.mTop - mRect.getHeight()) + { + // Move rect so it hangs off the bottom of this view + rect.setLeftTopAndSize(0, 0, rect.getWidth(), llmin(-floater_area_local.mBottom, rect.getHeight())); + } + else + { + // move rect so it stacks on top of this view (clipped to size of screen) + rect.setOriginAndSize(0, mRect.getHeight(), rect.getWidth(), llmin(floater_area_local.mTop - mRect.getHeight(), rect.getHeight())); + } + } + } + else // ABOVE + { + if (rect.getHeight() <= floater_area_local.mTop - mRect.getHeight()) + { + // move rect so it stacks on top of this view (clipped to size of screen) + rect.setOriginAndSize(0, mRect.getHeight(), rect.getWidth(), llmin(floater_area_local.mTop - mRect.getHeight(), rect.getHeight())); + } + else + { + // stack on top or bottom, depending on which has more room + if (-floater_area_local.mBottom > floater_area_local.mTop - mRect.getHeight()) + { + // Move rect so it hangs off the bottom of this view + rect.setLeftTopAndSize(0, 0, rect.getWidth(), llmin(-floater_area_local.mBottom, rect.getHeight())); + } + else + { + // move rect so it stacks on top of this view (clipped to size of screen) + rect.setOriginAndSize(0, mRect.getHeight(), rect.getWidth(), llmin(floater_area_local.mTop - mRect.getHeight(), rect.getHeight())); + } + } - // Make sure that we can see the whole list - LLRect floater_area_screen; - LLRect floater_area_local; - gFloaterView->getParent()->localRectToScreen( gFloaterView->getRect(), &floater_area_screen ); - screenRectToLocal( floater_area_screen, &floater_area_local ); - mList->translateIntoRect( floater_area_local, FALSE ); + } + mList->setOrigin(rect.mLeft, rect.mBottom); + mList->reshape(rect.getWidth(), rect.getHeight()); + mList->translateIntoRect(floater_area_local, FALSE); // Make sure we didn't go off bottom of screen S32 x, y; @@ -598,7 +540,12 @@ void LLComboBox::showList() mList->translate(0, -y); } - gFocusMgr.setMouseCapture( this, LLComboBox::onMouseCaptureLost ); + // pass mouse capture on to list if button is depressed + if (mButton->hasMouseCapture()) + { + gFocusMgr.setMouseCapture(mList); + } + // NB: this call will trigger the focuslost callback which will hide the list, so do it first // before finally showing the list @@ -608,14 +555,13 @@ void LLComboBox::showList() // so that the callback is not immediately triggered on setFocus() mList->selectFirstItem(); } - gFocusMgr.setKeyboardFocus(mList, onListFocusLost); + mList->setFocus(TRUE); // Show the list and push the button down mButton->setToggleState(TRUE); mList->setVisible(TRUE); - gFocusMgr.setTopView(mList, LLComboBox::onTopViewLost ); - + gFocusMgr.setTopCtrl(mList); } void LLComboBox::hideList() @@ -624,37 +570,21 @@ void LLComboBox::hideList() mList->setVisible(FALSE); mList->highlightNthItem(-1); - if( gFocusMgr.getTopView() == mList ) + if( gFocusMgr.getTopCtrl() == mList ) { - gFocusMgr.setTopView(NULL, NULL); + gFocusMgr.setTopCtrl(NULL); } - if( gFocusMgr.getMouseCapture() == this ) - { - gFocusMgr.setMouseCapture( NULL, NULL ); - } - - if( gFocusMgr.getKeyboardFocus() == mList ) - { - if (mAllowTextEntry) - { - mTextEntry->setFocus(TRUE); - } - else - { - setFocus(TRUE); - } - } + //mList->setFocus(FALSE); } - //------------------------------------------------------------------ // static functions //------------------------------------------------------------------ // static -void LLComboBox::onButtonClick(void *userdata) +void LLComboBox::onButtonDown(void *userdata) { LLComboBox *self = (LLComboBox *)userdata; @@ -701,50 +631,46 @@ void LLComboBox::onItemSelected(LLUICtrl* item, void *userdata) const LLString& name = self->mList->getSimpleSelectedItem(); - self->hideList(); - S32 cur_id = self->getCurrentIndex(); if (cur_id != -1) { - self->setLabel(self->mList->getSimpleSelectedItem()); + self->setLabel(name); if (self->mAllowTextEntry) { - self->mTextEntry->setText(name); - self->mTextEntry->setTentative(FALSE); gFocusMgr.setKeyboardFocus(self->mTextEntry, NULL); self->mTextEntry->selectAll(); } - else - { - self->mButton->setLabelUnselected( name ); - self->mButton->setLabelSelected( name ); - self->mButton->setDisabledLabel( name ); - self->mButton->setDisabledSelectedLabel( name ); - } + } + else + { + // invalid selection, just restore existing value + self->mList->selectSimpleItem(self->mButton->getLabelSelected()); } self->onCommit(); -} -// static -void LLComboBox::onTopViewLost(LLView* old_focus) -{ - LLComboBox *self = (LLComboBox *) old_focus->getParent(); self->hideList(); } - // static -void LLComboBox::onMouseCaptureLost(LLMouseHandler*) +void LLComboBox::onListFocusChanged(LLUICtrl* list, void* user_data) { - // Can't hide the list here. If the list scrolls off the screen, - // and you click in the arrow buttons of the scroll bar, they must capture - // the mouse to handle scrolling-while-mouse-down. + LLComboBox *self = (LLComboBox *) list->getParent(); + if (!list->hasFocus()) + { + //*HACK: store the original value explicitly somewhere, not just in label + LLString orig_selection = self->mAllowTextEntry ? self->mTextEntry->getText() : self->mButton->getLabelSelected(); + + self->hideList(); + + // reassert original selection + self->mList->selectSimpleItem(orig_selection, FALSE); + } } BOOL LLComboBox::handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect_screen) { - + LLString tool_tip; if (LLUI::sShowXUINames) @@ -1122,15 +1048,3 @@ BOOL LLComboBox::operateOnAll(EOperation op) } return FALSE; } - -//static -void LLComboBox::onListFocusLost(LLUICtrl* old_focus) -{ - // if focus is going to nothing (user hit ESC), take it back - LLComboBox* combo = (LLComboBox*)old_focus->getParent(); - combo->hideList(); - if (gFocusMgr.getKeyboardFocus() == NULL) - { - combo->focusFirstItem(); - } -} diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index faf99937c9..2b19c3c2e5 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -34,6 +34,12 @@ class LLComboBox : public LLUICtrl, public LLCtrlListInterface { public: + typedef enum e_preferred_position + { + ABOVE, + BELOW + } EPreferredPosition; + LLComboBox( const LLString& name, const LLRect &rect, @@ -58,12 +64,6 @@ public: virtual BOOL handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect); virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); virtual BOOL handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent); - virtual BOOL handleHover(S32 x, S32 y, MASK mask); - virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); - virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); // LLUICtrl interface virtual void clear(); // select nothing @@ -146,34 +146,31 @@ public: void setButtonVisible(BOOL visible); - static void onButtonClick(void *userdata); + static void onButtonDown(void *userdata); static void onItemSelected(LLUICtrl* item, void *userdata); - static void onTopViewLost(LLView* old_focus); - static void onMouseCaptureLost(LLMouseHandler* old_captor); + static void onListFocusChanged(LLUICtrl* item, void *userdata); static void onTextEntry(LLLineEditor* line_editor, void* user_data); static void onTextCommit(LLUICtrl* caller, void* user_data); void updateSelection(); - void showList(); - void hideList(); - - static void onListFocusLost(LLUICtrl* old_focus); - + virtual void showList(); + virtual void hideList(); + protected: LLButton* mButton; LLScrollListCtrl* mList; LLViewBorder* mBorder; BOOL mKeyboardFocusOnClick; - BOOL mDrawButton; + BOOL mDrawArrow; LLLineEditor* mTextEntry; LLPointer<LLImageGL> mArrowImage; S32 mArrowImageWidth; BOOL mAllowTextEntry; S32 mMaxChars; BOOL mTextEntryTentative; + EPreferredPosition mListPosition; void (*mPrearrangeCallback)(LLUICtrl*,void*); void (*mTextEntryCallback)(LLLineEditor*, void*); - S32 mListWidth; // width of pop-up list, 0 = use combobox width }; #endif diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp index a88fbb7744..599a85021b 100644 --- a/indra/llui/lldraghandle.cpp +++ b/indra/llui/lldraghandle.cpp @@ -269,7 +269,7 @@ BOOL LLDragHandle::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture(this, NULL ); + gFocusMgr.setMouseCapture(this); localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY); mLastMouseScreenX = mDragLastScreenX; @@ -282,10 +282,10 @@ BOOL LLDragHandle::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLDragHandle::handleMouseUp(S32 x, S32 y, MASK mask) { - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); } // Note: don't pass on to children @@ -298,7 +298,7 @@ BOOL LLDragHandle::handleHover(S32 x, S32 y, MASK mask) BOOL handled = FALSE; // We only handle the click if the click both started and ended within us - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { S32 screen_x; S32 screen_y; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 0922de70af..1f71de1c87 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -279,7 +279,6 @@ void LLFloater::init(const LLString& title, mRect.getHeight() - LLPANEL_BORDER_WIDTH - close_box_size); mDragHandle = new LLDragHandleLeft("drag", drag_handle_rect, title ); } - mDragHandle->setSaveToXML(false); addChild(mDragHandle); // Resize Handle @@ -295,28 +294,24 @@ void LLFloater::init(const LLString& title, "resizebar_left", LLRect( 0, mRect.getHeight(), RESIZE_BAR_THICKNESS, 0), min_width, min_height, LLResizeBar::LEFT ); - mResizeBar[0]->setSaveToXML(false); addChild( mResizeBar[0] ); mResizeBar[1] = new LLResizeBar( "resizebar_top", LLRect( 0, mRect.getHeight(), mRect.getWidth(), mRect.getHeight() - RESIZE_BAR_THICKNESS), min_width, min_height, LLResizeBar::TOP ); - mResizeBar[1]->setSaveToXML(false); addChild( mResizeBar[1] ); mResizeBar[2] = new LLResizeBar( "resizebar_right", LLRect( mRect.getWidth() - RESIZE_BAR_THICKNESS, mRect.getHeight(), mRect.getWidth(), 0), min_width, min_height, LLResizeBar::RIGHT ); - mResizeBar[2]->setSaveToXML(false); addChild( mResizeBar[2] ); mResizeBar[3] = new LLResizeBar( "resizebar_bottom", LLRect( 0, RESIZE_BAR_THICKNESS, mRect.getWidth(), 0), min_width, min_height, LLResizeBar::BOTTOM ); - mResizeBar[3]->setSaveToXML(false); addChild( mResizeBar[3] ); @@ -327,7 +322,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::RIGHT_BOTTOM); - mResizeHandle[0]->setSaveToXML(false); addChild(mResizeHandle[0]); mResizeHandle[1] = new LLResizeHandle( "resize", @@ -335,7 +329,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::RIGHT_TOP ); - mResizeHandle[1]->setSaveToXML(false); addChild(mResizeHandle[1]); mResizeHandle[2] = new LLResizeHandle( "resize", @@ -343,7 +336,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::LEFT_BOTTOM ); - mResizeHandle[2]->setSaveToXML(false); addChild(mResizeHandle[2]); mResizeHandle[3] = new LLResizeHandle( "resize", @@ -351,7 +343,6 @@ void LLFloater::init(const LLString& title, min_width, min_height, LLResizeHandle::LEFT_TOP ); - mResizeHandle[3]->setSaveToXML(false); addChild(mResizeHandle[3]); } else @@ -463,14 +454,14 @@ void LLFloater::setVisible( BOOL visible ) if( !visible ) { - if( gFocusMgr.childIsTopView( this ) ) + if( gFocusMgr.childIsTopCtrl( this ) ) { - gFocusMgr.setTopView(NULL, NULL); + gFocusMgr.setTopCtrl(NULL); } if( gFocusMgr.childHasMouseCapture( this ) ) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } } @@ -584,9 +575,9 @@ void LLFloater::close(bool app_quitting) void LLFloater::releaseFocus() { - if( gFocusMgr.childIsTopView( this ) ) + if( gFocusMgr.childIsTopCtrl( this ) ) { - gFocusMgr.setTopView(NULL, NULL); + gFocusMgr.setTopCtrl(NULL); } if( gFocusMgr.childHasKeyboardFocus( this ) ) @@ -596,7 +587,7 @@ void LLFloater::releaseFocus() if( gFocusMgr.childHasMouseCapture( this ) ) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } } @@ -1464,28 +1455,24 @@ void LLFloater::setCanResize(BOOL can_resize) "resizebar_left", LLRect( 0, mRect.getHeight(), RESIZE_BAR_THICKNESS, 0), mMinWidth, mMinHeight, LLResizeBar::LEFT ); - mResizeBar[0]->setSaveToXML(false); addChild( mResizeBar[0] ); mResizeBar[1] = new LLResizeBar( "resizebar_top", LLRect( 0, mRect.getHeight(), mRect.getWidth(), mRect.getHeight() - RESIZE_BAR_THICKNESS), mMinWidth, mMinHeight, LLResizeBar::TOP ); - mResizeBar[1]->setSaveToXML(false); addChild( mResizeBar[1] ); mResizeBar[2] = new LLResizeBar( "resizebar_right", LLRect( mRect.getWidth() - RESIZE_BAR_THICKNESS, mRect.getHeight(), mRect.getWidth(), 0), mMinWidth, mMinHeight, LLResizeBar::RIGHT ); - mResizeBar[2]->setSaveToXML(false); addChild( mResizeBar[2] ); mResizeBar[3] = new LLResizeBar( "resizebar_bottom", LLRect( 0, RESIZE_BAR_THICKNESS, mRect.getWidth(), 0), mMinWidth, mMinHeight, LLResizeBar::BOTTOM ); - mResizeBar[3]->setSaveToXML(false); addChild( mResizeBar[3] ); @@ -1496,7 +1483,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::RIGHT_BOTTOM); - mResizeHandle[0]->setSaveToXML(false); addChild(mResizeHandle[0]); mResizeHandle[1] = new LLResizeHandle( "resize", @@ -1504,7 +1490,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::RIGHT_TOP ); - mResizeHandle[1]->setSaveToXML(false); addChild(mResizeHandle[1]); mResizeHandle[2] = new LLResizeHandle( "resize", @@ -1512,7 +1497,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::LEFT_BOTTOM ); - mResizeHandle[2]->setSaveToXML(false); addChild(mResizeHandle[2]); mResizeHandle[3] = new LLResizeHandle( "resize", @@ -1520,7 +1504,6 @@ void LLFloater::setCanResize(BOOL can_resize) mMinWidth, mMinHeight, LLResizeHandle::LEFT_TOP ); - mResizeHandle[3]->setSaveToXML(false); addChild(mResizeHandle[3]); } mResizable = can_resize; @@ -2022,8 +2005,7 @@ void LLFloaterView::focusFrontFloater() void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom) { S32 col = 0; - LLRect snap_rect_local = getSnapRect(); - snap_rect_local.translate(-mRect.mLeft, -mRect.mBottom); + LLRect snap_rect_local = getLocalSnapRect(); for(S32 row = snap_rect_local.mBottom; row < snap_rect_local.getHeight() - LLFLOATER_HEADER_SIZE; row += LLFLOATER_HEADER_SIZE ) //loop rows @@ -2146,8 +2128,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out S32 screen_width = getSnapRect().getWidth(); S32 screen_height = getSnapRect().getHeight(); // convert to local coordinate frame - LLRect snap_rect_local = getSnapRect(); - snap_rect_local.translate(-mRect.mLeft, -mRect.mBottom); + LLRect snap_rect_local = getLocalSnapRect(); if( floater->isResizable() ) { diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 030fbf0653..da53e3d104 100644 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -21,18 +21,16 @@ LLFocusMgr::LLFocusMgr() mLockedView( NULL ), mKeyboardLockedFocusLostCallback( NULL ), mMouseCaptor( NULL ), - mMouseCaptureLostCallback( NULL ), mKeyboardFocus( NULL ), mDefaultKeyboardFocus( NULL ), mKeyboardFocusLostCallback( NULL ), - mTopView( NULL ), - mTopViewLostCallback( NULL ), + mTopCtrl( NULL ), mFocusWeight(0.f), mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true #ifdef _DEBUG , mMouseCaptorName("none") , mKeyboardFocusName("none") - , mTopViewName("none") + , mTopCtrlName("none") #endif { } @@ -46,7 +44,7 @@ void LLFocusMgr::releaseFocusIfNeeded( LLView* view ) { if( childHasMouseCapture( view ) ) { - setMouseCapture( NULL, NULL ); + setMouseCapture( NULL ); } if( childHasKeyboardFocus( view )) @@ -63,9 +61,9 @@ void LLFocusMgr::releaseFocusIfNeeded( LLView* view ) } } - if( childIsTopView( view ) ) + if( childIsTopCtrl( view ) ) { - setTopView( NULL, NULL ); + setTopCtrl( NULL ); } } @@ -108,13 +106,13 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, FocusLostCallback on_focu // If we've got a default keyboard focus, and the caller is // releasing keyboard focus, move to the default. - if (mDefaultKeyboardFocus != NULL && new_focus == NULL) + if (mDefaultKeyboardFocus != NULL && mKeyboardFocus == NULL) { mDefaultKeyboardFocus->setFocus(TRUE); } - LLView* focus_subtree = new_focus; - LLView* viewp = new_focus; + LLView* focus_subtree = mKeyboardFocus; + LLView* viewp = mKeyboardFocus; // find root-most focus root while(viewp) { @@ -128,13 +126,13 @@ void LLFocusMgr::setKeyboardFocus(LLUICtrl* new_focus, FocusLostCallback on_focu if (focus_subtree) { - mFocusHistory[focus_subtree->mViewHandle] = new_focus ? new_focus->mViewHandle : LLViewHandle::sDeadHandle; + mFocusHistory[focus_subtree->mViewHandle] = mKeyboardFocus ? mKeyboardFocus->mViewHandle : LLViewHandle::sDeadHandle; } } if (lock) { - mLockedView = new_focus; + mLockedView = mKeyboardFocus; mKeyboardLockedFocusLostCallback = on_focus_lost; } } @@ -198,16 +196,13 @@ void LLFocusMgr::removeKeyboardFocusWithoutCallback( LLView* focus ) } -void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor, void (*on_capture_lost)(LLMouseHandler* old_captor) ) +void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor ) { //if (mFocusLocked) //{ // return; //} - void (*old_callback)(LLMouseHandler*) = mMouseCaptureLostCallback; - mMouseCaptureLostCallback = on_capture_lost; - if( new_captor != mMouseCaptor ) { LLMouseHandler* old_captor = mMouseCaptor; @@ -230,9 +225,9 @@ void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor, void (*on_capture_ } */ - if( old_callback ) + if( old_captor ) { - old_callback( old_captor ); + old_captor->onMouseCaptureLost(); } #ifdef _DEBUG @@ -250,7 +245,6 @@ void LLFocusMgr::removeMouseCaptureWithoutCallback( LLMouseHandler* captor ) if( mMouseCaptor == captor ) { mMouseCaptor = NULL; - mMouseCaptureLostCallback = NULL; #ifdef _DEBUG mMouseCaptorName = "none"; #endif @@ -258,9 +252,9 @@ void LLFocusMgr::removeMouseCaptureWithoutCallback( LLMouseHandler* captor ) } -BOOL LLFocusMgr::childIsTopView( LLView* parent ) +BOOL LLFocusMgr::childIsTopCtrl( LLView* parent ) { - LLView* top_view = mTopView; + LLView* top_view = (LLView*)mTopCtrl; while( top_view ) { if( top_view == parent ) @@ -275,36 +269,25 @@ BOOL LLFocusMgr::childIsTopView( LLView* parent ) // set new_top = NULL to release top_view. -void LLFocusMgr::setTopView( LLView* new_top, void (*on_top_lost)(LLView* old_top) ) +void LLFocusMgr::setTopCtrl( LLUICtrl* new_top ) { - void (*old_callback)(LLView*) = mTopViewLostCallback; - mTopViewLostCallback = on_top_lost; - - if( new_top != mTopView ) + if( new_top != mTopCtrl ) { - LLView* old_top = mTopView; - mTopView = new_top; - if( old_callback ) - { - old_callback( old_top ); - } - - mTopView = new_top; + mTopCtrl = new_top; #ifdef _DEBUG - mTopViewName = new_top ? new_top->getName() : "none"; + mTopCtrlName = new_top ? new_top->getName() : "none"; #endif } } -void LLFocusMgr::removeTopViewWithoutCallback( LLView* top_view ) +void LLFocusMgr::removeTopCtrlWithoutCallback( LLUICtrl* top_view ) { - if( mTopView == top_view ) + if( mTopCtrl == top_view ) { - mTopView = NULL; - mTopViewLostCallback = NULL; + mTopCtrl = NULL; #ifdef _DEBUG - mTopViewName = "none"; + mTopCtrlName = "none"; #endif } } @@ -343,6 +326,12 @@ void LLFocusMgr::setAppHasFocus(BOOL focus) { triggerFocusFlash(); } + + // release focus from "top ctrl"s, which generally hides them + if (!focus && mTopCtrl && mTopCtrl->hasFocus()) + { + mTopCtrl->setFocus(FALSE); + } mAppHasFocus = focus; } diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index cb555fca91..dc8025d4c0 100644 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -27,7 +27,7 @@ public: ~LLFocusMgr(); // Mouse Captor - void setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor)); // new_captor = NULL to release the mouse. + void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse. LLMouseHandler* getMouseCapture() { return mMouseCaptor; } void removeMouseCaptureWithoutCallback( LLMouseHandler* captor ); BOOL childHasMouseCapture( LLView* parent ); @@ -54,10 +54,10 @@ public: // Top View - void setTopView(LLView* new_top, void (*on_top_lost)(LLView* old_top)); - LLView* getTopView() const { return mTopView; } - void removeTopViewWithoutCallback( LLView* top_view ); - BOOL childIsTopView( LLView* parent ); + void setTopCtrl(LLUICtrl* new_top); + LLUICtrl* getTopCtrl() const { return mTopCtrl; } + void removeTopCtrlWithoutCallback( LLUICtrl* top_view ); + BOOL childIsTopCtrl( LLView* parent ); // All Three void releaseFocusIfNeeded( LLView* top_view ); @@ -70,7 +70,6 @@ protected: // Mouse Captor LLMouseHandler* mMouseCaptor; // Mouse events are premptively routed to this object - void (*mMouseCaptureLostCallback)(LLMouseHandler*); // The object to which mouse events are routed is called before another object takes its place // Keyboard Focus LLUICtrl* mKeyboardFocus; // Keyboard events are preemptively routed to this object @@ -78,8 +77,7 @@ protected: FocusLostCallback mKeyboardFocusLostCallback; // The object to which keyboard events are routed is called before another object takes its place // Top View - LLView* mTopView; - void (*mTopViewLostCallback)(LLView*); + LLUICtrl* mTopCtrl; LLFrameTimer mFocusTimer; F32 mFocusWeight; @@ -92,7 +90,7 @@ protected: #ifdef _DEBUG LLString mMouseCaptorName; LLString mKeyboardFocusName; - LLString mTopViewName; + LLString mTopCtrlName; #endif }; diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 46d66b3cd4..7422a039dd 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -96,7 +96,7 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, S32 max_length_bytes, void (*commit_callback)(LLUICtrl* caller, void* user_data ), void (*keystroke_callback)(LLLineEditor* caller, void* user_data ), - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data ), + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data ), void* userdata, LLLinePrevalidateFunc prevalidate_func, LLViewBorder::EBevel border_bevel, @@ -113,7 +113,6 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, mCommitOnFocusLost( TRUE ), mRevertOnEsc( TRUE ), mKeystrokeCallback( keystroke_callback ), - mFocusLostCallback( focus_lost_callback ), mIsSelecting( FALSE ), mSelectionStart( 0 ), mSelectionEnd( 0 ), @@ -147,6 +146,8 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, mGLFont = LLFontGL::sSansSerifSmall; } + setFocusLostCallback(focus_lost_callback); + mMinHPixels = mBorderThickness + UI_LINEEDITOR_H_PAD + mBorderLeft; mMaxHPixels = mRect.getWidth() - mMinHPixels - mBorderThickness - mBorderRight; @@ -167,7 +168,6 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, LLLineEditor::~LLLineEditor() { - mFocusLostCallback = NULL; mCommitOnFocusLost = FALSE; gFocusMgr.releaseFocusIfNeeded( this ); @@ -192,11 +192,8 @@ LLString LLLineEditor::getWidgetTag() const void LLLineEditor::onFocusLost() { - if( mFocusLostCallback ) - { - mFocusLostCallback( this, mCallbackUserData ); - } - + LLUICtrl::onFocusLost(); + if( mCommitOnFocusLost && mText.getString() != mPrevText) { onCommit(); @@ -483,7 +480,7 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask) startSelection(); } - gFocusMgr.setMouseCapture( this, &LLLineEditor::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); } // delay cursor flashing @@ -496,14 +493,14 @@ BOOL LLLineEditor::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if (gFocusMgr.getMouseCapture() != this && (x < mBorderLeft || x > (mRect.getWidth() - mBorderRight))) + if (!hasMouseCapture() && (x < mBorderLeft || x > (mRect.getWidth() - mBorderRight))) { return LLUICtrl::handleHover(x, y, mask); } if( getVisible() ) { - if( (gFocusMgr.getMouseCapture() == this) && mIsSelecting ) + if( (hasMouseCapture()) && mIsSelecting ) { if (x != mLastSelectionX || y != mLastSelectionY) { @@ -561,9 +558,9 @@ BOOL LLLineEditor::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } @@ -1897,11 +1894,9 @@ BOOL LLLineEditor::prevalidateASCII(const LLWString &str) return rv; } -//static -void LLLineEditor::onMouseCaptureLost( LLMouseHandler* old_captor ) +void LLLineEditor::onMouseCaptureLost() { - LLLineEditor* self = (LLLineEditor*) old_captor; - self->endSelection(); + endSelection(); } @@ -1916,11 +1911,6 @@ void LLLineEditor::setKeystrokeCallback(void (*keystroke_callback)(LLLineEditor* mKeystrokeCallback = keystroke_callback; } -void LLLineEditor::setFocusLostCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data)) -{ - mFocusLostCallback = keystroke_callback; -} - // virtual LLXMLNodePtr LLLineEditor::getXML(bool save_children) const { diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index ef2f43a1d3..27ae351d1f 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -51,7 +51,7 @@ public: S32 max_length_bytes = 254, void (*commit_callback)(LLUICtrl* caller, void* user_data) = NULL, void (*keystroke_callback)(LLLineEditor* caller, void* user_data) = NULL, - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data) = NULL, + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data) = NULL, void* userdata = NULL, LLLinePrevalidateFunc prevalidate_func = NULL, LLViewBorder::EBevel border_bevel = LLViewBorder::BEVEL_IN, @@ -72,6 +72,7 @@ public: /*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask); /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent ); /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent); + /*virtual*/ void onMouseCaptureLost(); // LLEditMenuHandler overrides virtual void cut(); @@ -166,7 +167,6 @@ public: void setSelectAllonFocusReceived(BOOL b); void setKeystrokeCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data)); - void setFocusLostCallback(void (*keystroke_callback)(LLLineEditor* caller, void* user_data)); void setMaxTextLength(S32 max_text_length); void setBorderWidth(S32 left, S32 right); @@ -186,8 +186,6 @@ public: static BOOL postvalidateFloat(const LLString &str); - static void onMouseCaptureLost( LLMouseHandler* old_captor ); - protected: void removeChar(); void addChar(const llwchar c); @@ -222,7 +220,6 @@ protected: BOOL mRevertOnEsc; void (*mKeystrokeCallback)( LLLineEditor* caller, void* userdata ); - void (*mFocusLostCallback)( LLLineEditor* caller, void* userdata ); BOOL mIsSelecting; // Selection for clipboard operations S32 mSelectionStart; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index d46a866e2b..79c38a87c0 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3235,6 +3235,7 @@ LLPieMenu::LLPieMenu(const LLString& name, const LLString& label) mUseInfiniteRadius(FALSE), mHoverItem(NULL), mHoverThisFrame(FALSE), + mHoveredAnyItem(FALSE), mOuterRingAlpha(1.f), mCurRadius(0.f), mRightMouseDown(FALSE) @@ -3249,6 +3250,7 @@ LLPieMenu::LLPieMenu(const LLString& name) mUseInfiniteRadius(FALSE), mHoverItem(NULL), mHoverThisFrame(FALSE), + mHoveredAnyItem(FALSE), mOuterRingAlpha(1.f), mCurRadius(0.f), mRightMouseDown(FALSE) @@ -3319,12 +3321,12 @@ BOOL LLPieMenu::handleHover( S32 x, S32 y, MASK mask ) // release mouse capture after short period of visibility if we're using a finite boundary // so that right click outside of boundary will trigger new pie menu - if (gFocusMgr.getMouseCapture() == this && + if (hasMouseCapture() && !mRightMouseDown && mShrinkBorderTimer.getStarted() && mShrinkBorderTimer.getElapsedTimeF32() >= PIE_SHRINK_TIME) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); mUseInfiniteRadius = FALSE; } @@ -3376,6 +3378,7 @@ BOOL LLPieMenu::handleHover( S32 x, S32 y, MASK mask ) break; } } + mHoveredAnyItem = TRUE; } else { @@ -3437,7 +3440,7 @@ BOOL LLPieMenu::handleRightMouseDown(S32 x, S32 y, MASK mask) if (clicked_in_pie) { // capture mouse cursor as if on initial menu show - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); mShrinkBorderTimer.stop(); mUseInfiniteRadius = TRUE; handled = TRUE; @@ -3463,11 +3466,22 @@ BOOL LLPieMenu::handleRightMouseUp( S32 x, S32 y, MASK mask ) mShrinkBorderTimer.getElapsedTimeF32() > PIE_SHRINK_TIME) { mUseInfiniteRadius = FALSE; - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } + S32 delta_x = x /*+ mShiftHoriz*/ - getLocalRect().getCenterX(); + S32 delta_y = y /*+ mShiftVert*/ - getLocalRect().getCenterY(); + if (!mHoveredAnyItem && !mFirstMouseDown && (delta_x * delta_x) + (delta_y * delta_y) < PIE_CENTER_SIZE * PIE_CENTER_SIZE) + { + // user released right mouse button in middle of pie, interpret this as closing the menu + sMenuContainer->hideMenus(); + return TRUE; + } + + BOOL result = handleMouseUp( x, y, mask ); mRightMouseDown = FALSE; + mHoveredAnyItem = FALSE; return result; } @@ -3874,6 +3888,8 @@ void LLPieMenu::show(S32 x, S32 y, BOOL mouse_down) mRightMouseDown = mouse_down; mFirstMouseDown = mouse_down; mUseInfiniteRadius = TRUE; + mHoveredAnyItem = FALSE; + if (!mFirstMouseDown) { make_ui_sound("UISndPieMenuAppear"); @@ -3883,7 +3899,7 @@ void LLPieMenu::show(S32 x, S32 y, BOOL mouse_down) // we want all mouse events in case user does quick right click again off of pie menu // rectangle, to support gestural menu traversal - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); if (mouse_down) { @@ -3910,10 +3926,11 @@ void LLPieMenu::hide(BOOL item_selected) mFirstMouseDown = FALSE; mRightMouseDown = FALSE; mUseInfiniteRadius = FALSE; + mHoveredAnyItem = FALSE; LLView::setVisible(FALSE); - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } ///============================================================================ @@ -4510,6 +4527,7 @@ void LLTearOffMenu::onFocusLost() { // remove highlight from parent item and our own menu mMenu->clearHoverItem(); + LLFloater::onFocusLost(); } BOOL LLTearOffMenu::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index e60f267702..36ca815ef3 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -672,6 +672,7 @@ private: BOOL mUseInfiniteRadius; // allow picking pie menu items anywhere outside of center circle LLMenuItemGL* mHoverItem; BOOL mHoverThisFrame; + BOOL mHoveredAnyItem; LLFrameTimer mShrinkBorderTimer; F32 mOuterRingAlpha; // for rendering pie menus as both bounded and unbounded F32 mCurRadius; diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp index 4eaf6b7559..4453767f92 100644 --- a/indra/llui/llmodaldialog.cpp +++ b/indra/llui/llmodaldialog.cpp @@ -65,8 +65,8 @@ void LLModalDialog::startModal() } // This is a modal dialog. It sucks up all mouse and keyboard operations. - gFocusMgr.setMouseCapture( this, NULL ); - gFocusMgr.setTopView( this, NULL ); + gFocusMgr.setMouseCapture( this ); + gFocusMgr.setTopCtrl( this ); setFocus(TRUE); sModalStack.push_front( this ); @@ -107,10 +107,10 @@ void LLModalDialog::setVisible( BOOL visible ) if( visible ) { // This is a modal dialog. It sucks up all mouse and keyboard operations. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); // The dialog view is a root view - gFocusMgr.setTopView( this, NULL ); + gFocusMgr.setTopCtrl( this ); setFocus( TRUE ); } else @@ -222,9 +222,9 @@ void LLModalDialog::draw() if (mModal) { // If we've lost focus to a non-child, get it back ASAP. - if( gFocusMgr.getTopView() != this ) + if( gFocusMgr.getTopCtrl() != this ) { - gFocusMgr.setTopView( this, NULL); + gFocusMgr.setTopCtrl( this ); } if( !gFocusMgr.childHasKeyboardFocus( this ) ) @@ -234,7 +234,7 @@ void LLModalDialog::draw() if( !gFocusMgr.childHasMouseCapture( this ) ) { - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); } } } @@ -259,7 +259,7 @@ void LLModalDialog::onAppFocusLost() LLModalDialog* instance = LLModalDialog::sModalStack.front(); if( gFocusMgr.childHasMouseCapture( instance ) ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); } if( gFocusMgr.childHasKeyboardFocus( instance ) ) @@ -277,9 +277,9 @@ void LLModalDialog::onAppFocusGained() LLModalDialog* instance = LLModalDialog::sModalStack.front(); // This is a modal dialog. It sucks up all mouse and keyboard operations. - gFocusMgr.setMouseCapture( instance, NULL ); + gFocusMgr.setMouseCapture( instance ); instance->setFocus(TRUE); - gFocusMgr.setTopView( instance, NULL ); + gFocusMgr.setTopCtrl( instance ); instance->centerOnScreen(); } diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp index c6bc7fb355..0128b4ebbc 100644 --- a/indra/llui/llresizebar.cpp +++ b/indra/llui/llresizebar.cpp @@ -21,8 +21,8 @@ LLResizeBar::LLResizeBar( const LLString& name, const LLRect& rect, S32 min_width, S32 min_height, Side side ) : LLView( name, rect, TRUE ), - mDragStartScreenX( 0 ), - mDragStartScreenY( 0 ), + mDragLastScreenX( 0 ), + mDragLastScreenY( 0 ), mLastMouseScreenX( 0 ), mLastMouseScreenY( 0 ), mMinWidth( min_width ), @@ -55,6 +55,8 @@ LLResizeBar::LLResizeBar( const LLString& name, const LLRect& rect, S32 min_widt default: break; } + // this is just a decorator + setSaveToXML(FALSE); } @@ -64,12 +66,11 @@ BOOL LLResizeBar::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); - //localPointToScreen(x, y, &mDragStartScreenX, &mDragStartScreenX); - localPointToOtherView(x, y, &mDragStartScreenX, &mDragStartScreenY, getParent()->getParent()); - mLastMouseScreenX = mDragStartScreenX; - mLastMouseScreenY = mDragStartScreenY; + localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY); + mLastMouseScreenX = mDragLastScreenX; + mLastMouseScreenY = mDragLastScreenY; } return TRUE; @@ -80,10 +81,10 @@ BOOL LLResizeBar::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } else @@ -108,74 +109,73 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask) BOOL handled = FALSE; // We only handle the click if the click both started and ended within us - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - // *NOTE: this, of course, is fragile - LLView* floater_view = getParent()->getParent(); - S32 floater_view_x; - S32 floater_view_y; - localPointToOtherView(x, y, &floater_view_x, &floater_view_y, floater_view); + S32 screen_x; + S32 screen_y; + localPointToScreen(x, y, &screen_x, &screen_y); - S32 delta_x = floater_view_x - mDragStartScreenX; - S32 delta_y = floater_view_y - mDragStartScreenY; + S32 delta_x = screen_x - mDragLastScreenX; + S32 delta_y = screen_y - mDragLastScreenY; LLCoordGL mouse_dir; // use hysteresis on mouse motion to preserve user intent when mouse stops moving - mouse_dir.mX = (floater_view_x == mLastMouseScreenX) ? mLastMouseDir.mX : floater_view_x - mLastMouseScreenX; - mouse_dir.mY = (floater_view_y == mLastMouseScreenY) ? mLastMouseDir.mY : floater_view_y - mLastMouseScreenY; + mouse_dir.mX = (screen_x == mLastMouseScreenX) ? mLastMouseDir.mX : screen_x - mLastMouseScreenX; + mouse_dir.mY = (screen_y == mLastMouseScreenY) ? mLastMouseDir.mY : screen_y - mLastMouseScreenY; mLastMouseDir = mouse_dir; - mLastMouseScreenX = floater_view_x; - mLastMouseScreenY = floater_view_y; + mLastMouseScreenX = screen_x; + mLastMouseScreenY = screen_y; // Make sure the mouse in still over the application. We don't want to make the parent // so big that we can't see the resize handle any more. - LLRect valid_rect = floater_view->getRect(); - LLView* parentView = getParent(); - if( valid_rect.localPointInRect( floater_view_x, floater_view_y ) && parentView ) + LLRect valid_rect = getRootView()->getRect(); + LLView* resizing_view = getParent(); + + if( valid_rect.localPointInRect( screen_x, screen_y ) && resizing_view ) { // Resize the parent - LLRect parent_rect = parentView->getRect(); - LLRect scaled_rect = parent_rect; + LLRect orig_rect = resizing_view->getRect(); + LLRect scaled_rect = orig_rect; - S32 new_width = parent_rect.getWidth(); - S32 new_height = parent_rect.getHeight(); + S32 new_width = orig_rect.getWidth(); + S32 new_height = orig_rect.getHeight(); switch( mSide ) { case LEFT: - new_width = parent_rect.getWidth() - delta_x; + new_width = orig_rect.getWidth() - delta_x; if( new_width < mMinWidth ) { new_width = mMinWidth; - delta_x = parent_rect.getWidth() - mMinWidth; + delta_x = orig_rect.getWidth() - mMinWidth; } scaled_rect.translate(delta_x, 0); break; case TOP: - new_height = parent_rect.getHeight() + delta_y; + new_height = orig_rect.getHeight() + delta_y; if( new_height < mMinHeight ) { new_height = mMinHeight; - delta_y = mMinHeight - parent_rect.getHeight(); + delta_y = mMinHeight - orig_rect.getHeight(); } break; case RIGHT: - new_width = parent_rect.getWidth() + delta_x; + new_width = orig_rect.getWidth() + delta_x; if( new_width < mMinWidth ) { new_width = mMinWidth; - delta_x = mMinWidth - parent_rect.getWidth(); + delta_x = mMinWidth - orig_rect.getWidth(); } break; case BOTTOM: - new_height = parent_rect.getHeight() - delta_y; + new_height = orig_rect.getHeight() - delta_y; if( new_height < mMinHeight ) { new_height = mMinHeight; - delta_y = parent_rect.getHeight() - mMinHeight; + delta_y = orig_rect.getHeight() - mMinHeight; } scaled_rect.translate(0, delta_y); break; @@ -183,56 +183,59 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask) scaled_rect.mTop = scaled_rect.mBottom + new_height; scaled_rect.mRight = scaled_rect.mLeft + new_width; - parentView->setRect(scaled_rect); - - S32 snap_delta_x = 0; - S32 snap_delta_y = 0; + resizing_view->setRect(scaled_rect); LLView* snap_view = NULL; switch( mSide ) { case LEFT: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mLeft; - scaled_rect.mLeft += snap_delta_x; + snap_view = resizing_view->findSnapEdge(scaled_rect.mLeft, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; case TOP: - snap_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mTop; - scaled_rect.mTop += snap_delta_y; + snap_view = resizing_view->findSnapEdge(scaled_rect.mTop, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; case RIGHT: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mRight; - scaled_rect.mRight += snap_delta_x; + snap_view = resizing_view->findSnapEdge(scaled_rect.mRight, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; case BOTTOM: - snap_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mBottom; - scaled_rect.mBottom += snap_delta_y; + snap_view = resizing_view->findSnapEdge(scaled_rect.mBottom, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); break; } - parentView->snappedTo(snap_view); + // register "snap" behavior with snapped view + resizing_view->snappedTo(snap_view); - parentView->setRect(parent_rect); + // restore original rectangle so the appropriate changes are detected + resizing_view->setRect(orig_rect); + // change view shape as user operation + resizing_view->userSetShape(scaled_rect); - parentView->reshape(scaled_rect.getWidth(), scaled_rect.getHeight(), FALSE); - parentView->translate(scaled_rect.mLeft - parentView->getRect().mLeft, scaled_rect.mBottom - parentView->getRect().mBottom); - - floater_view_x = mDragStartScreenX + delta_x; - floater_view_y = mDragStartScreenY + delta_y; - mDragStartScreenX = floater_view_x + snap_delta_x; - mDragStartScreenY = floater_view_y + snap_delta_y; + // update last valid mouse cursor position based on resized view's actual size + LLRect new_rect = resizing_view->getRect(); + switch(mSide) + { + case LEFT: + mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft; + break; + case RIGHT: + mDragLastScreenX += new_rect.mRight - orig_rect.mRight; + break; + case TOP: + mDragLastScreenY += new_rect.mTop - orig_rect.mTop; + break; + case BOTTOM: + mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom; + break; + default: + break; + } } - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active)" << llendl; handled = TRUE; } else { - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (inactive)" << llendl; handled = TRUE; } diff --git a/indra/llui/llresizebar.h b/indra/llui/llresizebar.h index c2a07fd3e3..7a77cce8a6 100644 --- a/indra/llui/llresizebar.h +++ b/indra/llui/llresizebar.h @@ -30,8 +30,8 @@ public: void setResizeLimits( S32 min_width, S32 min_height ) { mMinWidth = min_width; mMinHeight = min_height; } protected: - S32 mDragStartScreenX; - S32 mDragStartScreenY; + S32 mDragLastScreenX; + S32 mDragLastScreenY; S32 mLastMouseScreenX; S32 mLastMouseScreenY; LLCoordGL mLastMouseDir; diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp index 77101fa296..e4035b3ab2 100644 --- a/indra/llui/llresizehandle.cpp +++ b/indra/llui/llresizehandle.cpp @@ -23,8 +23,8 @@ const S32 RESIZE_BORDER_WIDTH = 3; LLResizeHandle::LLResizeHandle( const LLString& name, const LLRect& rect, S32 min_width, S32 min_height, ECorner corner ) : LLView( name, rect, TRUE ), - mDragStartScreenX( 0 ), - mDragStartScreenY( 0 ), + mDragLastScreenX( 0 ), + mDragLastScreenY( 0 ), mLastMouseScreenX( 0 ), mLastMouseScreenY( 0 ), mImage( NULL ), @@ -47,6 +47,9 @@ LLResizeHandle::LLResizeHandle( const LLString& name, const LLRect& rect, S32 mi case RIGHT_TOP: setFollows( FOLLOWS_RIGHT | FOLLOWS_TOP ); break; case RIGHT_BOTTOM: setFollows( FOLLOWS_RIGHT | FOLLOWS_BOTTOM ); break; } + + // decorator object, don't serialize + setSaveToXML(FALSE); } EWidgetType LLResizeHandle::getWidgetType() const @@ -69,11 +72,11 @@ BOOL LLResizeHandle::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); - localPointToScreen(x, y, &mDragStartScreenX, &mDragStartScreenY); - mLastMouseScreenX = mDragStartScreenX; - mLastMouseScreenY = mDragStartScreenY; + localPointToScreen(x, y, &mDragLastScreenX, &mDragLastScreenY); + mLastMouseScreenX = mDragLastScreenX; + mLastMouseScreenY = mDragLastScreenY; } } @@ -85,10 +88,10 @@ BOOL LLResizeHandle::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } else @@ -106,7 +109,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) BOOL handled = FALSE; // We only handle the click if the click both started and ended within us - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { // Make sure the mouse in still over the application. We don't want to make the parent // so big that we can't see the resize handle any more. @@ -114,18 +117,18 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) S32 screen_x; S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y); - const LLRect& valid_rect = gFloaterView->getRect(); // Assumes that the parent is a floater. + const LLRect valid_rect = getRootView()->getRect(); screen_x = llclamp( screen_x, valid_rect.mLeft, valid_rect.mRight ); screen_y = llclamp( screen_y, valid_rect.mBottom, valid_rect.mTop ); - LLView* parentView = getParent(); - if( parentView ) + LLView* resizing_view = getParent(); + if( resizing_view ) { // Resize the parent - LLRect parent_rect = parentView->getRect(); - LLRect scaled_rect = parent_rect; - S32 delta_x = screen_x - mDragStartScreenX; - S32 delta_y = screen_y - mDragStartScreenY; + LLRect orig_rect = resizing_view->getRect(); + LLRect scaled_rect = orig_rect; + S32 delta_x = screen_x - mDragLastScreenX; + S32 delta_y = screen_y - mDragLastScreenY; LLCoordGL mouse_dir; // use hysteresis on mouse motion to preserve user intent when mouse stops moving mouse_dir.mX = (screen_x == mLastMouseScreenX) ? mLastMouseDir.mX : screen_x - mLastMouseScreenX; @@ -156,18 +159,18 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) break; } - S32 new_width = parent_rect.getWidth() + x_multiple * delta_x; + S32 new_width = orig_rect.getWidth() + x_multiple * delta_x; if( new_width < mMinWidth ) { new_width = mMinWidth; - delta_x = x_multiple * (mMinWidth - parent_rect.getWidth()); + delta_x = x_multiple * (mMinWidth - orig_rect.getWidth()); } - S32 new_height = parent_rect.getHeight() + y_multiple * delta_y; + S32 new_height = orig_rect.getHeight() + y_multiple * delta_y; if( new_height < mMinHeight ) { new_height = mMinHeight; - delta_y = y_multiple * (mMinHeight - parent_rect.getHeight()); + delta_y = y_multiple * (mMinHeight - orig_rect.getHeight()); } switch( mCorner ) @@ -188,10 +191,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) // temporarily set new parent rect scaled_rect.mRight = scaled_rect.mLeft + new_width; scaled_rect.mTop = scaled_rect.mBottom + new_height; - parentView->setRect(scaled_rect); - - S32 snap_delta_x = 0; - S32 snap_delta_y = 0; + resizing_view->setRect(scaled_rect); LLView* snap_view = NULL; LLView* test_view = NULL; @@ -200,77 +200,78 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask) switch(mCorner) { case LEFT_TOP: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mLeft; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mTop; + snap_view = resizing_view->findSnapEdge(scaled_rect.mLeft, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mTop, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mLeft += snap_delta_x; - scaled_rect.mTop += snap_delta_y; break; case LEFT_BOTTOM: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mLeft; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mBottom; + snap_view = resizing_view->findSnapEdge(scaled_rect.mLeft, mouse_dir, SNAP_LEFT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mBottom, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mLeft += snap_delta_x; - scaled_rect.mBottom += snap_delta_y; break; case RIGHT_TOP: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mRight; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mTop; + snap_view = resizing_view->findSnapEdge(scaled_rect.mRight, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mTop, mouse_dir, SNAP_TOP, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mRight += snap_delta_x; - scaled_rect.mTop += snap_delta_y; break; case RIGHT_BOTTOM: - snap_view = parentView->findSnapEdge(snap_delta_x, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_x -= scaled_rect.mRight; - test_view = parentView->findSnapEdge(snap_delta_y, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); - snap_delta_y -= scaled_rect.mBottom; + snap_view = resizing_view->findSnapEdge(scaled_rect.mRight, mouse_dir, SNAP_RIGHT, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); + test_view = resizing_view->findSnapEdge(scaled_rect.mBottom, mouse_dir, SNAP_BOTTOM, SNAP_PARENT_AND_SIBLINGS, LLUI::sConfigGroup->getS32("SnapMargin")); if (!snap_view) { snap_view = test_view; } - scaled_rect.mRight += snap_delta_x; - scaled_rect.mBottom += snap_delta_y; break; } - parentView->snappedTo(snap_view); + // register "snap" behavior with snapped view + resizing_view->snappedTo(snap_view); // reset parent rect - parentView->setRect(parent_rect); + resizing_view->setRect(orig_rect); // translate and scale to new shape - parentView->reshape(scaled_rect.getWidth(), scaled_rect.getHeight(), FALSE); - parentView->translate(scaled_rect.mLeft - parentView->getRect().mLeft, scaled_rect.mBottom - parentView->getRect().mBottom); + resizing_view->userSetShape(scaled_rect); - screen_x = mDragStartScreenX + delta_x + snap_delta_x; - screen_y = mDragStartScreenY + delta_y + snap_delta_y; - mDragStartScreenX = screen_x; - mDragStartScreenY = screen_y; + // update last valid mouse cursor position based on resized view's actual size + LLRect new_rect = resizing_view->getRect(); + switch(mCorner) + { + case LEFT_TOP: + mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft; + mDragLastScreenY += new_rect.mTop - orig_rect.mTop; + break; + case LEFT_BOTTOM: + mDragLastScreenX += new_rect.mLeft - orig_rect.mLeft; + mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom; + break; + case RIGHT_TOP: + mDragLastScreenX += new_rect.mRight - orig_rect.mRight; + mDragLastScreenY += new_rect.mTop - orig_rect.mTop; + break; + case RIGHT_BOTTOM: + mDragLastScreenX += new_rect.mRight - orig_rect.mRight; + mDragLastScreenY += new_rect.mBottom- orig_rect.mBottom; + break; + default: + break; + } } - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (active) " << llendl; handled = TRUE; } else if( getVisible() && pointInHandle( x, y ) ) { - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << " (inactive) " << llendl; handled = TRUE; } diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h index 1350d1af20..cf383a33cc 100644 --- a/indra/llui/llresizehandle.h +++ b/indra/llui/llresizehandle.h @@ -37,8 +37,8 @@ protected: BOOL pointInHandle( S32 x, S32 y ); protected: - S32 mDragStartScreenX; - S32 mDragStartScreenY; + S32 mDragLastScreenX; + S32 mDragLastScreenY; S32 mLastMouseScreenX; S32 mLastMouseScreenY; LLCoordGL mLastMouseDir; diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index c21bbdcc75..f4aea3fa11 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -214,7 +214,7 @@ BOOL LLScrollbar::handleMouseDown(S32 x, S32 y, MASK mask) { // Start dragging the thumb // No handler needed for focus lost since this clas has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mDragStartX = x; mDragStartY = y; mOrigRect.mTop = mThumbRect.mTop; @@ -255,7 +255,7 @@ BOOL LLScrollbar::handleHover(S32 x, S32 y, MASK mask) // because they'll capture the mouse whenever they need hover events. BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { S32 height = mRect.getHeight(); S32 width = mRect.getWidth(); @@ -408,9 +408,9 @@ BOOL LLScrollbar::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, BOOL LLScrollbar::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } else @@ -442,7 +442,7 @@ void LLScrollbar::draw() screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &local_mouse_x, &local_mouse_y); BOOL other_captor = gFocusMgr.getMouseCapture() && gFocusMgr.getMouseCapture() != this; - BOOL hovered = mEnabled && !other_captor && (gFocusMgr.getMouseCapture() == this || mThumbRect.pointInRect(local_mouse_x, local_mouse_y)); + BOOL hovered = mEnabled && !other_captor && (hasMouseCapture() || mThumbRect.pointInRect(local_mouse_x, local_mouse_y)); if (hovered) { mCurGlowStrength = lerp(mCurGlowStrength, mHoverGlowStrength, LLCriticalDamp::getInterpolant(0.05f)); diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index 15bb8e3f24..e5e31e45a9 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -437,7 +437,7 @@ void LLScrollableContainerView::draw() // auto-focus when scrollbar active // this allows us to capture user intent (i.e. stop automatically scrolling the view/etc) if (!gFocusMgr.childHasKeyboardFocus(this) && - (gFocusMgr.getMouseCapture() == mScrollbar[VERTICAL] || gFocusMgr.getMouseCapture() == mScrollbar[HORIZONTAL])) + (mScrollbar[VERTICAL]->hasMouseCapture() || mScrollbar[HORIZONTAL]->hasMouseCapture())) { focusFirstItem(); } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 35d5affa5d..98dddfb542 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -29,8 +29,11 @@ #include "llwindow.h" #include "llcontrol.h" #include "llkeyboard.h" +#include "llresizebar.h" const S32 LIST_BORDER_PAD = 2; // white space inside the border and to the left of the scrollbar +const S32 MIN_COLUMN_WIDTH = 20; +const S32 LIST_SNAP_PADDING = 5; // local structures & classes. struct SortScrollListItem @@ -254,7 +257,7 @@ LLScrollListItem::~LLScrollListItem() std::for_each(mColumns.begin(), mColumns.end(), DeletePointer()); } -BOOL LLScrollListItem::handleMouseDown(S32 x, S32 y, MASK mask) +BOOL LLScrollListItem::handleClick(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; @@ -355,14 +358,13 @@ LLScrollListCtrl::LLScrollListCtrl(const LLString& name, const LLRect& rect, mPageLines(0), mHeadingHeight(20), mMaxSelectable(0), - mHeadingFont(NULL), mAllowMultipleSelection( allow_multiple_selection ), mAllowKeyboardMovement(TRUE), mCommitOnKeyboardMovement(TRUE), mCommitOnSelectionChange(FALSE), mSelectionChanged(FALSE), mCanSelect(TRUE), - mDisplayColumnButtons(FALSE), + mDisplayColumnHeaders(FALSE), mCollapseEmptyColumns(FALSE), mIsPopup(FALSE), mMaxItemCount(INT_MAX), @@ -377,21 +379,20 @@ LLScrollListCtrl::LLScrollListCtrl(const LLString& name, const LLRect& rect, mFgUnselectedColor( LLUI::sColorsGroup->getColor("ScrollUnselectedColor") ), mFgDisabledColor( LLUI::sColorsGroup->getColor("ScrollDisabledColor") ), mHighlightedColor( LLUI::sColorsGroup->getColor("ScrollHighlightedColor") ), + mHighlightedItem(-1), mBorderThickness( 2 ), mOnDoubleClickCallback( NULL ), mOnMaximumSelectCallback( NULL ), mOnSortChangedCallback( NULL ), - mHighlightedItem(-1), + mDrewSelected(FALSE), mBorder(NULL), - mDefaultColumn("SIMPLE"), mSearchColumn(0), + mDefaultColumn("SIMPLE"), mNumDynamicWidthColumns(0), mTotalStaticColumnWidth(0), - mSortColumn(0), - mSortAscending(TRUE), - - mDrewSelected(FALSE) + mSortColumn(-1), + mSortAscending(TRUE) { mItemListRect.setOriginAndSize( mBorderThickness + LIST_BORDER_PAD, @@ -478,6 +479,7 @@ void LLScrollListCtrl::clearRows() mScrollLines = 0; mLastSelected = NULL; + updateMaxContentWidth(NULL); } @@ -527,7 +529,6 @@ S32 LLScrollListCtrl::getFirstSelectedIndex() return -1; } - LLScrollListItem* LLScrollListCtrl::getFirstData() const { if (mItemList.size() == 0) @@ -537,6 +538,15 @@ LLScrollListItem* LLScrollListCtrl::getFirstData() const return mItemList[0]; } +LLScrollListItem* LLScrollListCtrl::getLastData() const +{ + if (mItemList.size() == 0) + { + return NULL; + } + return mItemList[mItemList.size() - 1]; +} + std::vector<LLScrollListItem*> LLScrollListCtrl::getAllData() const { std::vector<LLScrollListItem*> ret; @@ -554,7 +564,7 @@ void LLScrollListCtrl::reshape( S32 width, S32 height, BOOL called_from_parent ) { LLUICtrl::reshape( width, height, called_from_parent ); - S32 heading_size = (mDisplayColumnButtons ? mHeadingHeight : 0); + S32 heading_size = (mDisplayColumnHeaders ? mHeadingHeight : 0); mItemListRect.setOriginAndSize( mBorderThickness + LIST_BORDER_PAD, @@ -567,10 +577,8 @@ void LLScrollListCtrl::reshape( S32 width, S32 height, BOOL called_from_parent ) mScrollbar->setPageSize( mPageLines ); updateColumns(); - updateColumnButtons(); } - // Attempt to size the control to show all items. // Do not make larger than width or height. void LLScrollListCtrl::arrange(S32 max_width, S32 max_height) @@ -623,14 +631,56 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos ) updateLineHeight(); mPageLines = mLineHeight ? mItemListRect.getHeight() / mLineHeight : 0; - mScrollbar->setVisible(mPageLines < getItemCount()); + BOOL scrollbar_visible = mPageLines < getItemCount(); + + if (scrollbar_visible != mScrollbar->getVisible()) + { + mScrollbar->setVisible(mPageLines < getItemCount()); + updateColumns(); + } mScrollbar->setPageSize( mPageLines ); mScrollbar->setDocSize( getItemCount() ); + + updateMaxContentWidth(item); } + return not_too_big; } +void LLScrollListCtrl::updateMaxContentWidth(LLScrollListItem* added_item) +{ + const S32 HEADING_TEXT_PADDING = 30; + const S32 COLUMN_TEXT_PADDING = 20; + + std::map<LLString, LLScrollListColumn>::iterator column_itor; + for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) + { + LLScrollListColumn* column = &column_itor->second; + + if (!added_item) + { + // update on all items + column->mMaxContentWidth = column->mHeader ? LLFontGL::sSansSerifSmall->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0; + item_list::iterator iter; + for (iter = mItemList.begin(); iter != mItemList.end(); iter++) + { + LLScrollListCell* cellp = (*iter)->getColumn(column->mIndex); + if (!cellp) continue; + + column->mMaxContentWidth = llmax(LLFontGL::sSansSerifSmall->getWidth(cellp->getText()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth); + } + } + else + { + LLScrollListCell* cellp = added_item->getColumn(column->mIndex); + if (!cellp) continue; + + column->mMaxContentWidth = llmax(LLFontGL::sSansSerifSmall->getWidth(cellp->getText()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth); + } + } +} + // Line height is the max height of all the cells in all the items. void LLScrollListCtrl::updateLineHeight() @@ -659,60 +709,82 @@ void LLScrollListCtrl::updateColumns() for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) { LLScrollListColumn *column = &column_itor->second; + S32 new_width = column->mWidth; if (column->mRelWidth >= 0) { - column->mWidth = (S32)llround(column->mRelWidth*mItemListRect.getWidth()); + new_width = (S32)llround(column->mRelWidth*mItemListRect.getWidth()); } else if (column->mDynamicWidth) { - column->mWidth = (mItemListRect.getWidth() - mTotalStaticColumnWidth) / mNumDynamicWidthColumns; - + new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth) / mNumDynamicWidthColumns; + } + + if (new_width != column->mWidth) + { + column->mWidth = new_width; } mColumnsIndexed[column_itor->second.mIndex] = column; } -} -void LLScrollListCtrl::updateColumnButtons() -{ - std::map<LLString, LLScrollListColumn>::iterator column_itor; - for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) + item_list::iterator iter; + for (iter = mItemList.begin(); iter != mItemList.end(); iter++) { - LLScrollListColumn* column = &column_itor->second; - LLButton *button = column->mButton; - - if (button) + LLScrollListItem *itemp = *iter; + S32 num_cols = itemp->getNumColumns(); + S32 i = 0; + for (LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i)) { - mColumnsIndexed[column->mIndex] = column; + if (i >= (S32)mColumnsIndexed.size()) break; + + cell->setWidth(mColumnsIndexed[i]->mWidth); + } + } + // update headers + std::vector<LLScrollListColumn*>::iterator column_ordered_it; + S32 left = mItemListRect.mLeft; + LLColumnHeader* last_header = NULL; + for (column_ordered_it = mColumnsIndexed.begin(); column_ordered_it != mColumnsIndexed.end(); ++column_ordered_it) + { + if ((*column_ordered_it)->mWidth <= 0) + { + // skip hidden columns + } + LLScrollListColumn* column = *column_ordered_it; + + if (column->mHeader) + { + last_header = column->mHeader; S32 top = mItemListRect.mTop; - S32 left = mItemListRect.mLeft; - { - std::map<LLString, LLScrollListColumn>::iterator itor; - for (itor = mColumns.begin(); itor != mColumns.end(); ++itor) - { - if (itor->second.mIndex < column->mIndex && - itor->second.mWidth > 0) - { - left += itor->second.mWidth + mColumnPadding; - } - } - } - S32 right = left+column->mWidth; - if (column->mIndex != (S32)mColumns.size()-1) + S32 right = left + column->mWidth; + + if (column->mIndex != (S32)mColumnsIndexed.size()-1) { right += mColumnPadding; } - LLRect temp_rect = LLRect(left,top+mHeadingHeight,right,top); - button->setRect(temp_rect); - button->setFont(mHeadingFont); - button->setVisible(mDisplayColumnButtons); + right = llmax(left, llmin(mItemListRect.getWidth(), right)); + + S32 header_width = right - left; + + last_header->reshape(header_width, mHeadingHeight); + last_header->translate(left - last_header->getRect().mLeft, top - last_header->getRect().mBottom); + last_header->setVisible(mDisplayColumnHeaders && header_width > 0); + left = right; } } + + // expand last column header we encountered to full list width + if (last_header) + { + S32 header_strip_width = mItemListRect.getWidth() + (mScrollbar->getVisible() ? 0 : SCROLLBAR_SIZE); + S32 new_width = llmax(0, mItemListRect.mLeft + header_strip_width - last_header->getRect().mLeft); + last_header->reshape(new_width, last_header->getRect().getHeight()); + } } void LLScrollListCtrl::setDisplayHeading(BOOL display) { - mDisplayColumnButtons = display; + mDisplayColumnHeaders = display; updateColumns(); @@ -726,15 +798,7 @@ void LLScrollListCtrl::setHeadingHeight(S32 heading_height) reshape(mRect.getWidth(), mRect.getHeight()); // Resize - mScrollbar->reshape(SCROLLBAR_SIZE, mItemListRect.getHeight()); - - updateColumnButtons(); -} - -void LLScrollListCtrl::setHeadingFont(const LLFontGL* heading_font) -{ - mHeadingFont = heading_font; - updateColumnButtons(); + mScrollbar->reshape(SCROLLBAR_SIZE, mItemListRect.getHeight() + (mDisplayColumnHeaders ? mHeadingHeight : 0)); } void LLScrollListCtrl::setCollapseEmptyColumns(BOOL collapse) @@ -854,6 +918,7 @@ void LLScrollListCtrl::deleteSingleItem(S32 target_index) } delete itemp; mItemList.erase(mItemList.begin() + target_index); + updateMaxContentWidth(NULL); } void LLScrollListCtrl::deleteSelectedItems() @@ -873,6 +938,7 @@ void LLScrollListCtrl::deleteSelectedItems() } } mLastSelected = NULL; + updateMaxContentWidth(NULL); } void LLScrollListCtrl::highlightNthItem(S32 target_index) @@ -880,6 +946,7 @@ void LLScrollListCtrl::highlightNthItem(S32 target_index) if (mHighlightedItem != target_index) { mHighlightedItem = target_index; + llinfos << "Highlighting item " << target_index << llendl; } } @@ -1467,109 +1534,154 @@ BOOL LLScrollListCtrl::handleScrollWheel(S32 x, S32 y, S32 clicks) return handled; } - -BOOL LLScrollListCtrl::handleMouseDown(S32 x, S32 y, MASK mask) +BOOL LLScrollListCtrl::selectItemAt(S32 x, S32 y, MASK mask) { - BOOL handled = LLView::childrenHandleMouseDown(x, y, mask) != NULL; + if (!mCanSelect) return FALSE; - // set keyboard focus first, in case click action wants to move focus elsewhere - setFocus(TRUE); + BOOL selection_changed = FALSE; - if( !handled && mCanSelect) + LLScrollListItem* hit_item = hitItem(x, y); + if( hit_item ) { - LLScrollListItem* hit_item = hitItem(x, y); - if( hit_item ) + if( mAllowMultipleSelection ) { - if( mAllowMultipleSelection ) + if (mask & MASK_SHIFT) { - if (mask & MASK_SHIFT) + if (mLastSelected == NULL) { - if (mLastSelected == NULL) - { - selectItem(hit_item); - } - else + selectItem(hit_item); + } + else + { + // Select everthing between mLastSelected and hit_item + bool selecting = false; + item_list::iterator itor; + // If we multiselect backwards, we'll stomp on mLastSelected, + // meaning that we never stop selecting until hitting max or + // the end of the list. + LLScrollListItem* lastSelected = mLastSelected; + for (itor = mItemList.begin(); itor != mItemList.end(); ++itor) { - // Select everthing between mLastSelected and hit_item - bool selecting = false; - item_list::iterator itor; - // If we multiselect backwards, we'll stomp on mLastSelected, - // meaning that we never stop selecting until hitting max or - // the end of the list. - LLScrollListItem* lastSelected = mLastSelected; - for (itor = mItemList.begin(); itor != mItemList.end(); ++itor) + if(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable) { - if(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable) - { - if(mOnMaximumSelectCallback) - { - mOnMaximumSelectCallback(mCallbackUserData); - } - break; - } - LLScrollListItem *item = *itor; - if (item == hit_item || item == lastSelected) - { - selectItem(item, FALSE); - selecting = !selecting; - } - if (selecting) + if(mOnMaximumSelectCallback) { - selectItem(item, FALSE); + mOnMaximumSelectCallback(mCallbackUserData); } + break; + } + LLScrollListItem *item = *itor; + if (item == hit_item || item == lastSelected) + { + selectItem(item, FALSE); + selecting = !selecting; + } + if (selecting) + { + selectItem(item, FALSE); } } } - else if (mask & MASK_CONTROL) + } + else if (mask & MASK_CONTROL) + { + if (hit_item->getSelected()) { - if (hit_item->getSelected()) + deselectItem(hit_item); + } + else + { + if(!(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable)) { - deselectItem(hit_item); + selectItem(hit_item, FALSE); } else { - if(!(mMaxSelectable > 0 && getAllSelected().size() >= mMaxSelectable)) + if(mOnMaximumSelectCallback) { - selectItem(hit_item, FALSE); - } - else - { - if(mOnMaximumSelectCallback) - { - mOnMaximumSelectCallback(mCallbackUserData); - } + mOnMaximumSelectCallback(mCallbackUserData); } } } - else - { - deselectAllItems(TRUE); - selectItem(hit_item); - } } else { + deselectAllItems(TRUE); selectItem(hit_item); } - - hit_item->handleMouseDown(x - mBorderThickness - LIST_BORDER_PAD, - 1, mask); - // always commit on mousedown - onCommit(); - mSelectionChanged = FALSE; - - // clear search string on mouse operations - mSearchString.clear(); } else { - mLastSelected = NULL; + selectItem(hit_item); } + + hit_item->handleClick(x - mBorderThickness - LIST_BORDER_PAD, + 1, mask); + + selection_changed = mSelectionChanged; + if (mCommitOnSelectionChange) + { + commitIfChanged(); + } + + // clear search string on mouse operations + mSearchString.clear(); + } + else + { + //mLastSelected = NULL; + //deselectAllItems(TRUE); + } + + return selection_changed; +} + + +BOOL LLScrollListCtrl::handleMouseDown(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLView::childrenHandleMouseDown(x, y, mask) != NULL; + + if( !handled ) + { + // set keyboard focus first, in case click action wants to move focus elsewhere + setFocus(TRUE); + + // clear selection changed flag so because user is starting a selection operation + mSelectionChanged = FALSE; + + gFocusMgr.setMouseCapture(this); + selectItemAt(x, y, mask); } return TRUE; } +BOOL LLScrollListCtrl::handleMouseUp(S32 x, S32 y, MASK mask) +{ + if (hasMouseCapture()) + { + if(mask == MASK_NONE) + { + selectItemAt(x, y, mask); + } + } + + if (hasMouseCapture()) + { + gFocusMgr.setMouseCapture(NULL); + } + + // always commit when mouse operation is completed inside list + // this only needs to be done for lists that don't commit on selection change + if (!mCommitOnSelectionChange && pointInView(x,y)) + { + mSelectionChanged = FALSE; + onCommit(); + } + + return LLUICtrl::handleMouseUp(x, y, mask); +} + BOOL LLScrollListCtrl::handleDoubleClick(S32 x, S32 y, MASK mask) { //BOOL handled = FALSE; @@ -1628,31 +1740,35 @@ BOOL LLScrollListCtrl::handleHover(S32 x,S32 y,MASK mask) { BOOL handled = FALSE; - if(getVisible()) + if (hasMouseCapture()) { - if (mCanSelect) + if(mask == MASK_NONE) { - LLScrollListItem* item = hitItem(x, y); - if (item) - { - highlightNthItem(getItemIndex(item)); - } - else - { - highlightNthItem(-1); - } + selectItemAt(x, y, mask); } - - handled = LLView::handleHover( x, y, mask ); - - if( !handled ) + } + else if (mCanSelect) + { + LLScrollListItem* item = hitItem(x, y); + if (item) + { + highlightNthItem(getItemIndex(item)); + } + else { - // Opaque - getWindow()->setCursor(UI_CURSOR_ARROW); - lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << llendl; - handled = TRUE; + highlightNthItem(-1); } } + + handled = LLUICtrl::handleHover( x, y, mask ); + + //if( !handled ) + //{ + // // Opaque + // getWindow()->setCursor(UI_CURSOR_ARROW); + // lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << llendl; + // handled = TRUE; + //} return handled; } @@ -1954,7 +2070,7 @@ void LLScrollListCtrl::deselectItem(LLScrollListItem* itemp) void LLScrollListCtrl::commitIfChanged() { - if (mSelectionChanged) + if (mSelectionChanged && !hasMouseCapture()) { mSelectionChanged = FALSE; onCommit(); @@ -1973,9 +2089,18 @@ void LLScrollListCtrl::onScrollChange( S32 new_pos, LLScrollbar* scrollbar, void // First column is column 0 void LLScrollListCtrl::sortByColumn(U32 column, BOOL ascending) { - mSortColumn = column; - mSortAscending = ascending; - std::sort(mItemList.begin(), mItemList.end(), SortScrollListItem(mSortColumn, mSortAscending)); + if (mSortColumn != column) + { + mSortColumn = column; + std::sort(mItemList.begin(), mItemList.end(), SortScrollListItem(mSortColumn, mSortAscending)); + } + + // just reverse the list if changing sort order + if(mSortAscending != ascending) + { + std::reverse(mItemList.begin(), mItemList.end()); + mSortAscending = ascending; + } } void LLScrollListCtrl::sortByColumn(LLString name, BOOL ascending) @@ -2047,7 +2172,7 @@ LLXMLNodePtr LLScrollListCtrl::getXML(bool save_children) const node->createChild("draw_border", TRUE)->setBoolValue((mBorder != NULL)); - node->createChild("draw_heading", TRUE)->setBoolValue(mDisplayColumnButtons); + node->createChild("draw_heading", TRUE)->setBoolValue(mDisplayColumnHeaders); node->createChild("background_visible", TRUE)->setBoolValue(mBackgroundVisible); @@ -2196,13 +2321,6 @@ LLView* LLScrollListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFac node->getAttributeS32("heading_height", heading_height); scroll_list->setHeadingHeight(heading_height); } - if (node->hasAttribute("heading_font")) - { - LLString heading_font(""); - node->getAttributeString("heading_font", heading_font); - LLFontGL* gl_font = LLFontGL::fontFromName(heading_font.c_str()); - scroll_list->setHeadingFont(gl_font); - } scroll_list->setCollapseEmptyColumns(collapse_empty_columns); scroll_list->setScrollListParameters(node); @@ -2408,7 +2526,7 @@ BOOL LLScrollListCtrl::canDeselect() void LLScrollListCtrl::addColumn(const LLSD& column, EAddPosition pos) { LLString name = column["name"].asString(); - if (mColumns.size() == 0) + if (mColumns.empty()) { mDefaultColumn = 0; } @@ -2451,30 +2569,28 @@ void LLScrollListCtrl::addColumn(const LLSD& column, EAddPosition pos) right += mColumnPadding; } LLRect temp_rect = LLRect(left,top+mHeadingHeight,right,top); - new_column->mButton = new LLSquareButton(button_name, temp_rect, "", mHeadingFont, "", onClickColumn, NULL); + new_column->mHeader = new LLColumnHeader(button_name, temp_rect, new_column); if(column["image"].asString() != "") { - //new_column->mButton->setScaleImage(false); - new_column->mButton->setImageSelected(column["image"].asString()); - new_column->mButton->setImageUnselected(column["image"].asString()); + //new_column->mHeader->setScaleImage(false); + new_column->mHeader->setImage(column["image"].asString()); } else { - new_column->mButton->setLabelSelected(new_column->mLabel); - new_column->mButton->setLabelUnselected(new_column->mLabel); + new_column->mHeader->setLabel(new_column->mLabel); + //new_column->mHeader->setLabel(new_column->mLabel); } //RN: although it might be useful to change sort order with the keyboard, // mixing tab stops on child items along with the parent item is not supported yet - new_column->mButton->setTabStop(FALSE); - addChild(new_column->mButton); - new_column->mButton->setVisible(mDisplayColumnButtons); + new_column->mHeader->setTabStop(FALSE); + addChild(new_column->mHeader); + new_column->mHeader->setVisible(mDisplayColumnHeaders); // Move scroll to front removeChild(mScrollbar); addChild(mScrollbar); - - new_column->mButton->setCallbackUserData(new_column); + } } updateColumns(); @@ -2517,7 +2633,7 @@ void LLScrollListCtrl::onClickColumn(void *userdata) std::string LLScrollListCtrl::getSortColumnName() { - LLScrollListColumn* column = mColumnsIndexed[mSortColumn]; + LLScrollListColumn* column = mSortColumn >= 0 ? mColumnsIndexed[mSortColumn] : NULL; if (column) return column->mName; else return ""; @@ -2528,11 +2644,11 @@ void LLScrollListCtrl::clearColumns() std::map<LLString, LLScrollListColumn>::iterator itor; for (itor = mColumns.begin(); itor != mColumns.end(); ++itor) { - LLButton *button = itor->second.mButton; - if (button) + LLColumnHeader *header = itor->second.mHeader; + if (header) { - removeChild(button); - delete button; + removeChild(header); + delete header; } } mColumns.clear(); @@ -2544,14 +2660,22 @@ void LLScrollListCtrl::setColumnLabel(const LLString& column, const LLString& la if (itor != mColumns.end()) { itor->second.mLabel = label; - if (itor->second.mButton) + if (itor->second.mHeader) { - itor->second.mButton->setLabelSelected(label); - itor->second.mButton->setLabelUnselected(label); + itor->second.mHeader->setLabel(label); } } } +LLScrollListColumn* LLScrollListCtrl::getColumn(S32 index) +{ + if (index < 0 || index >= (S32)mColumnsIndexed.size()) + { + return NULL; + } + return mColumnsIndexed[index]; +} + void LLScrollListCtrl::setColumnHeadings(LLSD headings) { mColumns.clear(); @@ -2629,6 +2753,10 @@ LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& value, EAddPosition p else { new_item->setColumn(index, new LLScrollListText(value.asString(), font, width, font_style, font_alignment)); + if (column_itor->second.mHeader && !value.asString().empty()) + { + column_itor->second.mHeader->setHasResizableElement(TRUE); + } } } @@ -2725,6 +2853,14 @@ void LLScrollListCtrl::setFocus(BOOL b) } LLUICtrl::setFocus(b); } + +//virtual +void LLScrollListCtrl::onFocusReceived() +{ + // forget latent selection changes when getting focus + mSelectionChanged = FALSE; +} + //virtual void LLScrollListCtrl::onFocusLost() { @@ -2735,5 +2871,433 @@ void LLScrollListCtrl::onFocusLost() getParent()->onFocusLost(); } } + if (hasMouseCapture()) + { + gFocusMgr.setMouseCapture(NULL); + } + LLUICtrl::onFocusLost(); +} + +LLColumnHeader::LLColumnHeader(const LLString& label, const LLRect &rect, LLScrollListColumn* column, const LLFontGL* fontp) : + LLComboBox(label, rect, label, NULL, NULL), + mColumn(column), + mOrigLabel(label), + mShowSortOptions(FALSE), + mHasResizableElement(FALSE) +{ + mListPosition = LLComboBox::ABOVE; + setCommitCallback(onSelectSort); + setCallbackUserData(this); + mButton->setTabStop(FALSE); + // require at least two frames between mouse down and mouse up event to capture intentional "hold" not just bad framerate + mButton->setHeldDownDelay(LLUI::sConfigGroup->getF32("ColumnHeaderDropDownDelay"), 2); + mButton->setHeldDownCallback(onHeldDown); + mButton->setClickedCallback(onClick); + mButton->setMouseDownCallback(onMouseDown); + + mButton->setCallbackUserData(this); + + mAscendingText = "[LOW]...[HIGH](Ascending)"; + mDescendingText = "[HIGH]...[LOW](Descending)"; + + LLSD row; + row["columns"][0]["column"] = "label"; + row["columns"][0]["value"] = mAscendingText.getString(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = 80; + + row["columns"][1]["column"] = "arrow"; + row["columns"][1]["type"] = "icon"; + row["columns"][1]["value"] = LLUI::sAssetsGroup->getString("up_arrow.tga"); + row["columns"][1]["width"] = 20; + + mList->addElement(row); + + row["columns"][0]["column"] = "label"; + row["columns"][0]["type"] = "text"; + row["columns"][0]["value"] = mDescendingText.getString(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = 80; + + row["columns"][1]["column"] = "arrow"; + row["columns"][1]["type"] = "icon"; + row["columns"][1]["value"] = LLUI::sAssetsGroup->getString("down_arrow.tga"); + row["columns"][1]["width"] = 20; + + mList->addElement(row); + + mList->reshape(llmax(mList->getRect().getWidth(), 110, mRect.getWidth()), mList->getRect().getHeight()); + + // resize handles on left and right + const S32 RESIZE_BAR_THICKNESS = 3; + mResizeBar = new LLResizeBar( + "resizebar", + LLRect( mRect.getWidth() - RESIZE_BAR_THICKNESS, mRect.getHeight(), mRect.getWidth(), 0), + MIN_COLUMN_WIDTH, mRect.getHeight(), LLResizeBar::RIGHT ); + addChild(mResizeBar); + + mResizeBar->setEnabled(FALSE); +} + +LLColumnHeader::~LLColumnHeader() +{ +} + +void LLColumnHeader::draw() +{ + if( getVisible() ) + { + mDrawArrow = !mColumn->mLabel.empty() && mColumn->mParentCtrl->getSortColumnName() == mColumn->mSortingColumn; + + BOOL is_ascending = mColumn->mParentCtrl->getSortAscending(); + mArrowImage = is_ascending ? LLUI::sImageProvider->getUIImageByID(LLUUID(LLUI::sAssetsGroup->getString("up_arrow.tga"))) + : LLUI::sImageProvider->getUIImageByID(LLUUID(LLUI::sAssetsGroup->getString("down_arrow.tga"))); + + //BOOL clip = mRect.mRight > mColumn->mParentCtrl->getItemListRect().getWidth(); + //LLGLEnable scissor_test(clip ? GL_SCISSOR_TEST : GL_FALSE); + + //LLRect column_header_local_rect(-mRect.mLeft, mRect.getHeight(), mColumn->mParentCtrl->getItemListRect().getWidth() - mRect.mLeft, 0); + //LLUI::setScissorRegionLocal(column_header_local_rect); + + // Draw children + LLComboBox::draw(); + + if (mList->getVisible()) + { + // sync sort order with list selection every frame + mColumn->mParentCtrl->sortByColumn(mColumn->mSortingColumn, getCurrentIndex() == 0); + } + + } +} + +BOOL LLColumnHeader::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + if (canResize() && mResizeBar->getRect().pointInRect(x, y)) + { + // reshape column to max content width + LLRect column_rect = getRect(); + column_rect.mRight = column_rect.mLeft + mColumn->mMaxContentWidth; + userSetShape(column_rect); + } + else + { + onClick(this); + } + return TRUE; +} + +void LLColumnHeader::setImage(const LLString &image_name) +{ + if (mButton) + { + mButton->setImageSelected(image_name); + mButton->setImageUnselected(image_name); + } +} + +//static +void LLColumnHeader::onClick(void* user_data) +{ + LLColumnHeader* headerp = (LLColumnHeader*)user_data; + if (!headerp) return; + + LLScrollListColumn* column = headerp->mColumn; + if (!column) return; + + if (headerp->mList->getVisible()) + { + headerp->hideList(); + } + + LLScrollListCtrl::onClickColumn(column); + + // propage new sort order to sort order list + headerp->mList->selectNthItem(column->mParentCtrl->getSortAscending() ? 0 : 1); +} + +//static +void LLColumnHeader::onMouseDown(void* user_data) +{ + // for now, do nothing but block the normal showList() behavior + return; +} + +//static +void LLColumnHeader::onHeldDown(void* user_data) +{ + LLColumnHeader* headerp = (LLColumnHeader*)user_data; + headerp->showList(); +} + +void LLColumnHeader::showList() +{ + if (mShowSortOptions) + { + //LLSD item_val = mColumn->mParentCtrl->getFirstData()->getValue(); + mOrigLabel = mButton->getLabelSelected(); + + // move sort column over to this column and do initial sort + mColumn->mParentCtrl->sortByColumn(mColumn->mSortingColumn, mColumn->mParentCtrl->getSortAscending()); + + LLString low_item_text; + LLString high_item_text; + + LLScrollListItem* itemp = mColumn->mParentCtrl->getFirstData(); + if (itemp) + { + LLScrollListCell* cell = itemp->getColumn(mColumn->mIndex); + if (cell && cell->isText()) + { + if (mColumn->mParentCtrl->getSortAscending()) + { + low_item_text = cell->getText(); + } + else + { + high_item_text = cell->getText(); + } + } + } + + itemp = mColumn->mParentCtrl->getLastData(); + if (itemp) + { + LLScrollListCell* cell = itemp->getColumn(mColumn->mIndex); + if (cell && cell->isText()) + { + if (mColumn->mParentCtrl->getSortAscending()) + { + high_item_text = cell->getText(); + } + else + { + low_item_text = cell->getText(); + } + } + } + + LLString::truncate(low_item_text, 3); + LLString::truncate(high_item_text, 3); + + LLString ascending_string; + LLString descending_string; + + if (low_item_text.empty() || high_item_text.empty()) + { + ascending_string = "Ascending"; + descending_string = "Descending"; + } + else + { + mAscendingText.setArg("[LOW]", low_item_text); + mAscendingText.setArg("[HIGH]", high_item_text); + mDescendingText.setArg("[LOW]", low_item_text); + mDescendingText.setArg("[HIGH]", high_item_text); + ascending_string = mAscendingText.getString(); + descending_string = mDescendingText.getString(); + } + + S32 text_width = LLFontGL::sSansSerifSmall->getWidth(ascending_string); + text_width = llmax(text_width, LLFontGL::sSansSerifSmall->getWidth(descending_string)) + 10; + text_width = llmax(text_width, mRect.getWidth() - 30); + + mList->getColumn(0)->mWidth = text_width; + ((LLScrollListText*)mList->getFirstData()->getColumn(0))->setText(ascending_string); + ((LLScrollListText*)mList->getLastData()->getColumn(0))->setText(descending_string); + + mList->reshape(llmax(text_width + 30, 110, mRect.getWidth()), mList->getRect().getHeight()); + + LLComboBox::showList(); + } } +//static +void LLColumnHeader::onSelectSort(LLUICtrl* ctrl, void* user_data) +{ + LLColumnHeader* headerp = (LLColumnHeader*)user_data; + if (!headerp) return; + + LLScrollListColumn* column = headerp->mColumn; + if (!column) return; + LLScrollListCtrl *parent = column->mParentCtrl; + if (!parent) return; + + if (headerp->getCurrentIndex() == 0) + { + // ascending + parent->sortByColumn(column->mSortingColumn, TRUE); + } + else + { + // descending + parent->sortByColumn(column->mSortingColumn, FALSE); + } + + // restore original column header + headerp->setLabel(headerp->mOrigLabel); +} + +LLView* LLColumnHeader::findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding) +{ + // this logic assumes dragging on right + llassert(snap_edge == SNAP_RIGHT); + + // use higher snap threshold for column headers + threshold = llmin(threshold, 15); + + LLRect snap_rect = getSnapRect(); + + S32 snap_delta = mColumn->mMaxContentWidth - snap_rect.getWidth(); + + // x coord growing means column growing, so same signs mean we're going in right direction + if (llabs(snap_delta) <= threshold && mouse_dir.mX * snap_delta > 0 ) + { + new_edge_val = snap_rect.mRight + snap_delta; + } + else + { + LLScrollListColumn* next_column = mColumn->mParentCtrl->getColumn(mColumn->mIndex + 1); + while (next_column) + { + if (next_column->mHeader) + { + snap_delta = (next_column->mHeader->getSnapRect().mRight - next_column->mMaxContentWidth) - snap_rect.mRight; + if (llabs(snap_delta) <= threshold && mouse_dir.mX * snap_delta > 0 ) + { + new_edge_val = snap_rect.mRight + snap_delta; + } + break; + } + next_column = mColumn->mParentCtrl->getColumn(next_column->mIndex + 1); + } + } + + return this; +} + +void LLColumnHeader::userSetShape(const LLRect& new_rect) +{ + S32 new_width = new_rect.getWidth(); + S32 delta_width = new_width - (mRect.getWidth() + mColumn->mParentCtrl->getColumnPadding()); + + if (delta_width != 0) + { + S32 remaining_width = delta_width; + S32 col; + for (col = mColumn->mIndex + 1; col < mColumn->mParentCtrl->getNumColumns(); col++) + { + LLScrollListColumn* columnp = mColumn->mParentCtrl->getColumn(col); + if (!columnp) break; + + if (columnp->mHeader && columnp->mHeader->canResize()) + { + // how many pixels in width can this column afford to give up? + S32 resize_buffer_amt = llmax(0, columnp->mWidth - MIN_COLUMN_WIDTH); + + // user shrinking column, need to add width to other columns + if (delta_width < 0) + { + if (!columnp->mDynamicWidth && columnp->mWidth > 0) + { + // statically sized column, give all remaining width to this column + columnp->mWidth -= remaining_width; + if (columnp->mRelWidth > 0.f) + { + columnp->mRelWidth = (F32)columnp->mWidth / (F32)mColumn->mParentCtrl->getItemListRect().getWidth(); + } + } + break; + } + else + { + // user growing column, need to take width from other columns + remaining_width -= resize_buffer_amt; + + if (!columnp->mDynamicWidth && columnp->mWidth > 0) + { + columnp->mWidth -= llmin(columnp->mWidth - MIN_COLUMN_WIDTH, delta_width); + if (columnp->mRelWidth > 0.f) + { + columnp->mRelWidth = (F32)columnp->mWidth / (F32)mColumn->mParentCtrl->getItemListRect().getWidth(); + } + } + + if (remaining_width <= 0) + { + // width sucked up from neighboring columns, done + break; + } + } + } + } + + // clamp resize amount to maximum that can be absorbed by other columns + if (delta_width > 0) + { + delta_width -= llmax(remaining_width, 0); + } + + // propagate constrained delta_width to new width for this column + new_width = mRect.getWidth() + delta_width - mColumn->mParentCtrl->getColumnPadding(); + + // use requested width + mColumn->mWidth = new_width; + + // update proportional spacing + if (mColumn->mRelWidth > 0.f) + { + mColumn->mRelWidth = (F32)new_width / (F32)mColumn->mParentCtrl->getItemListRect().getWidth(); + } + + // tell scroll list to layout columns again + mColumn->mParentCtrl->updateColumns(); + } +} + +void LLColumnHeader::setHasResizableElement(BOOL resizable) +{ + // for now, dynamically spaced columns can't be resized + if (mColumn->mDynamicWidth) return; + + if (resizable != mHasResizableElement) + { + mHasResizableElement = resizable; + + S32 num_resizable_columns = 0; + S32 col; + for (col = 0; col < mColumn->mParentCtrl->getNumColumns(); col++) + { + LLScrollListColumn* columnp = mColumn->mParentCtrl->getColumn(col); + if (columnp->mHeader && columnp->mHeader->canResize()) + { + num_resizable_columns++; + } + } + + S32 num_resizers_enabled = 0; + + // now enable/disable resize handles on resizable columns if we have at least two + for (col = 0; col < mColumn->mParentCtrl->getNumColumns(); col++) + { + LLScrollListColumn* columnp = mColumn->mParentCtrl->getColumn(col); + if (!columnp->mHeader) continue; + BOOL enable = num_resizable_columns >= 2 && num_resizers_enabled < (num_resizable_columns - 1) && columnp->mHeader->canResize(); + columnp->mHeader->enableResizeBar(enable); + if (enable) + { + num_resizers_enabled++; + } + } + } +} + +void LLColumnHeader::enableResizeBar(BOOL enable) +{ + mResizeBar->setEnabled(enable); +} + +BOOL LLColumnHeader::canResize() +{ + return getVisible() && (mHasResizableElement || mColumn->mDynamicWidth); +} diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 9c16e4dff9..99218ab3c4 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -23,9 +23,12 @@ #include "llviewborder.h" #include "llframetimer.h" #include "llcheckboxctrl.h" +#include "llcombobox.h" class LLScrollbar; class LLScrollListCtrl; +class LLColumnHeader; +class LLResizeBar; class LLScrollListCell { @@ -39,6 +42,7 @@ public: virtual const BOOL getVisible() const { return TRUE; } virtual void setWidth(S32 width) = 0; virtual void highlightText(S32 offset, S32 num_chars) {} + virtual BOOL isText() = 0; virtual BOOL handleClick() { return FALSE; } virtual void setEnabled(BOOL enable) { } @@ -58,6 +62,7 @@ public: virtual const BOOL getVisible() const { return mVisible; } virtual void highlightText(S32 offset, S32 num_chars) {mHighlightOffset = offset; mHighlightCount = num_chars;} void setText(const LLString& text); + virtual BOOL isText() { return TRUE; } private: LLUIString mText; @@ -86,6 +91,7 @@ public: virtual const LLString& getText() const { return mImageUUID; } virtual const LLString& getTextLower() const { return mImageUUID; } virtual void setWidth(S32 width) { mWidth = width; } + virtual BOOL isText() { return FALSE; } private: LLPointer<LLImageGL> mIcon; @@ -107,6 +113,7 @@ public: virtual void setEnabled(BOOL enable) { if (mCheckBox) mCheckBox->setEnabled(enable); } LLCheckBoxCtrl* getCheckBox() { return mCheckBox; } + virtual BOOL isText() { return FALSE; } private: LLCheckBoxCtrl* mCheckBox; @@ -117,14 +124,37 @@ class LLScrollListColumn { public: // Default constructor - LLScrollListColumn() : mName(""), mSortingColumn(""), mLabel(""), mWidth(-1), mRelWidth(-1.0), mDynamicWidth(FALSE), mIndex(-1), mParentCtrl(NULL), mButton(NULL), mFontAlignment(LLFontGL::LEFT) + LLScrollListColumn() : + mName(""), + mSortingColumn(""), + mLabel(""), + mWidth(-1), + mRelWidth(-1.0), + mDynamicWidth(FALSE), + mMaxContentWidth(0), + mIndex(-1), + mParentCtrl(NULL), + mHeader(NULL), + mFontAlignment(LLFontGL::LEFT) { } - LLScrollListColumn(LLString name, LLString label, S32 width, F32 relwidth) - : mName(name), mSortingColumn(name), mLabel(label), mWidth(width), mRelWidth(relwidth), mDynamicWidth(FALSE), mIndex(-1), mParentCtrl(NULL), mButton(NULL) { } + LLScrollListColumn(LLString name, LLString label, S32 width, F32 relwidth) : + mName(name), + mSortingColumn(name), + mLabel(label), + mWidth(width), + mRelWidth(relwidth), + mDynamicWidth(FALSE), + mMaxContentWidth(0), + mIndex(-1), + mParentCtrl(NULL), + mHeader(NULL) + { } LLScrollListColumn(const LLSD &sd) { + mMaxContentWidth = 0; + mName = sd.get("name").asString(); mSortingColumn = mName; if (sd.has("sort")) @@ -160,7 +190,7 @@ public: mIndex = -1; mParentCtrl = NULL; - mButton = NULL; + mHeader = NULL; } LLString mName; @@ -169,12 +199,47 @@ public: S32 mWidth; F32 mRelWidth; BOOL mDynamicWidth; + S32 mMaxContentWidth; S32 mIndex; LLScrollListCtrl* mParentCtrl; - LLButton* mButton; + LLColumnHeader* mHeader; LLFontGL::HAlign mFontAlignment; }; +class LLColumnHeader : public LLComboBox +{ +public: + LLColumnHeader(const LLString& label, const LLRect &rect, LLScrollListColumn* column, const LLFontGL *font = NULL); + ~LLColumnHeader(); + + /*virtual*/ void draw(); + /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + /*virtual*/ void showList(); + /*virtual*/ LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding); + /*virtual*/ void userSetShape(const LLRect& new_rect); + + void setImage(const LLString &image_name); + LLScrollListColumn* getColumn() { return mColumn; } + void setHasResizableElement(BOOL resizable); + BOOL canResize(); + void enableResizeBar(BOOL enable); + LLString getLabel() { return mOrigLabel; } + + static void onSelectSort(LLUICtrl* ctrl, void* user_data); + static void onClick(void* user_data); + static void onMouseDown(void* user_data); + static void onHeldDown(void* user_data); + +protected: + LLScrollListColumn* mColumn; + LLResizeBar* mResizeBar; + LLString mOrigLabel; + LLUIString mAscendingText; + LLUIString mDescendingText; + BOOL mShowSortOptions; + BOOL mHasResizableElement; +}; + class LLScrollListItem { public: @@ -216,7 +281,7 @@ public: LLScrollListCell *getColumn(const S32 i) const { if (i < (S32)mColumns.size()) { return mColumns[i]; } return NULL; } - virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleClick(S32 x, S32 y, MASK mask); LLString getContentsCSV(); @@ -263,6 +328,10 @@ public: virtual void addColumn(const LLSD& column, EAddPosition pos = ADD_BOTTOM); virtual void clearColumns(); virtual void setColumnLabel(const LLString& column, const LLString& label); + + virtual LLScrollListColumn* getColumn(S32 index); + virtual S32 getNumColumns() const { return mColumnsIndexed.size(); } + // Adds a single element, from an array of: // "columns" => [ "column" => column name, "value" => value, "type" => type, "font" => font, "font-style" => style ], "id" => uuid // Creates missing columns automatically. @@ -301,7 +370,8 @@ public: BOOL selectFirstItem(); BOOL selectNthItem( S32 index ); - + BOOL selectItemAt(S32 x, S32 y, MASK mask); + void deleteSingleItem( S32 index ) ; void deleteSelectedItems(); void deselectAllItems(BOOL no_commit_on_change = FALSE); // by default, go ahead and commit on selection change @@ -338,23 +408,6 @@ public: LLScrollListItem* addStringUUIDItem(const LLString& item_text, const LLUUID& id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE, S32 column_width = 0); LLUUID getStringUUIDSelectedItem(); - // "Full" interface: use this when you're creating a list that has one or more of the following: - // * contains icons - // * contains multiple columns - // * allows multiple selection - // * has items that are not guarenteed to have unique names - // * has additional per-item data (e.g. a UUID or void* userdata) - // - // To add items using this approach, create new LLScrollListItems and LLScrollListCells. Add the - // cells (column entries) to each item, and add the item to the LLScrollListCtrl. - // - // The LLScrollListCtrl owns its items and is responsible for deleting them - // (except in the case that the addItem() call fails, in which case it is up - // to the caller to delete the item) - - // returns FALSE if item faile to be added to list, does NOT delete 'item' - // TomY TODO - Deprecate this API and remove it - BOOL addItem( LLScrollListItem* item, EAddPosition pos = ADD_BOTTOM ); LLScrollListItem* getFirstSelected() const; virtual S32 getFirstSelectedIndex(); std::vector<LLScrollListItem*> getAllSelected() const; @@ -363,6 +416,7 @@ public: // iterate over all items LLScrollListItem* getFirstData() const; + LLScrollListItem* getLastData() const; std::vector<LLScrollListItem*> getAllData() const; void setAllowMultipleSelection(BOOL mult ) { mAllowMultipleSelection = mult; } @@ -379,6 +433,7 @@ public: void setBackgroundVisible(BOOL b) { mBackgroundVisible = b; } void setDrawStripes(BOOL b) { mDrawStripes = b; } void setColumnPadding(const S32 c) { mColumnPadding = c; } + S32 getColumnPadding() { return mColumnPadding; } void setCommitOnKeyboardMovement(BOOL b) { mCommitOnKeyboardMovement = b; } void setCommitOnSelectionChange(BOOL b) { mCommitOnSelectionChange = b; } void setAllowKeyboardMovement(BOOL b) { mAllowKeyboardMovement = b; } @@ -398,6 +453,7 @@ public: // Overridden from LLView virtual void draw(); virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); virtual BOOL handleHover(S32 x, S32 y, MASK mask); virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); @@ -405,6 +461,7 @@ public: virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); virtual void setEnabled(BOOL enabled); virtual void setFocus( BOOL b ); + virtual void onFocusReceived(); virtual void onFocusLost(); virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -412,17 +469,18 @@ public: virtual LLRect getRequiredRect(); static BOOL rowPreceeds(LLScrollListItem *new_row, LLScrollListItem *test_row); + LLRect getItemListRect() { return mItemListRect; } + // Used "internally" by the scroll bar. static void onScrollChange( S32 new_pos, LLScrollbar* src, void* userdata ); static void onClickColumn(void *userdata); void updateColumns(); - void updateColumnButtons(); + void updateMaxContentWidth(LLScrollListItem* changed_item); void setDisplayHeading(BOOL display); void setHeadingHeight(S32 heading_height); - void setHeadingFont(const LLFontGL* heading_font); void setCollapseEmptyColumns(BOOL collapse); void setIsPopup(BOOL is_popup) { mIsPopup = is_popup; } @@ -454,6 +512,22 @@ public: S32 selectMultiple( LLDynamicArray<LLUUID> ids ); protected: + // "Full" interface: use this when you're creating a list that has one or more of the following: + // * contains icons + // * contains multiple columns + // * allows multiple selection + // * has items that are not guarenteed to have unique names + // * has additional per-item data (e.g. a UUID or void* userdata) + // + // To add items using this approach, create new LLScrollListItems and LLScrollListCells. Add the + // cells (column entries) to each item, and add the item to the LLScrollListCtrl. + // + // The LLScrollListCtrl owns its items and is responsible for deleting them + // (except in the case that the addItem() call fails, in which case it is up + // to the caller to delete the item) + + // returns FALSE if item faile to be added to list, does NOT delete 'item' + BOOL addItem( LLScrollListItem* item, EAddPosition pos = ADD_BOTTOM ); void selectPrevItem(BOOL extend_selection); void selectNextItem(BOOL extend_selection); void drawItems(); @@ -473,7 +547,6 @@ protected: S32 mPageLines; // max number of lines is it possible to see on the screen given mRect and mLineHeight S32 mHeadingHeight; // the height of the column header buttons, if visible U32 mMaxSelectable; - const LLFontGL* mHeadingFont; // the font to use for column head buttons, if visible LLScrollbar* mScrollbar; BOOL mAllowMultipleSelection; BOOL mAllowKeyboardMovement; @@ -481,7 +554,7 @@ protected: BOOL mCommitOnSelectionChange; BOOL mSelectionChanged; BOOL mCanSelect; - BOOL mDisplayColumnButtons; + BOOL mDisplayColumnHeaders; BOOL mCollapseEmptyColumns; BOOL mIsPopup; @@ -525,8 +598,8 @@ protected: S32 mNumDynamicWidthColumns; S32 mTotalStaticColumnWidth; - U32 mSortColumn; - BOOL mSortAscending; + S32 mSortColumn; + BOOL mSortAscending; std::map<LLString, LLScrollListColumn> mColumns; std::vector<LLScrollListColumn*> mColumnsIndexed; diff --git a/indra/llui/llslider.cpp b/indra/llui/llslider.cpp index 2a1c2f7845..3a01013943 100644 --- a/indra/llui/llslider.cpp +++ b/indra/llui/llslider.cpp @@ -98,7 +98,7 @@ F32 LLSlider::getValueF32() const BOOL LLSlider::handleHover(S32 x, S32 y, MASK mask) { - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { S32 left_edge = THUMB_WIDTH/2; S32 right_edge = mRect.getWidth() - (THUMB_WIDTH/2); @@ -125,9 +125,9 @@ BOOL LLSlider::handleMouseUp(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); if( mMouseUpCallback ) { @@ -175,7 +175,7 @@ BOOL LLSlider::handleMouseDown(S32 x, S32 y, MASK mask) // Start dragging the thumb // No handler needed for focus lost since this class has no state that depends on it. - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mDragStartThumbRect = mThumbRect; } make_ui_sound("UISndClick"); @@ -242,12 +242,12 @@ void LLSlider::draw() if (!thumb_imagep) { gl_rect_2d(mThumbRect, mThumbCenterColor, TRUE); - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { gl_rect_2d(mDragStartThumbRect, mThumbCenterColor % opacity, FALSE); } } - else if( gFocusMgr.getMouseCapture() == this ) + else if( hasMouseCapture() ) { gl_draw_scaled_image_with_border(mDragStartThumbRect.mLeft, mDragStartThumbRect.mBottom, 16, 16, mDragStartThumbRect.getWidth(), mDragStartThumbRect.getHeight(), thumb_imagep, mThumbCenterColor % 0.3f, TRUE); diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp index 3079726434..b3c49e81f1 100644 --- a/indra/llui/llsliderctrl.cpp +++ b/indra/llui/llsliderctrl.cpp @@ -186,7 +186,7 @@ void LLSliderCtrl::clear() BOOL LLSliderCtrl::isMouseHeldDown() { - return gFocusMgr.getMouseCapture() == mSlider; + return mSlider->hasMouseCapture(); } void LLSliderCtrl::updateText() diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 4c1700175b..fbd8335e6c 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -316,8 +316,8 @@ void LLSpinCtrl::setTentative(BOOL b) BOOL LLSpinCtrl::isMouseHeldDown() { return - gFocusMgr.getMouseCapture() == mDownBtn || - gFocusMgr.getMouseCapture() == mUpBtn; + mDownBtn->hasMouseCapture() + || mUpBtn->hasMouseCapture(); } void LLSpinCtrl::onCommit() diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 1ba991f916..c412d77922 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -983,7 +983,7 @@ void LLTabContainer::updateMaxScrollPos() void LLTabContainer::commitHoveredButton(S32 x, S32 y) { - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { @@ -1244,7 +1244,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) if( tab_rect.pointInRect( x, y ) ) { LLButton* tab_button = mTabList[getCurrentPanelIndex()]->mButton; - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); gFocusMgr.setKeyboardFocus(tab_button, NULL); } } @@ -1307,7 +1307,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) commitHoveredButton(x, y); LLPanel* cur_panel = getCurrentPanel(); - if (gFocusMgr.getMouseCapture() == this) + if (hasMouseCapture()) { if (cur_panel) { @@ -1318,7 +1318,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) mTabList[getCurrentPanelIndex()]->mButton->setFocus(TRUE); } } - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); } return handled; } diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 0cd2e98514..f6f7067540 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -94,7 +94,7 @@ BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask) handled = TRUE; // Route future Mouse messages here preemptively. (Release on mouse up.) - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); if (mSoundFlags & MOUSE_DOWN) { @@ -115,12 +115,12 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask) // HACK: Only do this if there actually is a click callback, so that // overly large text boxes in the older UI won't start eating clicks. if (mClickedCallback - && this == gFocusMgr.getMouseCapture()) + && hasMouseCapture()) { handled = TRUE; // Release the mouse - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); if (mSoundFlags & MOUSE_UP) { diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index de34aabb1f..366b1956c4 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1182,7 +1182,7 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) setCursorAtLocalPos( x, y, TRUE ); startSelection(); } - gFocusMgr.setMouseCapture( this, &LLTextEditor::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); } handled = TRUE; @@ -1208,7 +1208,7 @@ BOOL LLTextEditor::handleHover(S32 x, S32 y, MASK mask) mHoverSegment = NULL; if( getVisible() ) { - if(gFocusMgr.getMouseCapture() == this ) + if(hasMouseCapture() ) { if( mIsSelecting ) { @@ -1341,9 +1341,9 @@ BOOL LLTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) // Delay cursor flashing mKeystrokeTimer.reset(); - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } @@ -2454,6 +2454,8 @@ void LLTextEditor::onFocusLost() // Make sure cursor is shown again getWindow()->showCursorFromMouseMove(); + + LLUICtrl::onFocusLost(); } void LLTextEditor::setEnabled(BOOL enabled) @@ -3734,11 +3736,9 @@ S32 LLTextEditor::getSegmentIdxAtOffset(S32 offset) } } -//static -void LLTextEditor::onMouseCaptureLost( LLMouseHandler* old_captor ) +void LLTextEditor::onMouseCaptureLost() { - LLTextEditor* self = (LLTextEditor*) old_captor; - self->endSelection(); + endSelection(); } void LLTextEditor::setOnScrollEndCallback(void (*callback)(void*), void* userdata) diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index ce85e35fe3..21db32b33f 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -75,6 +75,8 @@ public: virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, LLString& tooltip_msg); + virtual void onMouseCaptureLost(); + // view overrides virtual void reshape(S32 width, S32 height, BOOL called_from_parent); @@ -190,7 +192,6 @@ public: void setHandleEditKeysDirectly( BOOL b ) { mHandleEditKeysDirectly = b; } // Callbacks - static void onMouseCaptureLost( LLMouseHandler* old_captor ); static void setLinkColor(LLColor4 color) { mLinkColor = color; } static void setURLCallbacks( void (*callback1) (const char* url), BOOL (*callback2) (LLString url) ) diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index e8e3f271a0..f32266faa8 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1723,6 +1723,10 @@ LLString LLUI::locateSkin(const LLString& filename) if (!gDirUtilp->fileExists(found_file)) { LLString localization(sConfigGroup->getString("Language")); + if(localization == "default") + { + localization = sConfigGroup->getString("SystemLanguage"); + } LLString local_skin = "xui" + slash + localization + slash + filename; found_file = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, local_skin); } diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 0d9791c660..abf796fde0 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -26,6 +26,7 @@ const U32 MAX_STRING_LENGTH = 10; LLUICtrl::LLUICtrl() : mCommitCallback(NULL), + mFocusLostCallback(NULL), mFocusReceivedCallback(NULL), mFocusChangedCallback(NULL), mValidateCallback(NULL), @@ -44,6 +45,7 @@ LLUICtrl::LLUICtrl(const LLString& name, const LLRect& rect, BOOL mouse_opaque, // of buttons in the UI. JC 7/20/2002 LLView( name, rect, mouse_opaque, reshape ), mCommitCallback( on_commit_callback) , + mFocusLostCallback( NULL ), mFocusReceivedCallback( NULL ), mFocusChangedCallback( NULL ), mValidateCallback( NULL ), @@ -57,6 +59,12 @@ LLUICtrl::LLUICtrl(const LLString& name, const LLRect& rect, BOOL mouse_opaque, LLUICtrl::~LLUICtrl() { gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit() + + if( gFocusMgr.getTopCtrl() == this ) + { + llwarns << "UI Control holding top ctrl deleted: " << getName() << ". Top view removed." << llendl; + gFocusMgr.removeTopCtrlWithoutCallback( this ); + } } void LLUICtrl::onCommit() @@ -151,6 +159,11 @@ void LLUICtrl::onFocusReceived() void LLUICtrl::onFocusLost() { + if( mFocusLostCallback ) + { + mFocusLostCallback( this, mCallbackUserData ); + } + if( mFocusChangedCallback ) { mFocusChangedCallback( this, mCallbackUserData ); diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 1418151201..1c2ac677df 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -104,6 +104,7 @@ public: virtual void setMaxValue(LLSD max_value); // In general, only LLPanel uses these. + void setFocusLostCallback(void (*cb)(LLUICtrl* caller, void* user_data)) { mFocusLostCallback = cb; } void setFocusReceivedCallback( void (*cb)(LLUICtrl*, void*) ) { mFocusReceivedCallback = cb; } void setFocusChangedCallback( void (*cb)(LLUICtrl*, void*) ) { mFocusChangedCallback = cb; } @@ -135,6 +136,7 @@ protected: protected: void (*mCommitCallback)( LLUICtrl* ctrl, void* userdata ); + void (*mFocusLostCallback)( LLUICtrl* caller, void* userdata ); void (*mFocusReceivedCallback)( LLUICtrl* ctrl, void* userdata ); void (*mFocusChangedCallback)( LLUICtrl* ctrl, void* userdata ); BOOL (*mValidateCallback)( LLUICtrl* ctrl, void* userdata ); diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index 21278455da..6410208189 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -222,6 +222,10 @@ void LLUICtrlFactory::setupPaths() if (LLUI::sConfigGroup) { language = LLUI::sConfigGroup->getString("Language"); + if(language == "default") + { + language = LLUI::sConfigGroup->getString("SystemLanguage"); + } } path_val_ui.setArg("[Language]", language); LLString fullpath = app_dir + path_val_ui.getString(); diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 02a99b00cd..da5c77fc94 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -155,18 +155,12 @@ LLView::~LLView() gFocusMgr.removeKeyboardFocusWithoutCallback( this ); } - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { llwarns << "View holding mouse capture deleted: " << getName() << ". Mouse capture removed." << llendl; gFocusMgr.removeMouseCaptureWithoutCallback( this ); } - if( gFocusMgr.getTopView() == this ) - { - llwarns << "View holding top view deleted: " << getName() << ". Top view removed." << llendl; - gFocusMgr.removeTopViewWithoutCallback( this ); - } - sViewHandleMap.erase(mViewHandle); deleteAllChildren(); @@ -733,9 +727,9 @@ void LLView::setEnabled(BOOL enabled) // virtual void LLView::setVisible(BOOL visible) { - if( !visible && (gFocusMgr.getTopView() == this) ) + if( !visible && (gFocusMgr.getTopCtrl() == this) ) { - gFocusMgr.setTopView( NULL, NULL ); + gFocusMgr.setTopCtrl( NULL ); } if ( mVisible != visible ) @@ -1034,7 +1028,14 @@ LLView* LLView::childrenHandleDragAndDrop(S32 x, S32 y, MASK mask, return handled_view; } +void LLView::onMouseCaptureLost() +{ +} +BOOL LLView::hasMouseCapture() +{ + return gFocusMgr.getMouseCapture() == this; +} BOOL LLView::handleMouseUp(S32 x, S32 y, MASK mask) { @@ -1591,6 +1592,13 @@ const LLRect LLView::getLocalRect() const return local_rect; } +const LLRect LLView::getLocalSnapRect() const +{ + LLRect local_snap_rect = getSnapRect(); + local_snap_rect.translate(-mRect.mLeft, -mRect.mBottom); + return local_snap_rect; +} + void LLView::updateRect() { if (mSpanChildren && mChildList.size()) @@ -2087,6 +2095,12 @@ const LLCtrlQuery & LLView::getFocusRootsQuery() } +void LLView::userSetShape(const LLRect& new_rect) +{ + reshape(new_rect.getWidth(), new_rect.getHeight()); + translate(new_rect.mLeft - mRect.mLeft, new_rect.mBottom - mRect.mBottom); +} + LLView* LLView::findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding) { @@ -2108,8 +2122,7 @@ LLView* LLView::findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, BOOL snapped_x = FALSE; BOOL snapped_y = FALSE; - LLRect parent_local_snap_rect = mParentView->getSnapRect(); - parent_local_snap_rect.translate(-mParentView->getRect().mLeft, -mParentView->getRect().mBottom); + LLRect parent_local_snap_rect = mParentView->getLocalSnapRect(); if (snap_type == SNAP_PARENT || snap_type == SNAP_PARENT_AND_SIBLINGS) { @@ -2284,8 +2297,7 @@ LLView* LLView::findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESna BOOL snapped_x = FALSE; BOOL snapped_y = FALSE; - LLRect parent_local_snap_rect = mParentView->getSnapRect(); - parent_local_snap_rect.translate(-mParentView->getRect().mLeft, -mParentView->getRect().mBottom); + LLRect parent_local_snap_rect = mParentView->getLocalSnapRect(); if (snap_type == SNAP_PARENT || snap_type == SNAP_PARENT_AND_SIBLINGS) { diff --git a/indra/llui/llview.h b/indra/llui/llview.h index b794c087b5..504558a132 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -294,6 +294,7 @@ public: const LLRect getScreenRect() const; const LLRect getLocalRect() const; virtual const LLRect getSnapRect() const { return mRect; } + virtual const LLRect getLocalSnapRect() const; virtual LLRect getRequiredRect(); // Get required size for this object. 0 for width/height means don't care. virtual void updateRect(); // apply procedural updates to own rectangle @@ -315,12 +316,13 @@ public: // Default behavior is to use reshape flags to resize child views virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); - virtual void translate( S32 x, S32 y ); virtual void setOrigin( S32 x, S32 y ) { mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); } BOOL translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside ); - LLView* findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding = 0); - LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding = 0); + + virtual void userSetShape(const LLRect& new_rect); + virtual LLView* findSnapRect(LLRect& new_rect, const LLCoordGL& mouse_dir, LLView::ESnapType snap_type, S32 threshold, S32 padding = 0); + virtual LLView* findSnapEdge(S32& new_edge_val, const LLCoordGL& mouse_dir, ESnapEdge snap_edge, ESnapType snap_type, S32 threshold, S32 padding = 0); // Defaults to other_view->getVisible() virtual BOOL canSnapTo(LLView* other_view); @@ -345,6 +347,8 @@ public: /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); + /*virtual*/ void onMouseCaptureLost(); + /*virtual*/ BOOL hasMouseCapture(); // Default behavior is to pass the tooltip event to children, // then display mToolTipMsg if no child handled it. diff --git a/indra/llwindow/llmousehandler.h b/indra/llwindow/llmousehandler.h index e59b5845b0..1df1609451 100644 --- a/indra/llwindow/llmousehandler.h +++ b/indra/llwindow/llmousehandler.h @@ -15,8 +15,6 @@ // Intended for use via multiple inheritance. // A class may have as many interfaces as it likes, but never needs to inherit one more than once. -#include "llstring.h" - class LLMouseHandler { public: @@ -33,11 +31,15 @@ public: virtual BOOL handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect_screen) = 0; virtual const LLString& getName() const = 0; + virtual void onMouseCaptureLost() = 0; + // Hack to support LLFocusMgr virtual BOOL isView() = 0; virtual void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const = 0; virtual void localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const = 0; + + virtual BOOL hasMouseCapture() = 0; }; #endif diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index ccc100a861..f7df94c65c 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -217,6 +217,11 @@ LLWindow::LLWindow(BOOL fullscreen, U32 flags) { mJoyAxis[i] = 0; } + + for (U32 i = 0; i < 16; i++) + { + mJoyButtonState[i] = 0; + } } // virtual @@ -243,6 +248,15 @@ F32 LLWindow::getJoystickAxis(U32 axis) return 0.f; } +U8 LLWindow::getJoystickButton(U32 button) +{ + if (button < 16) + { + return mJoyButtonState[button]; + } + return 0; +} + void LLWindow::setCallbacks(LLWindowCallbacks *callbacks) { mCallbacks = callbacks; diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index f19178d7f5..5c5f712b32 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -183,6 +183,8 @@ public: virtual void setNativeAspectRatio(F32 aspect) = 0; F32 getJoystickAxis(U32 axis); + U8 getJoystickButton(U32 button); + void setCallbacks(LLWindowCallbacks *callbacks); virtual void beforeDialog() {}; // prepare to put up an OS dialog (if special measures are required, such as in fullscreen mode) @@ -221,7 +223,8 @@ protected: BOOL mHideCursorPermanent; U32 mFlags; F32 mJoyAxis[6]; - + U8 mJoyButtonState[16]; + friend class LLWindowManager; }; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index b8123096e6..697b8f2175 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -744,8 +744,6 @@ LLWindowWin32::LLWindowWin32(char *title, char *name, S32 x, S32 y, S32 width, } SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer - mJoyStickState = 0; - mJoyButtonState = 0; } @@ -2803,89 +2801,9 @@ void LLWindowWin32::updateJoystick( ) mJoyAxis[4] = js.lRy/1000.f; mJoyAxis[5] = js.lRz/1000.f; - if (js.lX <= -500) + for (U32 i = 0; i < 16; i++) { - if (!(mJoyStickState & 0x1)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_LEFT, 0); - mJoyStickState |= 0x1; - } - } - else - { - if (mJoyStickState & 0x1) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_LEFT, 0); - mJoyStickState &= ~0x1; - } - } - if (js.lX >= 500) - { - if (!(mJoyStickState & 0x2)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_RIGHT, 0); - mJoyStickState |= 0x2; - } - } - else - { - if (mJoyStickState & 0x2) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_RIGHT, 0); - mJoyStickState &= ~0x2; - } - } - if (js.lY <= -500) - { - if (!(mJoyStickState & 0x4)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_UP, 0); - mJoyStickState |= 0x4; - } - } - else - { - if (mJoyStickState & 0x4) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_UP, 0); - mJoyStickState &= ~0x4; - } - } - if (js.lY >= 500) - { - if (!(mJoyStickState & 0x8)) - { - gKeyboard->handleTranslatedKeyDown(KEY_PAD_DOWN, 0); - mJoyStickState |= 0x8; - } - } - else - { - if (mJoyStickState & 0x8) - { - gKeyboard->handleTranslatedKeyUp(KEY_PAD_DOWN, 0); - mJoyStickState &= ~0x8; - } - } - - for( int i = 0; i < 15; i++ ) - { - if ( js.rgbButtons[i] & 0x80 ) - { - if (!(mJoyButtonState & (1<<i))) - { - gKeyboard->handleTranslatedKeyDown(KEY_BUTTON1+i, 0); - mJoyButtonState |= (1<<i); - } - } - else - { - if (mJoyButtonState & (1<<i)) - { - gKeyboard->handleTranslatedKeyUp(KEY_BUTTON1+i, 0); - mJoyButtonState &= ~(1<<i); - } - } + mJoyButtonState[i] = js.rgbButtons[i]; } } diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index ba944ca900..c4391ef41f 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -150,9 +150,6 @@ protected: WORD mPrevGammaRamp[256*3]; WORD mCurrentGammaRamp[256*3]; - U32 mJoyStickState; - U32 mJoyButtonState; - LPWSTR mIconResource; BOOL mMousePositionModified; BOOL mInputProcessingPaused; diff --git a/indra/newview/English.lproj/language.txt b/indra/newview/English.lproj/language.txt new file mode 100644 index 0000000000..bc0aa577f9 --- /dev/null +++ b/indra/newview/English.lproj/language.txt @@ -0,0 +1 @@ +en-us
\ No newline at end of file diff --git a/indra/newview/German.lproj/language.txt b/indra/newview/German.lproj/language.txt new file mode 100644 index 0000000000..c42e816f93 --- /dev/null +++ b/indra/newview/German.lproj/language.txt @@ -0,0 +1 @@ +de
\ No newline at end of file diff --git a/indra/newview/Japanese.lproj/language.txt b/indra/newview/Japanese.lproj/language.txt new file mode 100644 index 0000000000..c6e3ab6f3c --- /dev/null +++ b/indra/newview/Japanese.lproj/language.txt @@ -0,0 +1 @@ +ja
\ No newline at end of file diff --git a/indra/newview/Korean.lproj/language.txt b/indra/newview/Korean.lproj/language.txt new file mode 100644 index 0000000000..b03ec72ee0 --- /dev/null +++ b/indra/newview/Korean.lproj/language.txt @@ -0,0 +1 @@ +ko
\ No newline at end of file diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi new file mode 100644 index 0000000000..71d2138313 --- /dev/null +++ b/indra/newview/installers/windows/lang_de.nsi @@ -0,0 +1,57 @@ +; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf"
+
+; subtitle on license text caption (setup new version or update current one
+LangString LicenseSubTitleUpdate ${LANG_GERMAN} " Update"
+LangString LicenseSubTitleSetup ${LANG_GERMAN} " Setup"
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_GERMAN} "Dieses Paket wird Second Life auf Version ${VERSION_LONG}.updaten"
+LangString LicenseDescSetup ${LANG_GERMAN} "Dieses Paket installiert Second Life auf Ihrem Computer."
+LangString LicenseDescNext ${LANG_GERMAN} "Nächster Schritt"
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_GERMAN} "Installations Ordner"
+LangString DirectoryChooseUpdate ${LANG_GERMAN} "Wählen Sie den Second Life Ordner für dieses Update:"
+LangString DirectoryChooseSetup ${LANG_GERMAN} "Wählen Sie den Pfad, in den Sie Second Life installieren möchten:"
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_GERMAN} "Konnte Programm '$INSTPROG' nicht finden. Stilles Update fehlgeschlagen."
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_GERMAN} "Second Life jetzt starten?"
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_GERMAN} "Überprüfe alte Version..."
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_GERMAN} "Überprüfe Windows Version..."
+LangString CheckWindowsVersionMB ${LANG_GERMAN} 'Second Life unterstützt nur Windows XP, Windows 2000 und Mac OS X.$\n$\nDer Versuch es auf Windows $R0 zu installieren, könnte in unvorhersehbaren Abstürtzen und zu Datenverlust führen.$\n$\nTrotzdem installieren?'
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_GERMAN} "Überprüfe nach Genehmigung zur Installation..."
+LangString CheckAdministratorInstMB ${LANG_GERMAN} 'Es scheint so, als würden Sie einen "limited" Account verwenden.$\nSie müssen ein"administrator" sein, um Second Life installieren zu können..'
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_GERMAN} "Überprüfe Genehmigung zum Deinstallieren..."
+LangString CheckAdministratorUnInstMB ${LANG_GERMAN} 'Es scheint so, als würden Sie einen "limited" Account verwenden.$\nSie müssen ein"administrator" sein, um Second Life installieren zu können..'
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_GERMAN} "Es scheint so, als hätten Sie Second Life ${VERSION_LONG} bereits installiert.$\n$\nWürden Sie es gerne erneut installieren?"
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_GERMAN} "Warte darauf, dass Second Life beendet wird..."
+LangString CloseSecondLifeInstMB ${LANG_GERMAN} "Second Life kann nicht installiert werden, wenn es bereits läuft.$\n$\nBeenden Sie, was Sie gerade tun und wählen Sie OK, um Second Life zu beenden oder Continue .$\nSelect CANCEL, um abzubrechen."
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_GERMAN} "Warte darauf, dass Second Life beendet wird..."
+LangString CloseSecondLifeUnInstMB ${LANG_GERMAN} "Second Life kann nicht installiert werden, wenn es bereits läuft.$\n$\nBeenden Sie, was Sie gerade tun und wählen Sie OK, um Second Life zu beenden oder Continue .$\nSelect CANCEL, um abzubrechen."
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_GERMAN} "Lösche alle Cache Files in Dokumente und Einstellungen"
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_GERMAN} "Es bestehen weiterhin Dateien in Ihrem SecondLife Programm Ordner.$\n$\nDies sind möglicherweise Dateien, die sie modifiziert oder bewegt haben:$\n$INSTDIR$\n$\nMöchten Sie diese ebenfalls löschen?"
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_GERMAN} "Dies wird Second Life ${VERSION_LONG} von Ihrem System entfernen."
\ No newline at end of file diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi new file mode 100644 index 0000000000..c26af12a9c --- /dev/null +++ b/indra/newview/installers/windows/lang_en-us.nsi @@ -0,0 +1,57 @@ +; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
+
+; subtitle on license text caption
+LangString LicenseSubTitleUpdate ${LANG_ENGLISH} " Update"
+LangString LicenseSubTitleSetup ${LANG_ENGLISH} " Setup"
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_ENGLISH} "This package will update Second Life to version ${VERSION_LONG}.(XXX)"
+LangString LicenseDescSetup ${LANG_ENGLISH} "This package will install Second Life on your computer."
+LangString LicenseDescNext ${LANG_ENGLISH} "Next"
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_ENGLISH} "Installation Directory"
+LangString DirectoryChooseUpdate ${LANG_ENGLISH} "Select the Second Life directory to update:"
+LangString DirectoryChooseSetup ${LANG_ENGLISH} "Select the directory to install Second Life in:"
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_ENGLISH} "Could not find the program '$INSTPROG'. Silent update failed."
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_ENGLISH} "Start Second Life now?"
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_ENGLISH} "Checking for old version..."
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_ENGLISH} "Checking Windows version..."
+LangString CheckWindowsVersionMB ${LANG_ENGLISH} 'Second Life only supports Windows XP, Windows 2000, and Mac OS X.$\n$\nAttempting to install on Windows $R0 can result in crashes and data loss.$\n$\nInstall anyway?'
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_ENGLISH} "Checking for permission to install..."
+LangString CheckAdministratorInstMB ${LANG_ENGLISH} 'You appear to be using a "limited" account.$\nYou must be an "administrator" to install Second Life.'
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_ENGLISH} "Checking for permission to uninstall..."
+LangString CheckAdministratorUnInstMB ${LANG_ENGLISH} 'You appear to be using a "limited" account.$\nYou must be an "administrator" to uninstall Second Life.'
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_ENGLISH} "It appears that Second Life ${VERSION_LONG} is already installed.$\n$\nWould you like to install it again?"
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_ENGLISH} "Waiting for Second Life to shut down..."
+LangString CloseSecondLifeInstMB ${LANG_ENGLISH} "Second Life can't be installed while it is already running.$\n$\nFinish what you're doing then select OK to close Second Life and continue.$\nSelect CANCEL to cancel installation."
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_ENGLISH} "Waiting for Second Life to shut down..."
+LangString CloseSecondLifeUnInstMB ${LANG_ENGLISH} "Second Life can't be uninstalled while it is already running.$\n$\nFinish what you're doing then select OK to close Second Life and continue.$\nSelect CANCEL to cancel."
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_ENGLISH} "Deleting cache files in Documents and Settings folder"
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_ENGLISH} "There are still files in your SecondLife program directory.$\n$\nThese are possibly files you created or moved to:$\n$INSTDIR$\n$\nDo you want to remove them?"
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_ENGLISH} "This will uninstall Second Life ${VERSION_LONG} from your system."
diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi new file mode 100644 index 0000000000..43cb492780 --- /dev/null +++ b/indra/newview/installers/windows/lang_ja.nsi @@ -0,0 +1,57 @@ +; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
+
+; subtitle on license text caption
+LangString LicenseSubTitleUpdate ${LANG_JAPANESE} " ƒAƒbƒvƒf[ƒg"
+LangString LicenseSubTitleSetup ${LANG_JAPANESE} " ƒZƒbƒgƒAƒbƒv"
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_JAPANESE} "‚±‚̃pƒbƒP[ƒW‚̓ZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒo[ƒWƒ‡ƒ“${VERSION_LONG}.‚ɃAƒbƒvƒf[ƒg‚µ‚Ü‚·B"
+LangString LicenseDescSetup ${LANG_JAPANESE} "‚±‚̃pƒbƒP[ƒW‚Í‚ ‚È‚½‚̃Rƒ“ƒsƒ…[ƒ^‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·B"
+LangString LicenseDescNext ${LANG_JAPANESE} "ŽŸ"
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_JAPANESE} "ƒCƒ“ƒXƒg[ƒ‹EƒfƒBƒŒƒNƒgƒŠ"
+LangString DirectoryChooseUpdate ${LANG_JAPANESE} "ƒAƒbƒvƒf[ƒg‚·‚éƒZƒJƒ“ƒhƒ‰ƒCƒt‚̃fƒBƒŒƒNƒgƒŠ‚ð‘I‘ð‚µ‚Ä‚‚¾‚³‚¢B:"
+LangString DirectoryChooseSetup ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚éƒfƒBƒŒƒNƒgƒŠ‚ð‘I‘ð‚µ‚Ä‚‚¾‚³‚¢B: "
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_JAPANESE} "ƒvƒƒOƒ‰ƒ€–¼'$INSTPROG'‚ªŒ©‚‚©‚è‚Ü‚¹‚ñBƒTƒCƒŒƒ“ƒgEƒAƒbƒvƒf[ƒg‚ÉŽ¸”s‚µ‚Ü‚µ‚½B"
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_JAPANESE} "’¼‚¿‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðŠJŽn‚µ‚Ü‚·‚©H "
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_JAPANESE} "ŒÃ‚¢ƒo[ƒWƒ‡ƒ“î•ñ‚ðƒ`ƒFƒbƒN’†‚Å‚·c"
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_JAPANESE} "ƒEƒBƒ“ƒhƒEƒY‚̃o[ƒWƒ‡ƒ“î•ñ‚ðƒ`ƒFƒbƒN’†‚Å‚·..."
+LangString CheckWindowsVersionMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ÍWindows XPAWindows 2000AMac OS X‚Ì‚Ý‚ðƒTƒ|[ƒg‚µ‚Ä‚¢‚Ü‚·BWindows $R0‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚鎖‚ÍAƒf[ƒ^‚ÌÁŽ¸‚âƒNƒ‰ƒbƒVƒ…‚ÌŒ´ˆö‚É‚È‚é‰Â”\«‚ª‚ ‚è‚Ü‚·BƒCƒ“ƒXƒg[ƒ‹‚𑱂¯‚Ü‚·‚©H"
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_JAPANESE} "ƒCƒ“ƒXƒg[ƒ‹‚Ì‚½‚ß‚ÌŒ ŒÀ‚ðƒ`ƒFƒbƒN’†‚Å‚·..."
+LangString CheckAdministratorInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍŠÇ—ŽÒŒ ŒÀ‚ª•K—v‚Å‚·B"
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_JAPANESE} "ƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚Ì‚½‚ß‚ÌŒ ŒÀ‚ðƒ`ƒFƒbƒN’†‚Å‚·..."
+LangString CheckAdministratorUnInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚·‚é‚É‚ÍŠÇ—ŽÒŒ ŒÀ‚ª•K—v‚Å‚·B"
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt${VERSION_LONG} ‚̓Cƒ“ƒXƒg[ƒ‹Ï‚Ý‚Å‚·BÄ“xƒCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·‚©H "
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹’†‚Å‚·..."
+LangString CloseSecondLifeInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚Ì‹N“®’†‚ɃCƒ“ƒXƒg[ƒ‹‚Ío—ˆ‚Ü‚¹‚ñB’¼‚¿‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹‚µ‚ăCƒ“ƒXƒg[ƒ‹‚ðŠJŽn‚·‚éꇂÍOKƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚‚¾‚³‚¢BCANCEL‚ð‰Ÿ‚·‚Æ’†Ž~‚µ‚Ü‚·B"
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹’†‚Å‚·..."
+LangString CloseSecondLifeUnInstMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚Ì‹N“®’†‚ɃAƒ“ƒCƒ“ƒXƒg[ƒ‹‚Ío—ˆ‚Ü‚¹‚ñB’¼‚¿‚ɃZƒJƒ“ƒhƒ‰ƒCƒt‚ðI—¹‚µ‚ăAƒ“ƒCƒ“ƒXƒg[ƒ‹‚ðŠJŽn‚·‚éꇂÍOKƒ{ƒ^ƒ“‚ð‰Ÿ‚µ‚Ä‚‚¾‚³‚¢BCANCEL‚ð‰Ÿ‚·‚Æ’†Ž~‚µ‚Ü‚·B"
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_JAPANESE} " Documents and Settings ƒtƒHƒ‹ƒ_‚̃LƒƒƒbƒVƒ…ƒtƒ@ƒCƒ‹‚ðƒfƒŠ[ƒg’†‚Å‚·B"
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt‚̃fƒBƒŒƒNƒgƒŠ‚É‚ÍA‚Ü‚¾ƒtƒ@ƒCƒ‹‚ªŽc‚³‚ê‚Ä‚¢‚Ü‚·B$\n$INSTDIR$\n‚É‚ ‚È‚½‚ªì¬A‚Ü‚½‚͈ړ®‚³‚¹‚½ƒtƒ@ƒCƒ‹‚ª‚ ‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B‘S‚Ä휂µ‚Ü‚·‚©H "
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_JAPANESE} "ƒZƒJƒ“ƒhƒ‰ƒCƒt${VERSION_LONG}‚ðƒAƒ“ƒCƒ“ƒXƒg[ƒ‹‚µ‚Ü‚·B"
diff --git a/indra/newview/installers/windows/lang_ko.nsi b/indra/newview/installers/windows/lang_ko.nsi new file mode 100644 index 0000000000..4e6b5ec0cd --- /dev/null +++ b/indra/newview/installers/windows/lang_ko.nsi @@ -0,0 +1,57 @@ +; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Korean.nlf"
+
+; subtitle on license text caption
+LangString LicenseSubTitleUpdate ${LANG_KOREAN} "¾÷µ¥ÀÌÆ®"
+LangString LicenseSubTitleSetup ${LANG_KOREAN} " ¼³Ä¡Çϱâ"
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_KOREAN} "ÀÌ ÆÑÅ°Áö´Â ¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¹öÀü${VERSION_LONG}.À¸·Î ¾÷µ¥ÀÌÆ® ÇÕ´Ï´Ù. "
+LangString LicenseDescSetup ${LANG_KOREAN} "ÀÌ ÆÑÅ°Áö´Â ¼¼ÄÁµå¶óÀÌÇÁ¸¦ ÄÄÇ»ÅÍ¿¡ ¼³Ä¡ÇÕ´Ï´Ù."
+LangString LicenseDescNext ${LANG_KOREAN} "´ÙÀ½"
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_KOREAN} "¼³Ä¡ µð·ºÅ丮"
+LangString DirectoryChooseUpdate ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¾÷µ¥ÀÌÆ®ÇÒ µð·ºÅ丮¸¦ ¼±ÅÃÇϼ¼¿ä. "
+LangString DirectoryChooseSetup ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¼³Ä¡ÇÒ µð·ºÅ丮¸¦ ¼±ÅÃÇϼ¼¿ä:"
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_KOREAN} " ¡®$INSTPROG¡¯ ÇÁ·Î±×·¥À» ãÁö ¸øÇß½À´Ï´Ù. ÀÚµ¿ ¾÷µ¥ÀÌÆ®¿¡ ½ÇÆÐÇß½À´Ï´Ù."
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ ½ÃÀÛÇÏ°Ú½À´Ï±î?"
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_KOREAN} "ÀÌÀü ¹öÀüÀ» ã°í ÀÖ½À´Ï´Ù¡¦ "
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_KOREAN} "À©µµ¿ì ¹öÀüÀ» È®ÀÎÇÏ°í ÀÖ½À´Ï´Ù."
+LangString CheckWindowsVersionMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ´Â À©µµ¿ì XP, À©µµ¿ì 2000, ±×¸®°í ¸Æ OS X¸¦ Áö¿øÇÕ´Ï´Ù. À©µµ¿ì $R0¿¡ ¼³Ä¡¸¦ ½ÃµµÇÏ¸é ¿ÀÀÛµ¿°ú µ¥ÀÌÅÍ ºÐ½ÇÀÌ ÀϾ ¼ö ÀÖ½À´Ï´Ù. °è¼Ó ¼³Ä¡ÇÏ°Ú½À´Ï±î? "
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_KOREAN} "¼³Ä¡ ±ÇÇÑÀ» È®ÀÎ ÁßÀÔ´Ï´Ù... "
+LangString CheckAdministratorInstMB ${LANG_KOREAN} "ÇöÀç ¡®¼Õ´Ô¡¯°èÁ¤À» »ç¿ë ÁßÀÔ´Ï´Ù. ¼¼ÄÁµå¶óÀÌÇÁ¸¦ ¼³Ä¡Çϱâ À§Çؼ± ¡®¿î¿µÀÚ¡± °èÁ¤À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù."
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_KOREAN} "Á¦°Å ±ÇÇÑÀ» È®ÀÎ ÁßÀÔ´Ï´Ù. "
+LangString CheckAdministratorUnInstMB ${LANG_KOREAN} " ÇöÀç ¡®¼Õ´Ô¡¯°èÁ¤À» »ç¿ë ÁßÀÔ´Ï´Ù. ¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¦°ÅÇϱâ À§Çؼ± ¡®¿î¿µÀÚ¡± °èÁ¤À» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. "
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ ¹öÀü ${VERSION_LONG}ÀÌ ÀÌ¹Ì ¼³Ä¡µÇ¾î ÀÖ½À´Ï´Ù. ´Ù½Ã ¼³Ä¡ÇϽðڽÀ´Ï±î? "
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÒ ¶§ ±îÁö ´ë±â Áß¡¦ "
+LangString CloseSecondLifeInstMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ°¡ ÀÌ¹Ì ÀÛµ¿ ÁßÀÏ °æ¿ì ¼³Ä¡¸¦ °è¼Ó ÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç ÀÛ¾÷À» ¸ØÃß°í ¡®È®ÀΡ¯À» ´·¯ ¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÑ ´ÙÀ½ ÁøÇàÇϱ⠹ٶø´Ï´Ù. ¼³Ä¡¸¦ Ãë¼ÒÇÏ·Á¸é ¡®Ãë¼Ò¡¯¸¦ ´©¸£¼¼¿ä."
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÒ ¶§ ±îÁö ´ë±â Áß¡¦¡±"
+LangString CloseSecondLifeUnInstMB ${LANG_KOREAN} " ¼¼ÄÁµå¶óÀÌÇÁ°¡ ÀÌ¹Ì ÀÛµ¿ ÁßÀÏ °æ¿ì Á¦°Å¸¦ °è¼Ó ÇÒ ¼ö ¾ø½À´Ï´Ù. ÇöÀç ÀÛ¾÷À» ¸ØÃß°í ¡®È®ÀΡ¯À» ´·¯ ¼¼ÄÁµå¶óÀÌÇÁ¸¦ Á¾·áÇÑ ´ÙÀ½ ÁøÇàÇϱ⠹ٶø´Ï´Ù. ¼³Ä¡¸¦ ÃëÇÏ·Á¸é ¡®Ãë¼Ò¡¯¸¦ ´©¸£¼¼¿ä. "
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_KOREAN} " Documents and Settings Æú´õ ³»ÀÇ Ä³½Ã ÆÄÀϵéÀ» Áö¿ó´Ï´Ù."
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ ÇÁ·Î±×·¥ µð·ºÅ丮¿¡ ¾ÆÁ÷ ÆÄÀϵéÀÌ ³²¾Æ ÀÖ½À´Ï´Ù. ÀÌ ÆÄÀϵéÀº »ç¿ëÀÚ°¡ ¸¸µç °ÍµéÀ̰ųª$\n$INSTDIR$\n$\n·Î À̵¿ÇÑ ÆÄÀϵéÀÏ ¼ö ÀÖ½À´Ï´Ù. ÀÌ ÆÄÀϵéÀ» Á¦°ÅÇÏ°Ú½À´Ï±î?"
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_KOREAN} "¼¼ÄÁµå¶óÀÌÇÁ${VERSION_LONG}À» ½Ã½ºÅÛ¿¡¼ Á¦°ÅÇÕ´Ï´Ù."
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index c0ad9ffb03..15ab9bac1d 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -309,9 +309,6 @@ LLAgent::LLAgent() mbJump(FALSE), - mWanderTimer(), - mWanderTargetGlobal( LLVector3d::zero ), - mAutoPilot(FALSE), mAutoPilotFlyOnStop(FALSE), mAutoPilotTargetGlobal(), @@ -2097,36 +2094,6 @@ BOOL LLAgent::getBusy() const //----------------------------------------------------------------------------- -// updateWanderTarget() -//----------------------------------------------------------------------------- -void LLAgent::updateWanderTarget() -{ - S32 num_regions; - LLViewerRegion* rand_region; - F32 rand_x; - F32 rand_y; - - if (mWanderTimer.checkExpirationAndReset(ll_frand(MAX_WANDER_TIME))) - { - // Pick a random spot to wander towards - num_regions = gWorldPointer->mActiveRegionList.getLength(); - S32 region_num = llround(ll_frand() * num_regions); - rand_region = gWorldPointer->mActiveRegionList.getFirstData(); - S32 i = 0; - while (i < region_num) - { - rand_region = gWorldPointer->mActiveRegionList.getNextData(); - i++; - } - rand_x = ll_frand(rand_region->getWidth()); - rand_y = ll_frand(rand_region->getWidth()); - - stopAutoPilot(); - startAutoPilotGlobal(rand_region->getPosGlobalFromRegion(LLVector3(rand_x, rand_y, 0.f))); - } -} - -//----------------------------------------------------------------------------- // startAutoPilotGlobal() //----------------------------------------------------------------------------- void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold) @@ -4043,10 +4010,6 @@ void LLAgent::changeCameraToFollow(BOOL animate) mbFlagsDirty = TRUE; } - //RN: this doesn't seem to be necessary and destroys the UE for script-driven cameras - //gViewerWindow->setKeyboardFocus( NULL, NULL ); - //gViewerWindow->setMouseCapture( NULL, NULL ); - if (animate) { startCameraAnimation(); @@ -4110,9 +4073,6 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate) mbFlagsDirty = TRUE; } - //RN: this doesn't seem to be necessary and destroys the UE for script-driven cameras - //gViewerWindow->setKeyboardFocus( NULL, NULL ); - //gViewerWindow->setMouseCapture( NULL, NULL ); } // Remove any pitch from the avatar @@ -4185,7 +4145,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL animate) } gViewerWindow->setKeyboardFocus( NULL, NULL ); - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); LLVOAvatar::onCustomizeStart(); } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index b86dc03807..d0bda5d46a 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -398,8 +398,6 @@ public: void propagate(const F32 dt); // BUG: should roll into updateAgentPosition - void updateWanderTarget(); // drones will pick points in the world to autopilot towards - void startAutoPilotGlobal(const LLVector3d &pos_global, const std::string& behavior_name = "", const LLQuaternion *target_rotation = NULL, void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL, F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f); @@ -771,9 +769,6 @@ private: BOOL mbJump; - LLFrameTimer mWanderTimer; - LLVector3d mWanderTargetGlobal; - BOOL mAutoPilot; BOOL mAutoPilotFlyOnStop; LLVector3d mAutoPilotTargetGlobal; diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 7c615dd159..821bb2a69f 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -79,7 +79,7 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason) default: args["[FILE]"] = (mFileName.empty() ? mVFileID.asString() : mFileName); args["[REASON]"] = "The server is experiencing unexpected " - "difficulties. Please try again later."; + "difficulties."; gViewerWindow->alertXml("CannotUploadReason", args); break; } diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 19b6d80082..ddf0b83e73 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -583,7 +583,7 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata ) } // static -void LLChatBar::onInputEditorFocusLost( LLLineEditor* caller, void* userdata) +void LLChatBar::onInputEditorFocusLost( LLUICtrl* caller, void* userdata) { // stop typing animation gAgent.stopTyping(); diff --git a/indra/newview/llchatbar.h b/indra/newview/llchatbar.h index e0f31ae124..65724a1f45 100644 --- a/indra/newview/llchatbar.h +++ b/indra/newview/llchatbar.h @@ -67,7 +67,7 @@ public: static void onTabClick( void* userdata ); static void onInputEditorKeystroke(LLLineEditor* caller, void* userdata); - static void onInputEditorFocusLost(LLLineEditor* caller,void* userdata); + static void onInputEditorFocusLost(LLUICtrl* caller,void* userdata); static void onInputEditorGainFocus(LLUICtrl* caller,void* userdata); static void onCommitGesture(LLUICtrl* ctrl, void* data); diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 4dade7f683..13e7fef4ec 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -148,7 +148,7 @@ BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler is needed for capture lost since this object has no state that depends on it. - gViewerWindow->setMouseCapture( this, NULL ); + gViewerWindow->setMouseCapture( this ); return TRUE; } @@ -157,10 +157,10 @@ BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask) { // We only handle the click if the click both started and ended within us - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { // Release the mouse - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); // If mouseup in the widget, it's been clicked if ( pointInView(x, y) ) diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 3418007d41..77bbc1ca81 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -254,7 +254,8 @@ LLFace* LLDrawable::addFace(LLFacePool *poolp, LLViewerImage *texturep) LLMemType mt(LLMemType::MTYPE_DRAWABLE); LLFace *face = new LLFace(this, mVObjp); - + if (!face) llerrs << "Allocating new Face: " << mFaces.size() << llendl; + if (face) { mFaces.push_back(face); diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 93af956466..de82dff95d 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -26,6 +26,7 @@ #include "llviewerwindow.h" #include "pipeline.h" #include "llviewerregion.h" +#include "llglslshader.h" BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE; @@ -47,7 +48,7 @@ LLDrawPoolAlpha::~LLDrawPoolAlpha() void LLDrawPoolAlpha::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT); } void LLDrawPoolAlpha::beginRenderPass(S32 pass) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 9b9825deff..a0cc189c46 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -21,6 +21,7 @@ #include "llviewerregion.h" #include "noise.h" #include "pipeline.h" +#include "llglslshader.h" static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK; static U32 sBufferUsage = GL_STREAM_DRAW_ARB; @@ -82,12 +83,12 @@ static LLMatrix4 sModelViewMatrix = LLMatrix4(); S32 LLDrawPoolAvatar::getVertexShaderLevel() const { - return (S32) gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR); + return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); } void LLDrawPoolAvatar::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR); sShaderLevel = mVertexShaderLevel; if (sShaderLevel > 0) @@ -171,15 +172,15 @@ void LLDrawPoolAvatar::endFootShadow() void LLDrawPoolAvatar::beginRigid() { - sVertexProgram = &gPipeline.mAvatarEyeballProgram; + sVertexProgram = &gAvatarEyeballProgram; glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); if (sShaderLevel > 0) { //eyeballs render with the specular shader - gPipeline.mAvatarEyeballProgram.bind(); - gPipeline.mMaterialIndex = gPipeline.mAvatarEyeballProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; - gPipeline.mSpecularIndex = gPipeline.mAvatarEyeballProgram.mAttribute[LLPipeline::GLSL_SPECULAR_COLOR]; + gAvatarEyeballProgram.bind(); + gMaterialIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; + gSpecularIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::SPECULAR_COLOR]; } } @@ -194,7 +195,7 @@ void LLDrawPoolAvatar::beginSkinned() glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - sVertexProgram = &gPipeline.mAvatarProgram; + sVertexProgram = &gAvatarProgram; if (sShaderLevel > 0) // for hardware blending { @@ -202,22 +203,22 @@ void LLDrawPoolAvatar::beginSkinned() glClientActiveTextureARB(GL_TEXTURE1_ARB); if (sShaderLevel >= SHADER_LEVEL_BUMP) { - gPipeline.mMaterialIndex = sVertexProgram->mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; - gPipeline.mSpecularIndex = sVertexProgram->mAttribute[LLPipeline::GLSL_SPECULAR_COLOR]; + gMaterialIndex = sVertexProgram->mAttribute[LLShaderMgr::MATERIAL_COLOR]; + gSpecularIndex = sVertexProgram->mAttribute[LLShaderMgr::SPECULAR_COLOR]; } sVertexProgram->bind(); if (sShaderLevel >= SHADER_LEVEL_CLOTH) { - enable_cloth_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING]); + enable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]); } - enable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); if (sShaderLevel >= SHADER_LEVEL_BUMP) { - enable_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL]); + enable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]); } - sVertexProgram->enableTexture(LLPipeline::GLSL_BUMP_MAP); + sVertexProgram->enableTexture(LLShaderMgr::BUMP_MAP); glActiveTextureARB(GL_TEXTURE0_ARB); } } @@ -228,17 +229,17 @@ void LLDrawPoolAvatar::endSkinned() if (sShaderLevel > 0) { sRenderingSkinned = FALSE; - sVertexProgram->disableTexture(LLPipeline::GLSL_BUMP_MAP); + sVertexProgram->disableTexture(LLShaderMgr::BUMP_MAP); glActiveTextureARB(GL_TEXTURE0_ARB); glClientActiveTextureARB(GL_TEXTURE0_ARB); - disable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); if (sShaderLevel >= SHADER_LEVEL_BUMP) { - disable_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL]); + disable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]); } if ((sShaderLevel >= SHADER_LEVEL_CLOTH)) { - disable_cloth_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING]); + disable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]); } sVertexProgram->unbind(); @@ -354,7 +355,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) if (sShaderLevel > 0) { - gPipeline.mAvatarMatrixParam = sVertexProgram->mUniform[LLPipeline::GLSL_AVATAR_MATRIX]; + gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX]; } if ((sShaderLevel >= SHADER_LEVEL_CLOTH)) @@ -370,16 +371,16 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) wind = wind * rot_mat; wind.mV[VW] = avatarp->mWindVec.mV[VW]; - sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_WIND, wind.mV); + sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_WIND, wind.mV); F32 phase = -1.f * (avatarp->mRipplePhase); F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f); LLVector4 sin_params(freq, freq, freq, phase); - sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_SINWAVE, sin_params.mV); + sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_SINWAVE, sin_params.mV); LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f); gravity = gravity * rot_mat; - sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_GRAVITY, gravity.mV); + sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_GRAVITY, gravity.mV); } if( !single_avatar || (avatarp == single_avatar) ) @@ -507,10 +508,10 @@ void LLDrawPoolAvatar::renderForSelect() glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) sModelViewMatrix.mMatrix); - sVertexProgram = &gPipeline.mAvatarPickProgram; + sVertexProgram = &gAvatarPickProgram; if (sShaderLevel > 0) { - gPipeline.mAvatarMatrixParam = sVertexProgram->mUniform[LLPipeline::GLSL_AVATAR_MATRIX]; + gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX]; } glAlphaFunc(GL_GEQUAL, 0.2f); glBlendFunc(GL_ONE, GL_ZERO); @@ -527,7 +528,7 @@ void LLDrawPoolAvatar::renderForSelect() glClientActiveTextureARB(GL_TEXTURE0_ARB); sRenderingSkinned = TRUE; sVertexProgram->bind(); - enable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); } mIndicesDrawn += avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); @@ -537,7 +538,7 @@ void LLDrawPoolAvatar::renderForSelect() { sRenderingSkinned = FALSE; sVertexProgram->unbind(); - disable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]); + disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]); } glAlphaFunc(GL_GREATER, 0.01f); @@ -577,7 +578,7 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const LLVertexBufferAvatar::LLVertexBufferAvatar() : LLVertexBuffer(sDataMask, - gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) > 0 ? + LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) > 0 ? GL_STATIC_DRAW_ARB : GL_STREAM_DRAW_ARB) { @@ -599,16 +600,16 @@ void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const glClientActiveTextureARB(GL_TEXTURE0_ARB); glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD])); - set_vertex_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT])); + set_vertex_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT])); if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP) { - set_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL])); + set_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL])); } if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH) { - set_vertex_clothing_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT])); + set_vertex_clothing_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT])); } } else diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 377dbea2d0..f0f7130e0b 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -27,7 +27,7 @@ #include "llviewercamera.h" #include "llviewerimagelist.h" #include "pipeline.h" - +#include "llglslshader.h" //#include "llimagebmp.h" //#include "../tools/imdebug/imdebug.h" @@ -141,7 +141,7 @@ LLDrawPoolBump::LLDrawPoolBump() void LLDrawPoolBump::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT); } // static @@ -234,14 +234,14 @@ void LLDrawPoolBump::beginShiny() cube_map->setMatrix(0); cube_map->bind(); - if (gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT) > 0) + if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT) > 0) { LLMatrix4 mat; glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) mat.mMatrix); - gPipeline.mObjectShinyProgram.bind(); - LLVector3 vec = LLVector3(gPipeline.mShinyOrigin) * mat; - LLVector4 vec4(vec, gPipeline.mShinyOrigin.mV[3]); - glUniform4fvARB(gPipeline.mObjectShinyProgram.mUniform[LLPipeline::GLSL_SHINY_ORIGIN], 1, + gObjectShinyProgram.bind(); + LLVector3 vec = LLVector3(gShinyOrigin) * mat; + LLVector4 vec4(vec, gShinyOrigin.mV[3]); + glUniform4fvARB(gObjectShinyProgram.mUniform[LLShaderMgr::SHINY_ORIGIN], 1, vec4.mV); } else @@ -361,9 +361,9 @@ void LLDrawPoolBump::endShiny() cube_map->disable(); cube_map->restoreMatrix(); - if (gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT) > 0) + if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT) > 0) { - gPipeline.mObjectShinyProgram.unbind(); + gObjectShinyProgram.unbind(); } glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp index edbb11ad79..b6c3d638ea 100644 --- a/indra/newview/lldrawpoolground.cpp +++ b/indra/newview/lldrawpoolground.cpp @@ -21,6 +21,7 @@ #include "pipeline.h" #include "llagent.h" #include "llviewerregion.h" +#include "llglslshader.h" LLDrawPoolGround::LLDrawPoolGround() : LLFacePool(POOL_GROUND) @@ -34,7 +35,7 @@ LLDrawPool *LLDrawPoolGround::instancePool() void LLDrawPoolGround::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT); } void LLDrawPoolGround::render(S32 pass) diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 4c09cd4095..26022e362a 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -17,6 +17,7 @@ #include "llface.h" #include "llsky.h" #include "pipeline.h" +#include "llglslshader.h" class LLRenderShinyGlow : public LLDrawPoolBump { @@ -102,7 +103,7 @@ LLDrawPoolSimple::LLDrawPoolSimple() : void LLDrawPoolSimple::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT); } void LLDrawPoolSimple::beginRenderPass(S32 pass) diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 80340f63b9..6448576117 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -23,6 +23,7 @@ #include "llvosky.h" #include "llworld.h" // To get water height #include "pipeline.h" +#include "llglslshader.h" LLDrawPoolSky::LLDrawPoolSky() : LLFacePool(POOL_SKY) @@ -36,7 +37,7 @@ LLDrawPool *LLDrawPoolSky::instancePool() void LLDrawPoolSky::prerender() { - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT); + mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT); } void LLDrawPoolSky::render(S32 pass) diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 8c5c2e177a..787cd3167b 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -28,6 +28,7 @@ #include "llviewerimagelist.h" // To get alpha gradients #include "llworld.h" #include "pipeline.h" +#include "llglslshader.h" const F32 DETAIL_SCALE = 1.f/16.f; int DebugDetailMap = 0; @@ -149,10 +150,10 @@ void LLDrawPoolTerrain::render(S32 pass) gPipeline.disableLights(); if ((mVertexShaderLevel > 0)) { - gPipeline.mHighlightProgram.bind(); - gPipeline.mHighlightProgram.vertexAttrib4f(LLPipeline::GLSL_MATERIAL_COLOR,1,1,1,1); + gHighlightProgram.bind(); + gHighlightProgram.vertexAttrib4f(LLShaderMgr::MATERIAL_COLOR,1,1,1,1); renderOwnership(); - gPipeline.mTerrainProgram.bind(); + gTerrainProgram.bind(); } else { @@ -203,9 +204,9 @@ void LLDrawPoolTerrain::renderFull4TUShader() // Stage 0: detail texture 0 // - S32 detailTex0 = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_DETAIL0); - S32 detailTex1 = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_DETAIL1); - S32 rampTex = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_ALPHARAMP); + S32 detailTex0 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL0); + S32 detailTex1 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL1); + S32 rampTex = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_ALPHARAMP); LLViewerImage::bindTexture(detail_texture0p,detailTex0); @@ -322,9 +323,9 @@ void LLDrawPoolTerrain::renderFull4TUShader() } // Disable multitexture - gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_ALPHARAMP); - gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_DETAIL0); - gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_DETAIL1); + gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_ALPHARAMP); + gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL0); + gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL1); glClientActiveTextureARB(GL_TEXTURE3_ARB); glActiveTextureARB(GL_TEXTURE3_ARB); @@ -1061,5 +1062,5 @@ LLColor3 LLDrawPoolTerrain::getDebugColor() const S32 LLDrawPoolTerrain::getMaterialAttribIndex() { - return gPipeline.mTerrainProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; + return gTerrainProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; } diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 170669955c..350ad6a652 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -17,6 +17,7 @@ #include "llvotree.h" #include "pipeline.h" #include "llviewercamera.h" +#include "llglslshader.h" S32 LLDrawPoolTree::sDiffTex = 0; @@ -267,5 +268,5 @@ LLColor3 LLDrawPoolTree::getDebugColor() const S32 LLDrawPoolTree::getMaterialAttribIndex() { - return gPipeline.mObjectSimpleProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR]; + return gObjectSimpleProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR]; } diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 6e372b6f76..fd66d58851 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -28,6 +28,7 @@ #include "llworld.h" #include "pipeline.h" #include "viewer.h" // gSunTextureID, gMoonTextureID +#include "llglslshader.h" const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004"); @@ -71,12 +72,9 @@ LLDrawPool *LLDrawPoolWater::instancePool() void LLDrawPoolWater::prerender() { -#if 1 // 1.9.1 mVertexShaderLevel = gSavedSettings.getBOOL("RenderRippleWater") ? - gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT) : 0; -#else - mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT); -#endif + LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT) : 0; + } extern LLColor4U MAX_WATER_COLOR; @@ -319,7 +317,7 @@ void LLDrawPoolWater::renderShaderSimple() glEnableClientState(GL_NORMAL_ARRAY); // Set up second pass first - S32 bumpTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_BUMP_MAP); + S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP); mWaterImagep->addTextureStats(1024.f*1024.f); mWaterImagep->bind(bumpTex); @@ -368,7 +366,7 @@ void LLDrawPoolWater::renderShaderSimple() if (gSky.mVOSkyp->getCubeMap()) { - envTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + envTex = gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); gSky.mVOSkyp->getCubeMap()->bind(); glMatrixMode(GL_TEXTURE); @@ -382,9 +380,9 @@ void LLDrawPoolWater::renderShaderSimple() glMatrixMode(GL_MODELVIEW); } - S32 diffTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP); - gPipeline.mWaterProgram.bind(); + gWaterProgram.bind(); for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); iter != mDrawFace.end(); iter++) @@ -401,21 +399,21 @@ void LLDrawPoolWater::renderShaderSimple() if (gSky.mVOSkyp->getCubeMap()) { - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); } // Now, disable texture coord generation on texture state 1 - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_BUMP_MAP); + gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP); LLImageGL::unbindTexture(bumpTex, GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_GEN_S); //texture unit 1 glDisable(GL_TEXTURE_GEN_T); //texture unit 1 - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP); // Disable texture coordinate and color arrays LLImageGL::unbindTexture(diffTex, GL_TEXTURE_2D); @@ -546,17 +544,17 @@ void LLDrawPoolWater::shade() LLCubeMap* skyMap = gSky.mVOSkyp->getCubeMap(); - gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); skyMap->bind(); //bind normal map - S32 bumpTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_BUMP_MAP); + S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP); mWaterNormp->addTextureStats(1024.f*1024.f); mWaterNormp->bind(bumpTex); - gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_WATER_SCREENTEX); + gWaterProgram.enableTexture(LLShaderMgr::WATER_SCREENTEX); - gPipeline.mWaterProgram.bind(); + gWaterProgram.bind(); if (!sSkipScreenCopy) { @@ -567,20 +565,20 @@ void LLDrawPoolWater::shade() glBindTexture(GL_TEXTURE_2D, 0); } - glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_FBSCALE], 1, + glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_FBSCALE], 1, gPipeline.mScreenScale.mV); - S32 diffTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP); LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_TIME], sTime); - glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_SPECULAR], 1, light_diffuse.mV); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_SPECULAR_EXP], light_exp); - glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_EYEVEC], 1, gCamera->getOrigin().mV); - glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_WAVE_DIR1], 1, d1.mV); - glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_WAVE_DIR2], 1, d2.mV); - glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_LIGHT_DIR], 1, light_dir.mV); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_TIME], sTime); + glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR], 1, light_diffuse.mV); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR_EXP], light_exp); + glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_EYEVEC], 1, gCamera->getOrigin().mV); + glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR1], 1, d1.mV); + glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR2], 1, d2.mV); + glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_LIGHT_DIR], 1, light_dir.mV); LLColor4 water_color; LLVector3 camera_up = gCamera->getUpAxis(); @@ -588,12 +586,12 @@ void LLDrawPoolWater::shade() if (gCamera->cameraUnderWater()) { water_color.setVec(1.f, 1.f, 1.f, 0.4f); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_REFSCALE], 0.25f); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.25f); } else { water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot)); - glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_REFSCALE], 0.01f); + glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.01f); } if (water_color.mV[3] > 0.9f) { @@ -620,10 +618,10 @@ void LLDrawPoolWater::shade() } } - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_WATER_SCREENTEX); - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_BUMP_MAP); - gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_DIFFUSE_MAP); + gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB); + gWaterProgram.disableTexture(LLShaderMgr::WATER_SCREENTEX); + gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP); + gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP); glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 280abcd541..b3e68e24df 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -231,8 +231,6 @@ void LLFace::setDrawable(LLDrawable *drawable) void LLFace::setSize(const S32 num_vertices, const S32 num_indices) { - LLMemType mt1(LLMemType::MTYPE_DRAWABLE); - mGeomCount = num_vertices; mIndicesCount = num_indices; } @@ -950,17 +948,17 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } else { - if (mode & LLViewerTextureAnim::TRANSLATE) + //if (mode & LLViewerTextureAnim::TRANSLATE) { os = ot = 0.f; } - if (mode & LLViewerTextureAnim::ROTATE) + //if (mode & LLViewerTextureAnim::ROTATE) { r = 0.f; cos_ang = 1.f; sin_ang = 0.f; } - if (mode & LLViewerTextureAnim::SCALE) + //if (mode & LLViewerTextureAnim::SCALE) { ms = mt = 1.f; } diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 3c296615f6..22617a7fcc 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -390,7 +390,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) if (mPreviewRect.pointInRect(x, y)) { bringToFront( x, y ); - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); gViewerWindow->hideCursor(); mLastMouseX = x; mLastMouseY = y; @@ -405,7 +405,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask) { - gViewerWindow->setMouseCapture(FALSE, NULL); + gViewerWindow->setMouseCapture(FALSE); gViewerWindow->showCursor(); return LLFloater::handleMouseUp(x, y, mask); } @@ -417,7 +417,7 @@ BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask) { MASK local_mask = mask & ~MASK_ALT; - if (mAnimPreview && gViewerWindow->hasMouseCapture(this)) + if (mAnimPreview && hasMouseCapture()) { if (local_mask == MASK_PAN) { @@ -479,7 +479,7 @@ BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks) //----------------------------------------------------------------------------- // onMouseCaptureLost() //----------------------------------------------------------------------------- -void LLFloaterAnimPreview::onMouseCaptureLost(LLMouseHandler* handler) +void LLFloaterAnimPreview::onMouseCaptureLost() { gViewerWindow->showCursor(); } diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h index 40ec96f73d..858d586274 100644 --- a/indra/newview/llfloateranimpreview.h +++ b/indra/newview/llfloateranimpreview.h @@ -56,10 +56,10 @@ public: BOOL handleMouseUp(S32 x, S32 y, MASK mask); BOOL handleHover(S32 x, S32 y, MASK mask); BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); + void onMouseCaptureLost(); void refresh(); - static void onMouseCaptureLost(LLMouseHandler*); static void onBtnPlay(void*); static void onBtnStop(void*); static void setUploadAmount(S32 amount) { sUploadAmount = amount; } diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index de9432ee73..559b29379c 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -24,7 +24,7 @@ const S32 MIN_WIDTH = 200; const S32 MIN_HEIGHT = 340; const LLRect FLOATER_RECT(0, 380, 240, 0); -const char FLOATER_TITLE[] = "Choose Person"; +const char FLOATER_TITLE[] = "Choose Resident"; // static LLFloaterAvatarPicker* LLFloaterAvatarPicker::sInstance = NULL; @@ -89,9 +89,7 @@ BOOL LLFloaterAvatarPicker::postBuild() if (mListNames) { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null ); - row->addColumn("No results", LLFontGL::sSansSerif); - mListNames->addItem(row); + mListNames->addSimpleElement("No results"); } mInventoryPanel = (LLInventoryPanel*)this->getCtrlByNameAndType("Inventory Panel", WIDGET_TYPE_INVENTORY_PANEL); @@ -237,10 +235,7 @@ void LLFloaterAvatarPicker::find() if (mListNames) { mListNames->deleteAllItems(); - - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null ); - row->addColumn("Searching...", LLFontGL::sSansSerif); - mListNames->addItem(row); + mListNames->addSimpleElement("Searching..."); } childSetEnabled("Select", FALSE); @@ -305,23 +300,20 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, DB_FIRST_NAME_BUF_SIZE, first_name, i); msg->getStringFast(_PREHASH_Data,_PREHASH_LastName, DB_LAST_NAME_BUF_SIZE, last_name, i); - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, avatar_id ); - + LLString avatar_name; if (avatar_id.isNull()) { self->childSetTextArg("NotFound", "[TEXT]", self->childGetText("Edit")); - LLString msg = self->childGetValue("NotFound").asString(); - row->addColumn(msg, LLFontGL::sSansSerif); + avatar_name = self->childGetValue("NotFound").asString(); self->mListNames->setEnabled(FALSE); } else { - LLString buffer = LLString(first_name) + " " + last_name; - row->addColumn(buffer, LLFontGL::sSansSerif); + avatar_name = LLString(first_name) + " " + last_name; self->mListNames->setEnabled(TRUE); found_one = TRUE; } - self->mListNames->addItem(row); + self->mListNames->addSimpleElement(avatar_name); } if (found_one) diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index 969124a81c..68f002f9d9 100644 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -63,9 +63,10 @@ void LLFloaterBump::show(void *contents) if (gMeanCollisionList.isEmpty()) { LLString none_detected = sInstance->childGetText("none_detected"); - LLScrollListItem *item = new LLScrollListItem(); - item->addColumn(none_detected, LLFontGL::sSansSerifBold); - list->addItem(item); + LLSD row; + row["columns"][0]["value"] = none_detected; + row["columns"][0]["font-style"] = "BOLD"; + list->addElement(row); } else { @@ -132,7 +133,9 @@ void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd) text.setArg("[FIRST]", mcd->mFirstName); text.setArg("[LAST]", mcd->mLastName); - LLScrollListItem *item = new LLScrollListItem(TRUE, NULL, mcd->mPerp); - item->addColumn(text, LLFontGL::sSansSerifBold); - list->addItem(item); + LLSD row; + row["id"] = mcd->mPerp; + row["columns"][0]["value"] = text; + row["columns"][0]["font-style"] = "BOLD"; + list->addElement(row); } diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 03a94aed63..1ee8cd62ab 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -1261,14 +1261,12 @@ void LLFloaterBuyLandUI::refreshUI() } - //remove_contribution not in XML - ?! childSetValue("remove_contribution", LLSD(groupContributionEnough)); childSetEnabled("remove_contribution", groupContributionEnough); bool showRemoveContribution = mParcelIsGroupLand && (mParcelGroupContribution > 0); - childSetText("remove_contribution", - llformat("Remove %d square meters of contribution from group", - minContribution)); + childSetLabelArg("remove_contribution", "[AMOUNT]", + llformat("%d", minContribution)); childSetVisible("remove_contribution", showRemoveContribution); childShow("step_3"); diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 144833a3f5..8af0dd410f 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -554,11 +554,10 @@ void LLFloaterColorPicker::onColorSelect( const LLTextureEntry& te, void *data ) } } -void LLFloaterColorPicker::onMouseCaptureLost(LLMouseHandler *old_captor) +void LLFloaterColorPicker::onMouseCaptureLost() { - LLFloaterColorPicker* self = (LLFloaterColorPicker*)old_captor; - self->setMouseDownInHueRegion(FALSE); - self->setMouseDownInLumRegion(FALSE); + setMouseDownInHueRegion(FALSE); + setMouseDownInLumRegion(FALSE); } ////////////////////////////////////////////////////////////////////////////// @@ -942,7 +941,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask ) if ( rgbAreaRect.pointInRect ( x, y ) ) { - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); // mouse button down setMouseDownInHueRegion ( TRUE ); @@ -961,7 +960,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask ) if ( lumAreaRect.pointInRect ( x, y ) ) { - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); // mouse button down setMouseDownInLumRegion ( TRUE ); @@ -1174,9 +1173,9 @@ handleMouseUp ( S32 x, S32 y, MASK mask ) // mouse button not down in color swatch anymore mMouseDownInSwatch = false; - if (gViewerWindow->hasMouseCapture(this)) + if (hasMouseCapture()) { - gViewerWindow->setMouseCapture(NULL, NULL); + gViewerWindow->setMouseCapture(NULL); } // dispatch to base class for the rest of things diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index aa406c0dec..7660aa8c2d 100644 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -36,6 +36,7 @@ class LLFloaterColorPicker virtual BOOL handleMouseDown ( S32 x, S32 y, MASK mask ); virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask ); virtual BOOL handleHover ( S32 x, S32 y, MASK mask ); + virtual void onMouseCaptureLost(); virtual void onClose(bool app_quitting); // implicit methods @@ -94,7 +95,6 @@ class LLFloaterColorPicker F32 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn ); void setActive(BOOL active); - static void onMouseCaptureLost(LLMouseHandler* old_captor); protected: // callbacks diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index 3b7a868472..6065fc92c9 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -1325,11 +1325,10 @@ void LLPanelRequestTools::refresh() list->operateOnAll(LLCtrlListInterface::OP_DELETE); list->addSimpleElement(SELECTION); list->addSimpleElement(AGENT_REGION); - LLViewerRegion* regionp; - for(regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp != NULL; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; LLString name = regionp->getName(); if (!name.empty()) { @@ -1387,11 +1386,10 @@ void LLPanelRequestTools::onClickRequest(void* data) else { // find region by name - LLViewerRegion* regionp; - for(regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp != NULL; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if(dest == regionp->getName()) { // found it diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 2e77bbcfbd..f10abc4466 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -356,7 +356,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask) if (mPreviewRect.pointInRect(x, y)) { bringToFront( x, y ); - gViewerWindow->setMouseCapture(this, onMouseCaptureLost); + gViewerWindow->setMouseCapture(this); gViewerWindow->hideCursor(); mLastMouseX = x; mLastMouseY = y; @@ -371,7 +371,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterImagePreview::handleMouseUp(S32 x, S32 y, MASK mask) { - gViewerWindow->setMouseCapture(FALSE, NULL); + gViewerWindow->setMouseCapture(FALSE); gViewerWindow->showCursor(); return LLFloater::handleMouseUp(x, y, mask); } @@ -383,7 +383,7 @@ BOOL LLFloaterImagePreview::handleHover(S32 x, S32 y, MASK mask) { MASK local_mask = mask & ~MASK_ALT; - if (mAvatarPreview && gViewerWindow->hasMouseCapture(this)) + if (mAvatarPreview && hasMouseCapture()) { if (local_mask == MASK_PAN) { diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 77ebe88a09..45570f6aa2 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -392,8 +392,8 @@ BOOL LLPanelLandGeneral::postBuild() mBtnDeedToGroup->setClickedCallback(onClickDeed, this); - mCheckContributeWithDeed = LLUICtrlFactory::getCheckBoxByName(this, "check contib"); - childSetCommitCallback("check contib", onCommitAny, this); + mCheckContributeWithDeed = LLUICtrlFactory::getCheckBoxByName(this, "check contrib"); + childSetCommitCallback("check contrib", onCommitAny, this); @@ -1865,7 +1865,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata) } // static -void LLPanelLandObjects::onLostFocus(LLLineEditor *caller, void* user_data) +void LLPanelLandObjects::onLostFocus(LLUICtrl *caller, void* user_data) { LLPanelLandObjects *lop = (LLPanelLandObjects *)user_data; LLParcel* parcel = lop->mParcel->getParcel(); diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index b1aad89d7d..cfd009c335 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -234,7 +234,7 @@ public: static void onDoubleClickOwner(void*); static void onCommitList(LLUICtrl* ctrl, void* data); - static void onLostFocus(LLLineEditor* caller, void* user_data); + static void onLostFocus(LLUICtrl* caller, void* user_data); static void processParcelObjectOwnersReply(LLMessageSystem *msg, void **); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index ac77b3c3f0..92e005c0bb 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -504,7 +504,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview ) previewp->mSnapshotDelayTimer.hasExpired()); // don't take snapshots while ALT-zoom active - if (gFocusMgr.getMouseCapture() == gToolCamera) + if (gToolCamera->hasMouseCapture()) { previewp->mSnapshotActive = FALSE; } diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 63b1734642..0529507c35 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -928,7 +928,7 @@ void LLFloaterTools::setObjectType( void* data ) LLPCode pcode = *(LLPCode*) data; LLToolPlacer::setObjectType( pcode ); gSavedSettings.setBOOL("CreateToolCopySelection", FALSE); - gViewerWindow->setMouseCapture(NULL, NULL); + gViewerWindow->setMouseCapture(NULL); } // static diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index e9fa4cc1dd..31668b6d80 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -71,7 +71,7 @@ void copy_selected_item(void* user_data); void open_selected_items(void* user_data); void properties_selected_items(void* user_data); void paste_items(void* user_data); -void top_view_lost( LLView* handler ); +void renamer_focus_lost( LLUICtrl* handler, void* user_data ); ///---------------------------------------------------------------------------- /// Class LLFolderViewItem @@ -588,7 +588,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask ) { // No handler needed for focus lost since this class has no // state that depends on it. - gViewerWindow->setMouseCapture( this, NULL ); + gViewerWindow->setMouseCapture( this ); if (!mIsSelected) { @@ -623,7 +623,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask ) { - if( gViewerWindow->hasMouseCapture( this ) && isMovable() ) + if( hasMouseCapture() && isMovable() ) { S32 screen_x; S32 screen_y; @@ -723,10 +723,10 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask ) mSelectPending = FALSE; - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { getRoot()->setShowSelectionContext(FALSE); - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); } return TRUE; } @@ -1226,7 +1226,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter) } // when applying a filter, matching folders get their contents downloaded first - if (getRoot()->isFilterActive() && getFiltered(filter.getMinRequiredGeneration()) && !gInventory.isCategoryComplete(mListener->getUUID())) + if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && !gInventory.isCategoryComplete(mListener->getUUID())) { gInventory.startBackgroundFetch(mListener->getUUID()); } @@ -2596,9 +2596,9 @@ LLFolderView::~LLFolderView( void ) LLView::deleteViewByHandle(mPopupMenuHandle); - if(gViewerWindow->hasTopView(mRenamer)) + if(gViewerWindow->hasTopCtrl(mRenamer)) { - gViewerWindow->setTopView(NULL, NULL); + gViewerWindow->setTopCtrl(NULL); } mAutoOpenItems.removeAllNodes(); @@ -3175,7 +3175,7 @@ void LLFolderView::finishRenamingItem( void ) mRenamer->setFocus( FALSE ); mRenamer->setVisible( FALSE ); mRenamer->setCommitOnFocusLost( TRUE ); - gViewerWindow->setTopView( NULL, NULL ); + gViewerWindow->setTopCtrl( NULL ); if( mRenameItem ) { @@ -3193,7 +3193,7 @@ void LLFolderView::revertRenamingItem( void ) mRenamer->setFocus( FALSE ); mRenamer->setVisible( FALSE ); mRenamer->setCommitOnFocusLost( TRUE ); - gViewerWindow->setTopView( NULL, NULL ); + gViewerWindow->setTopCtrl( NULL ); if( mRenameItem ) { @@ -3591,7 +3591,8 @@ void LLFolderView::startRenamingSelectedItem( void ) mRenamer->setVisible( TRUE ); // set focus will fail unless item is visible mRenamer->setFocus( TRUE ); - gViewerWindow->setTopView( mRenamer, top_view_lost ); + mRenamer->setFocusLostCallback(renamer_focus_lost); + gViewerWindow->setTopCtrl( mRenamer ); } } @@ -3920,6 +3921,7 @@ void LLFolderView::onFocusLost( ) { gEditMenuHandler = NULL; } + LLUICtrl::onFocusLost(); } BOOL LLFolderView::search(LLFolderViewItem* first_item, const LLString &search_string, BOOL backward) @@ -4077,9 +4079,9 @@ BOOL LLFolderView::handleScrollWheel(S32 x, S32 y, S32 clicks) void LLFolderView::deleteAllChildren() { - if(gViewerWindow->hasTopView(mRenamer)) + if(gViewerWindow->hasTopCtrl(mRenamer)) { - gViewerWindow->setTopView(NULL, NULL); + gViewerWindow->setTopCtrl(NULL); } LLView::deleteViewByHandle(mPopupMenuHandle); mPopupMenuHandle = LLViewHandle::sDeadHandle; @@ -4219,7 +4221,7 @@ void LLFolderView::idle(void* user_data) self->mFilter.clearModified(); BOOL filter_modified_and_active = self->mCompletedFilterGeneration < self->mFilter.getCurrentGeneration() && - self->mFilter.isActive(); + self->mFilter.isNotDefault(); self->mNeedsAutoSelect = filter_modified_and_active && !(gFocusMgr.childHasKeyboardFocus(self) || gFocusMgr.getMouseCapture()); @@ -4288,6 +4290,12 @@ void LLFolderView::dumpSelectionInformation() bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b) { + // Sort 'system' / unmovable folders to the top. + if (a->isMovable() != b->isMovable()) + { + return b->isMovable(); + } + S32 compare = LLString::compareDict(a->getLabel(), b->getLabel()); if (0 == compare) { @@ -4303,6 +4311,12 @@ bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b) // of inventory items. bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b) { + // Sort 'system' / unmovable folders to the top. + if (a->isMovable() != b->isMovable()) + { + return b->isMovable(); + } + U32 first_create = a->getCreationDate(); U32 second_create = b->getCreationDate(); if (first_create == second_create) @@ -4315,9 +4329,12 @@ bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b) } } -void top_view_lost( LLView* view ) +void renamer_focus_lost( LLUICtrl* ctrl, void* userdata) { - if( view ) view->setVisible( FALSE ); + if( ctrl ) + { + ctrl->setVisible( FALSE ); + } } void delete_selected_item(void* user_data) @@ -4453,7 +4470,7 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const } // has user modified default filter params? -BOOL LLInventoryFilter::isActive() +BOOL LLInventoryFilter::isNotDefault() { return mFilterOps.mFilterTypes != mDefaultFilterOps.mFilterTypes || mFilterSubString.size() @@ -4463,6 +4480,16 @@ BOOL LLInventoryFilter::isActive() || mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo; } +BOOL LLInventoryFilter::isActive() +{ + return mFilterOps.mFilterTypes != 0xffffffff + || mFilterSubString.size() + || mFilterOps.mPermissions != PERM_NONE + || mFilterOps.mMinDate != 0 + || mFilterOps.mMaxDate != U32_MAX + || mFilterOps.mHoursAgo != 0; +} + BOOL LLInventoryFilter::isModified() { return mModified; @@ -4672,7 +4699,7 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior) mFilterBehavior = FILTER_RESTART; } - if (isActive()) + if (isNotDefault()) { // if not keeping current filter results, update last valid as well switch(mFilterBehavior) diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 84dcddedbb..76784f1ac9 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -191,6 +191,7 @@ public: BOOL check(LLFolderViewItem* item); std::string::size_type getStringMatchOffset() const; BOOL isActive(); + BOOL isNotDefault(); BOOL isModified(); BOOL isModifiedAndClear(); BOOL isSinceLogoff(); @@ -678,7 +679,7 @@ public: PermissionMask getFilterPermissions() const { return mFilter.getFilterPermissions(); } LLInventoryFilter::EFolderShow getShowFolderState() { return mFilter.getShowFolderState(); } U32 getSortOrder() const; - BOOL isFilterActive() { return mFilter.isActive(); } + BOOL isFilterModified() { return mFilter.isNotDefault(); } BOOL getAllowMultiSelect() { return mAllowMultiSelect; } // Close all folders in the view diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 83c08ec602..9ab9a3f6bb 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -570,7 +570,7 @@ void LLFloaterIMPanel::onInputEditorFocusReceived( LLUICtrl* caller, void* userd } // static -void LLFloaterIMPanel::onInputEditorFocusLost(LLLineEditor* caller, void* userdata) +void LLFloaterIMPanel::onInputEditorFocusLost(LLUICtrl* caller, void* userdata) { LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata; self->setTyping(FALSE); diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h index d54ac794b7..21a0cbcd41 100644 --- a/indra/newview/llimpanel.h +++ b/indra/newview/llimpanel.h @@ -59,7 +59,7 @@ public: LLString& tooltip_msg); static void onInputEditorFocusReceived( LLUICtrl* caller, void* userdata ); - static void onInputEditorFocusLost(LLLineEditor* caller, void* userdata); + static void onInputEditorFocusLost(LLUICtrl* caller, void* userdata); static void onInputEditorKeystroke(LLLineEditor* caller, void* userdata); static void onTabClick( void* userdata ); diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index a9b5e6e124..ce6c85d3fd 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -115,7 +115,7 @@ BOOL LLJoystick::handleMouseUp(S32 x, S32 y, MASK mask) { // llinfos << "joystick mouse up " << x << ", " << y << llendl; - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { mLastMouse.set(x, y); mHeldDown = FALSE; @@ -128,7 +128,7 @@ BOOL LLJoystick::handleMouseUp(S32 x, S32 y, MASK mask) BOOL LLJoystick::handleHover(S32 x, S32 y, MASK mask) { - if( gViewerWindow->hasMouseCapture( this ) ) + if( hasMouseCapture() ) { mLastMouse.set(x, y); } @@ -153,7 +153,9 @@ void LLJoystick::onHeldDown(void *userdata) { LLJoystick *self = (LLJoystick *)userdata; - llassert( gViewerWindow->hasMouseCapture( self ) ); + // somebody removed this function without checking the + // build. Removed 2007-03-26. + //llassert( gViewerWindow->hasMouseCapture( self ) ); self->mHeldDown = TRUE; self->onHeldDown(); diff --git a/indra/newview/llnameeditor.cpp b/indra/newview/llnameeditor.cpp index ade4cf3473..923cd99d21 100644 --- a/indra/newview/llnameeditor.cpp +++ b/indra/newview/llnameeditor.cpp @@ -30,7 +30,7 @@ LLNameEditor::LLNameEditor(const std::string& name, const LLRect& rect, S32 max_text_length, void (*commit_callback)(LLUICtrl* caller, void* user_data), void (*keystroke_callback)(LLLineEditor* caller, void* user_data), - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data), + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data), void* userdata, LLLinePrevalidateFunc prevalidate_func, LLViewBorder::EBevel border_bevel, diff --git a/indra/newview/llnameeditor.h b/indra/newview/llnameeditor.h index b5e811fba4..b6ea2e7728 100644 --- a/indra/newview/llnameeditor.h +++ b/indra/newview/llnameeditor.h @@ -30,7 +30,7 @@ public: S32 max_text_length = 254, void (*commit_callback)(LLUICtrl* caller, void* user_data) = NULL, void (*keystroke_callback)(LLLineEditor* caller, void* user_data) = NULL, - void (*focus_lost_callback)(LLLineEditor* caller, void* user_data) = NULL, + void (*focus_lost_callback)(LLUICtrl* caller, void* user_data) = NULL, void* userdata = NULL, LLLinePrevalidateFunc prevalidate_func = NULL, LLViewBorder::EBevel border_bevel = LLViewBorder::BEVEL_IN, diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index ddf88c94df..eabb9e0b23 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -158,6 +158,13 @@ BOOL LLNameListCtrl::addNameItem(LLScrollListItem* item, EAddPosition pos) addItem(item, pos); + // this column is resizable + LLScrollListColumn* columnp = getColumn(mNameColumnIndex); + if (columnp && columnp->mHeader) + { + columnp->mHeader->setHasResizableElement(TRUE); + } + return result; } @@ -178,6 +185,15 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& value, EAddPosition pos LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex); ((LLScrollListText*)cell)->setText( fullname ); + updateMaxContentWidth(item); + + // this column is resizable + LLScrollListColumn* columnp = getColumn(mNameColumnIndex); + if (columnp && columnp->mHeader) + { + columnp->mHeader->setHasResizableElement(TRUE); + } + return item; } @@ -222,6 +238,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const char* first, cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex); ((LLScrollListText*)cell)->setText( fullname ); + updateMaxContentWidth(item); } } } @@ -299,13 +316,6 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto node->getAttributeS32("heading_height", heading_height); name_list->setHeadingHeight(heading_height); } - if (node->hasAttribute("heading_font")) - { - LLString heading_font(""); - node->getAttributeString("heading_font", heading_font); - LLFontGL* gl_font = LLFontGL::fontFromName(heading_font.c_str()); - name_list->setHeadingFont(gl_font); - } name_list->setCollapseEmptyColumns(collapse_empty_columns); BOOL allow_calling_card_drop = FALSE; @@ -344,8 +354,12 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto columns[index]["width"] = columnwidth; } + LLFontGL::HAlign h_align = LLFontGL::LEFT; + h_align = LLView::selectFontHAlign(child); + columns[index]["name"] = columnname; columns[index]["label"] = labelname; + columns[index]["halign"] = (S32)h_align; index++; } } diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index b03996d460..1050070f81 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -255,12 +255,10 @@ void LLNetMap::draw() // figure out where agent is S32 region_width = llround(gWorldPointer->getRegionWidthInMeters()); - LLViewerRegion *regionp; - - for (regionp = gWorldPointer->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldPointer->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; // Find x and y position relative to camera's center. LLVector3 origin_agent = regionp->getOriginAgent(); LLVector3 rel_region_pos = origin_agent - gAgent.getCameraPositionAgent(); @@ -374,10 +372,10 @@ void LLNetMap::draw() LLVector3 pos_map; // Draw avatars - for (regionp = gWorldPointer->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldPointer->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; const LLVector3d& origin_global = regionp->getOriginGlobal(); S32 count = regionp->mMapAvatars.count(); diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index ce9f6b18b2..05bd59593d 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -59,7 +59,7 @@ #include "llvieweruictrlfactory.h" // Statics -LLLinkedList<LLPanelAvatar> LLPanelAvatar::sAllPanels; +std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels; BOOL LLPanelAvatar::sAllowFirstLife = FALSE; //----------------------------------------------------------------------------- @@ -1220,7 +1220,7 @@ LLPanelAvatar::LLPanelAvatar( mDisableRate(FALSE) { - sAllPanels.addData(this); + sAllPanels.push_back(this); LLCallbackMap::map_t factory_map; @@ -1272,7 +1272,7 @@ BOOL LLPanelAvatar::postBuild(void) LLPanelAvatar::~LLPanelAvatar() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -1503,7 +1503,6 @@ void LLPanelAvatar::resetGroupList() if (mPanelSecondLife && group_list) { group_list->deleteAllItems(); - LLScrollListItem* item; S32 count = gAgent.mGroups.count(); LLUUID id; @@ -1525,9 +1524,12 @@ void LLPanelAvatar::resetGroupList() */ group_string += group_data.mName; - item = new LLScrollListItem(TRUE, NULL, id); - item->addColumn(group_string, LLFontGL::sSansSerifSmall, 0, LLFontGL::NORMAL); - group_list->addItem(item); + + LLSD row; + row["columns"][0]["value"] = group_string; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = 0; + group_list->addElement(row); } group_list->sortByColumn(0, TRUE); } @@ -1728,8 +1730,6 @@ void LLPanelAvatar::sendAvatarNotesUpdate() // static void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) { - LLPanelAvatar* self = NULL; - LLUUID agent_id; // your id LLUUID avatar_id; // target of this panel LLUUID image_id; @@ -1753,8 +1753,9 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != avatar_id) { continue; @@ -1876,8 +1877,6 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) // static void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**) { - LLPanelAvatar* self = NULL; - LLUUID agent_id; // your id LLUUID avatar_id; // target of this panel @@ -1892,8 +1891,9 @@ void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**) msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != avatar_id) { continue; @@ -1921,15 +1921,15 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**) LLUUID group_id; char group_name[DB_GROUP_NAME_BUF_SIZE]; /*Flawfinder: ignore*/ LLUUID group_insignia_id; - const LLFontGL* FONT = LLFontGL::sSansSerifSmall; llinfos << "groups packet size " << msg->getReceiveSize() << llendl; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id ); - for (LLPanelAvatar* self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != avatar_id) { continue; @@ -1977,9 +1977,15 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**) group_list->deleteSingleItem(index); } } - LLScrollListItem *group_item = new LLScrollListItem(TRUE, NULL, group_id); - group_item->addColumn(group_string, FONT); - if(group_list) group_list->addItem(group_item); + + LLSD row; + row["id"] = group_id; + row["columns"][0]["value"] = group_string; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + if (group_list) + { + group_list->addElement(row); + } } } if(group_list) group_list->sortByColumn(0, TRUE); @@ -2107,10 +2113,9 @@ void LLPanelAvatar::processAvatarStatisticsReply(LLMessageSystem *msg, void**) msg->getUUIDFast(_PREHASH_AvatarData, _PREHASH_AvatarID, avatar_id); // look up all panels which have this avatar - LLPanelAvatar *self = NULL; - - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != avatar_id) { continue; @@ -2126,8 +2131,6 @@ void LLPanelAvatar::processAvatarStatisticsReply(LLMessageSystem *msg, void**) ratings_list->deleteAllItems(); } // build the item list - LLFontGL *font = LLFontGL::sSansSerifSmall; - S32 items = msg->getNumberOfBlocksFast(_PREHASH_StatisticsData); for (S32 i = 0; i < items; i++) { @@ -2141,18 +2144,22 @@ void LLPanelAvatar::processAvatarStatisticsReply(LLMessageSystem *msg, void**) msg->getS32( "StatisticsData", "Positive", positive, i); msg->getS32( "StatisticsData", "Negative", negative, i); - LLScrollListItem *item = NULL; - const S32 TEXT_WIDTH = 75; - item = new LLScrollListItem(); - item->addColumn( name, font, TEXT_WIDTH ); - - snprintf( value_string, sizeof(value_string), "+%d", positive); /* Flawfinder: ignore */ - item->addColumn( value_string, font, 50 ); - - item->addColumn("", font); // extra column to force striped appearance - if(ratings_list) ratings_list->addItem( item ); + LLSD row; + row["columns"][0]["value"] = name; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + row["columns"][0]["width"] = TEXT_WIDTH; + row["columns"][1]["value"] = value_string; + row["columns"][1]["font"] = "SANSSERIF_SMALL"; + row["columns"][1]["width"] = 50; + row["columns"][2]["value"] = ""; + row["columns"][2]["font"] = "SANSSERIF_SMALL"; + + if(ratings_list) + { + ratings_list->addElement( row ); + } } } } @@ -2168,10 +2175,9 @@ void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**) msg->getUUID("Data", "TargetID", target_id); // look up all panels which have this avatar - LLPanelAvatar *self = NULL; - - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != target_id) { continue; @@ -2187,7 +2193,6 @@ void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**) void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** userdata) { - LLPanelAvatar *self = NULL; LLUUID agent_id; LLUUID target_id; @@ -2195,8 +2200,9 @@ void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** us msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TargetID, target_id); // look up all panels which have this avatar target - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != target_id) { continue; @@ -2208,7 +2214,6 @@ void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** us void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdata) { - LLPanelAvatar *self = NULL; LLUUID agent_id; LLUUID target_id; @@ -2216,8 +2221,9 @@ void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdat msg->getUUID("AgentData", "TargetID", target_id); // look up all panels which have this avatar target - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelAvatar* self = *iter; if (self->mAvatarID != target_id) { continue; diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index 9b1f6e23e1..be6feebc30 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -339,7 +339,8 @@ protected: BOOL mAllowEdit; BOOL mDisableRate; - static LLLinkedList<LLPanelAvatar> sAllPanels; + typedef std::list<LLPanelAvatar*> panel_list_t; + static panel_list_t sAllPanels; }; // helper funcs diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index f1aed81df1..5c5e0479d4 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -72,7 +72,7 @@ public: static LLDispatchClassifiedClickThrough sClassifiedClickThrough; //static -LLLinkedList<LLPanelClassified> LLPanelClassified::sAllPanels; +std::list<LLPanelClassified*> LLPanelClassified::sAllPanels; LLPanelClassified::LLPanelClassified(BOOL in_finder) : LLPanel("Classified Panel"), @@ -99,7 +99,7 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder) mSetBtn(NULL), mClickThroughText(NULL) { - sAllPanels.addData(this); + sAllPanels.push_back(this); std::string classified_def_file; if (mInFinder) @@ -119,7 +119,7 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder) LLPanelClassified::~LLPanelClassified() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -300,9 +300,9 @@ void LLPanelClassified::setClickThrough(const LLUUID& classified_id, S32 map, S32 profile) { - LLPanelClassified *self = NULL; - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) - { + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + { + LLPanelClassified* self = *iter; // For top picks, must match pick id if (self->mClassifiedID != classified_id) { @@ -483,9 +483,9 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void ** msg->getS32("Data", "PriceForListing", price_for_listing); // Look up the panel to fill in - LLPanelClassified *self = NULL; - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) - { + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + { + LLPanelClassified* self = *iter; // For top picks, must match pick id if (self->mClassifiedID != classified_id) { diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h index 6d5be1df09..c959c0f82f 100644 --- a/indra/newview/llpanelclassified.h +++ b/indra/newview/llpanelclassified.h @@ -123,7 +123,8 @@ protected: LLTextBox* mClickThroughText; LLRect mSnapshotSize; - static LLLinkedList<LLPanelClassified> sAllPanels; + typedef std::list<LLPanelClassified*> panel_list_t; + static panel_list_t sAllPanels; }; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 56c97d0689..9d40357544 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -683,12 +683,14 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) } else { - LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null ); std::stringstream pending; pending << "Retrieving member list (" << gdatap->mMembers.size() << "\\" << gdatap->mMemberCount << ")"; - row->addColumn(pending.str(), LLFontGL::sSansSerif); + + LLSD row; + row["columns"][0]["value"] = pending.str(); + mListVisibleMembers->setEnabled(FALSE); - mListVisibleMembers->addItem(row); + mListVisibleMembers->addElement(row); } } } diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 231551a756..12ac66e9fb 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -99,11 +99,11 @@ void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names, } //add the name to the names list - const BOOL enabled = TRUE; - LLScrollListItem* row = new LLScrollListItem( - enabled, NULL, id); - row->addColumn(name.c_str(), LLFontGL::sSansSerif); - mInvitees->addItem(row); + LLSD row; + row["id"] = id; + row["columns"][0]["value"] = name; + + mInvitees->addElement(row); } } diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index c60a69eb21..a05f7c54c6 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -36,7 +36,7 @@ #include "llviewerwindow.h" //static -LLLinkedList<LLPanelPick> LLPanelPick::sAllPanels; +std::list<LLPanelPick*> LLPanelPick::sAllPanels; LLPanelPick::LLPanelPick(BOOL top_pick) : LLPanel("Top Picks Panel"), @@ -59,7 +59,7 @@ LLPanelPick::LLPanelPick(BOOL top_pick) mEnabledCheck(NULL), mSetBtn(NULL) { - sAllPanels.addData(this); + sAllPanels.push_back(this); std::string pick_def_file; if (top_pick) @@ -75,7 +75,7 @@ LLPanelPick::LLPanelPick(BOOL top_pick) LLPanelPick::~LLPanelPick() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -315,9 +315,9 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **) msg->getBOOL("Data", "Enabled", enabled); // Look up the panel to fill in - LLPanelPick *self = NULL; - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) - { + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) + { + LLPanelPick* self = *iter; // For top picks, must match pick id if (self->mPickID != pick_id) { diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h index bdc7ef1f3e..a347133be6 100644 --- a/indra/newview/llpanelpick.h +++ b/indra/newview/llpanelpick.h @@ -93,7 +93,8 @@ protected: LLCheckBoxCtrl* mEnabledCheck; LLButton* mSetBtn; - static LLLinkedList<LLPanelPick> sAllPanels; + typedef std::list<LLPanelPick*> panel_list_t; + static panel_list_t sAllPanels; }; #endif // LL_LLPANELPICK_H diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp index 905cc61560..d9c29fccdf 100644 --- a/indra/newview/llpanelplace.cpp +++ b/indra/newview/llpanelplace.cpp @@ -32,7 +32,7 @@ #include "llweb.h" //static -LLLinkedList<LLPanelPlace> LLPanelPlace::sAllPanels; +std::list<LLPanelPlace*> LLPanelPlace::sAllPanels; LLPanelPlace::LLPanelPlace() : LLPanel("Places Panel"), @@ -40,13 +40,13 @@ LLPanelPlace::LLPanelPlace() mPosGlobal(), mAuctionID(0) { - sAllPanels.addData(this); + sAllPanels.push_back(this); } LLPanelPlace::~LLPanelPlace() { - sAllPanels.removeData(this); + sAllPanels.remove(this); } @@ -139,10 +139,9 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **) msg->getUUID("Data", "ParcelID", parcel_id); // look up all panels which have this avatar - LLPanelPlace *self = NULL; - - for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData()) + for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter) { + LLPanelPlace* self = *iter; if (self->mParcelID != parcel_id) { continue; diff --git a/indra/newview/llpanelplace.h b/indra/newview/llpanelplace.h index b45aef3e87..49dc518cc7 100644 --- a/indra/newview/llpanelplace.h +++ b/indra/newview/llpanelplace.h @@ -64,7 +64,8 @@ protected: //LLButton* mLandmarkBtn; LLButton* mAuctionBtn; - static LLLinkedList<LLPanelPlace> sAllPanels; + typedef std::list<LLPanelPlace*> panel_list_t; + static panel_list_t sAllPanels; }; #endif // LL_LLPANELPLACE_H diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 91df61ca91..52ce263e59 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -309,7 +309,7 @@ BOOL LLPreview::handleMouseDown(S32 x, S32 y, MASK mask) // No handler needed for focus lost since this class has no // state that depends on it. bringToFront(x, y); - gFocusMgr.setMouseCapture(this, NULL); + gFocusMgr.setMouseCapture(this); S32 screen_x; S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y ); @@ -321,9 +321,9 @@ BOOL LLPreview::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLPreview::handleMouseUp(S32 x, S32 y, MASK mask) { - if(gFocusMgr.getMouseCapture() == this) + if(hasMouseCapture()) { - gFocusMgr.setMouseCapture(NULL, NULL); + gFocusMgr.setMouseCapture(NULL); return TRUE; } return LLFloater::handleMouseUp(x, y, mask); @@ -331,7 +331,7 @@ BOOL LLPreview::handleMouseUp(S32 x, S32 y, MASK mask) BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask) { - if(gFocusMgr.getMouseCapture() == this) + if(hasMouseCapture()) { S32 screen_x; S32 screen_y; diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 6a6b07425f..39e32c31f5 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -1023,11 +1023,11 @@ void LLPreviewGesture::loadUIFromGesture(LLMultiGesture* gesture) if (!new_step) continue; // Create an enabled item with this step - LLScrollListItem* item = new LLScrollListItem(TRUE, new_step); - item->addColumn(new_step->getLabel(), LLFontGL::sSansSerifSmall); - - // Add item to bottom of list - mStepList->addItem(item, ADD_BOTTOM); + LLSD row; + row["columns"][0]["value"] = new_step->getLabel(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + LLScrollListItem* item = mStepList->addElement(row); + item->setUserdata(new_step); } } @@ -1572,12 +1572,11 @@ LLScrollListItem* LLPreviewGesture::addStep(const std::string& library_text) } // Create an enabled item with this step - LLScrollListItem* step_item = new LLScrollListItem(TRUE, step); - std::string label = step->getLabel(); - step_item->addColumn(label, LLFontGL::sSansSerifSmall); - - // Add item to bottom of list - mStepList->addItem(step_item, ADD_BOTTOM); + LLSD row; + row["columns"][0]["value"] = step->getLabel(); + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + LLScrollListItem* step_item = mStepList->addElement(row); + step_item->setUserdata(step); // And move selection to the list on the right mLibraryList->deselectAllItems(); diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 51ca007d75..97b4a982d2 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -859,15 +859,14 @@ void LLPreviewLSL::callbackLSLCompileFailed(const LLSD& compile_errors) { llinfos << "Compile failed!" << llendl; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); - LLScrollListItem* item = NULL; for(LLSD::array_const_iterator line = compile_errors.beginArray(); line < compile_errors.endArray(); line++) { - item = new LLScrollListItem(); - item->addColumn(line->asString(), err_font); - mScriptEd->mErrorList->addItem(item); + LLSD row; + row["columns"][0]["value"] = line->asString(); + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } mScriptEd->selectFirstError(); closeIfNeeded(); @@ -992,9 +991,11 @@ void LLPreviewLSL::saveIfNeeded() if(!fp) { llwarns << "Unable to write to " << filename << llendl; - LLScrollListItem* item = new LLScrollListItem(); - item->addColumn("Error writing to local file. Is your hard drive full?", LLFontGL::sSansSerifSmall); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + mScriptEd->mErrorList->addElement(row); return; } @@ -1049,8 +1050,6 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename, std::string dst_filename = llformat("%s.lso", filepath.c_str()); std::string err_filename = llformat("%s.out", filepath.c_str()); - LLScrollListItem* item = NULL; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); if(!lscript_compile(filename.c_str(), dst_filename.c_str(), err_filename.c_str(), @@ -1082,9 +1081,11 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename, { line.assign(buffer); LLString::stripNonprintable(line); - item = new LLScrollListItem(); - item->addColumn(line, err_font); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = line; + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } } fclose(fp); @@ -1176,9 +1177,10 @@ void LLPreviewLSL::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_d { if (self) { - LLScrollListItem* item = new LLScrollListItem(); - item->addColumn("Compile successful!", LLFontGL::sSansSerifSmall); - self->mScriptEd->mErrorList->addItem(item); + LLSD row; + row["columns"][0]["value"] = "Compile successful!"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + self->mScriptEd->mErrorList->addElement(row); // Find our window and close it if requested. self->getWindow()->decBusyCount(); @@ -1399,15 +1401,14 @@ void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id, void LLLiveLSLEditor::callbackLSLCompileFailed(const LLSD& compile_errors) { lldebugs << "Compile failed!" << llendl; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); - LLScrollListItem* item = NULL; for(LLSD::array_const_iterator line = compile_errors.beginArray(); line < compile_errors.endArray(); line++) { - item = new LLScrollListItem(); - item->addColumn(line->asString(), err_font); - mScriptEd->mErrorList->addItem(item); + LLSD row; + row["columns"][0]["value"] = line->asString(); + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } mScriptEd->selectFirstError(); closeIfNeeded(); @@ -1769,9 +1770,11 @@ void LLLiveLSLEditor::saveIfNeeded() if(!fp) { llwarns << "Unable to write to " << filename << llendl; - LLScrollListItem* item = new LLScrollListItem(); - item->addColumn("Error writing to local file. Is your hard drive full?", LLFontGL::sSansSerifSmall); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; + row["columns"][0]["font"] = "SANSSERIF_SMALL"; + mScriptEd->mErrorList->addElement(row); return; } LLString utf8text = mScriptEd->mEditor->getText(); @@ -1829,8 +1832,6 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename, std::string dst_filename = llformat("%s.lso", filepath.c_str()); std::string err_filename = llformat("%s.out", filepath.c_str()); - LLScrollListItem* item = NULL; - const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA); FILE *fp; if(!lscript_compile(filename.c_str(), dst_filename.c_str(), @@ -1859,9 +1860,11 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename, { line.assign(buffer); LLString::stripNonprintable(line); - item = new LLScrollListItem(); - item->addColumn(line, err_font); - mScriptEd->mErrorList->addItem(item); + + LLSD row; + row["columns"][0]["value"] = line; + row["columns"][0]["font"] = "OCRA"; + mScriptEd->mErrorList->addElement(row); } } fclose(fp); diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 1172bd8cf0..3bfe913ab4 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -42,7 +42,7 @@ const S32 ANIMATION_FRAMES = 1; //13; // XUI:translate LLProgressView::LLProgressView(const std::string& name, const LLRect &rect) -: LLView(name, rect, TRUE) +: LLPanel(name, rect, FALSE) { mPercentDone = 0.f; mDrawBackground = TRUE; @@ -119,7 +119,7 @@ void LLProgressView::setVisible(BOOL visible) } else if (!getVisible() && visible) { - gFocusMgr.setTopView(this, NULL); + gFocusMgr.setTopCtrl(this); mFadeTimer.stop(); mProgressTimer.start(); LLView::setVisible(visible); @@ -183,7 +183,7 @@ void LLProgressView::draw() LLView::draw(); if (mFadeTimer.getElapsedTimeF32() > FADE_IN_TIME) { - gFocusMgr.removeTopViewWithoutCallback(this); + gFocusMgr.removeTopCtrlWithoutCallback(this); LLView::setVisible(FALSE); gStartImageGL = NULL; } diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 474a431b09..455256a665 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -9,13 +9,13 @@ #ifndef LL_LLPROGRESSVIEW_H #define LL_LLPROGRESSVIEW_H -#include "llview.h" +#include "llpanel.h" #include "llframetimer.h" class LLImageRaw; class LLButton; -class LLProgressView : public LLView +class LLProgressView : public LLPanel { public: LLProgressView(const std::string& name, const LLRect& rect); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index c14b4461d6..a38bfc3600 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -133,8 +133,8 @@ struct LLDeRezInfo LLObjectSelection* get_null_object_selection() { - static LLObjectSelectionHandle null_ptr(new LLObjectSelection()); - return (LLObjectSelection*)null_ptr; + static LLObjectSelection null_selection; + return &null_selection;; } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 98b4c4ef42..d8d9f1c5d6 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -140,11 +140,6 @@ void LLSpatialGroup::clearDrawMap() mDrawMap.clear(); } -BOOL LLSpatialGroup::safeToDelete() -{ - return gQuit || !isState(IN_QUEUE | ACTIVE_OCCLUSION | RESHADOW_QUEUE); -} - class LLRelightPainter : public LLSpatialGroup::OctreeTraveler { public: @@ -330,7 +325,6 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate) unbound(); setState(OBJECT_DIRTY); setState(GEOM_DIRTY); - gPipeline.markRebuild(this); validate_drawable(drawablep); return TRUE; } @@ -351,13 +345,15 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc drawablep->setSpatialGroup(this, 0); validate_drawable(drawablep); setState(OBJECT_DIRTY | GEOM_DIRTY); - gPipeline.markRebuild(this); mLastAddTime = gFrameTimeSeconds; if (drawablep->isSpatialBridge()) { mBridgeList.push_back((LLSpatialBridge*) drawablep); } - setState(IMAGE_DIRTY); + if (drawablep->getRadius() > 1.f) + { + setState(IMAGE_DIRTY); + } } return TRUE; @@ -560,7 +556,6 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree) { drawablep->setSpatialGroup(NULL, -1); setState(GEOM_DIRTY); - gPipeline.markRebuild(this); if (drawablep->isSpatialBridge()) { for (bridge_list_t::iterator i = mBridgeList.begin(); i != mBridgeList.end(); ++i) @@ -589,7 +584,6 @@ void LLSpatialGroup::shift(const LLVector3 &offset) mObjectExtents[0] += offset; mObjectExtents[1] += offset; - gPipeline.markRebuild(this); setState(GEOM_DIRTY | MATRIX_DIRTY | OCCLUSION_DIRTY); } @@ -1610,66 +1604,6 @@ BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group) return TRUE; } -void LLSpatialPartition::processGeometry(LLCamera* camera) -{ - if (!mRenderByGroup || mBufferUsage == GL_STREAM_DRAW_ARB) - { - return; - } - - U32 process_count = 8; - - LLSpatialGroup* root = (LLSpatialGroup*) mOctree->getListener(0); - if (mUpdateQueue.empty()) - { - root->setState(LLSpatialGroup::IN_GEOMETRY_QUEUE); - mUpdateQueue.push(root); - } - - while (process_count > 0 && !mUpdateQueue.empty()) - { - process_count--; - LLPointer<LLSpatialGroup> group = mUpdateQueue.front(); - mUpdateQueue.pop(); - - group->clearState(LLSpatialGroup::IN_GEOMETRY_QUEUE); - - if (group->isDead()) - { - continue; - } - - //push children onto queue - for (U32 i = 0; i < group->mOctreeNode->getChildCount(); i++) - { - LLSpatialGroup* child = (LLSpatialGroup*) group->mOctreeNode->getChild(i)->getListener(0); - - if (!child->isState(LLSpatialGroup::IN_GEOMETRY_QUEUE)) - { - child->setState(LLSpatialGroup::IN_GEOMETRY_QUEUE); - mUpdateQueue.push(child); - } - } - - if (!group->isDead() && !group->isVisible()) - { - if (!group->isState(LLSpatialGroup::OBJECT_DIRTY) && - group->mBufferUsage != GL_STREAM_DRAW_ARB) - { - group->updateDistance(*camera); - for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i) - { - LLDrawable* drawablep = *i; - if (!drawablep->isDead()) - { - drawablep->updateDistance(*camera); - } - } - } - } - } -} - void LLSpatialPartition::markReimage(LLSpatialGroup* group) { if (mImageEnabled && group->isState(LLSpatialGroup::IMAGE_DIRTY)) @@ -1731,7 +1665,6 @@ void LLSpatialPartition::processImagery(LLCamera* camera) gPipeline.blurReflectionMap(gPipeline.mCubeBuffer, cube_map, res); group->mReflectionMap = cube_map; group->setState(LLSpatialGroup::GEOM_DIRTY); - gPipeline.markRebuild(group); } group->clearState(LLSpatialGroup::IMAGE_DIRTY); diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 6a795d4c6c..c65f4063bf 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -134,9 +134,8 @@ public: SKIP_FRUSTUM_CHECK = 0x00040000, OCCLUSION_DIRTY = 0x00080000, BELOW_WATER = 0x00100000, - IN_GEOMETRY_QUEUE = 0x00200000, - IN_IMAGE_QUEUE = 0x00400000, - IMAGE_DIRTY = 0x00800000, + IN_IMAGE_QUEUE = 0x00200000, + IMAGE_DIRTY = 0x00400000, } eSpatialState; typedef enum @@ -147,7 +146,6 @@ public: } eSetStateMode; LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part); - BOOL safeToDelete(); virtual ~LLSpatialGroup(); BOOL isDead() { return isState(DEAD); } @@ -265,7 +263,6 @@ public: S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum BOOL checkOcclusion(LLSpatialGroup* group, LLCamera* camera); void markReimage(LLSpatialGroup* group); - void processGeometry(LLCamera* camera); void processImagery(LLCamera* camera); void processOcclusion(LLCamera* camera); void buildOcclusion(); @@ -293,9 +290,6 @@ protected: typedef std::queue<LLPointer<LLSpatialGroup> > spatial_group_queue_t; spatial_group_queue_t mOcclusionQueue; - //things that need a terse update - spatial_group_queue_t mUpdateQueue; - //things that need an image update spatial_group_queue_t mImageQueue; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 92f39f265e..f315869437 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -214,7 +214,7 @@ void callback_choose_gender(S32 option, void* userdata); void init_start_screen(S32 location_id); void release_start_screen(); void process_connect_to_userserver(LLMessageSystem* msg, void**); - +void reset_login(); // // exported functionality @@ -854,7 +854,7 @@ BOOL idle_startup() args["[HOST_NAME]"] = host_name; gViewerWindow->alertXml("UnableToConnect", args, login_alert_done ); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); return FALSE; } break; @@ -891,7 +891,7 @@ BOOL idle_startup() login_alert_status, NULL); // Back up to login screen - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gViewerStats->incStat(LLViewerStats::ST_LOGIN_TIMEOUT_COUNT); } ms_sleep(1); @@ -907,7 +907,7 @@ BOOL idle_startup() gViewerWindow->alertXml("PleaseSelectServer", args, login_alert_done ); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); return FALSE; } @@ -1055,7 +1055,7 @@ BOOL idle_startup() NULL); // Back up to login screen - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gViewerStats->incStat(LLViewerStats::ST_LOGIN_TIMEOUT_COUNT); } else @@ -1601,7 +1601,7 @@ BOOL idle_startup() LLStringBase<char>::format_map_t args; args["[ERROR_MESSAGE]"] = emsg.str(); gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gAutoLogin = FALSE; show_connect_box = TRUE; } @@ -1618,7 +1618,7 @@ BOOL idle_startup() LLStringBase<char>::format_map_t args; args["[ERROR_MESSAGE]"] = emsg.str(); gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); gAutoLogin = FALSE; show_connect_box = TRUE; } @@ -2767,7 +2767,7 @@ void on_userserver_name_resolved( BOOL success, const LLString& host_name, U32 i LLStringBase<char>::format_map_t args; args["[HOST_NAME]"] = host_name; gViewerWindow->alertXml("SetByHostFail", args, login_alert_done ); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); } } @@ -2869,7 +2869,7 @@ void update_dialog_callback(S32 option, void *userdata) { app_force_quit(); // Bump them back to the login screen. - //gStartupState = STATE_LOGIN_SHOW; + //reset_login(); } else { @@ -2997,7 +2997,7 @@ void use_circuit_callback(void**, S32 result) llinfos << "Backing up to login screen!" << llendl; gViewerWindow->alertXml("LoginPacketNeverReceived", login_alert_status, NULL); - gStartupState = STATE_LOGIN_SHOW; + reset_login(); } else { @@ -3918,4 +3918,9 @@ bool LLStartUp::canGoFullscreen() return gStartupState >= STATE_WORLD_INIT; } +void reset_login() +{ + gStartupState = STATE_LOGIN_SHOW; + // do cleanup here of in-world UI? +} diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 39feb40109..c732394b4e 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -802,7 +802,7 @@ void LLFloaterTexturePicker::onSearchEdit(const LLString& search_string, void* u else if (picker->mInventoryPanel->getFilterSubString().empty()) { // first letter in search term, save existing folder open state - if (!picker->mInventoryPanel->getRootFolder()->isFilterActive()) + if (!picker->mInventoryPanel->getRootFolder()->isFilterModified()) { picker->mSavedFolderState.setApply(FALSE); picker->mInventoryPanel->getRootFolder()->applyFunctorRecursively(picker->mSavedFolderState); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index a9f660a0f5..e8dc281c6f 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -379,10 +379,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, { calcWorkPriority(); mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL; - if (host == LLHost::invalid) - { - mHost = gAgent.getRegionHost(); - } +// llinfos << "Create: " << mID << " mHost:" << host << " Discard=" << discard << llendl; if (!mFetcher->mDebugPause) { U32 work_priority = mWorkPriority | LLWorkerThread::PRIORITY_HIGH; @@ -393,6 +390,10 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, LLTextureFetchWorker::~LLTextureFetchWorker() { +// llinfos << "Destroy: " << mID +// << " Decoded=" << mDecodedDiscard +// << " Requested=" << mRequestedDiscard +// << " Desired=" << mDesiredDiscard << llendl; llassert_always(!haveWork()); lockWorkData(); if (mCacheReadHandle != LLTextureCache::nullHandle()) @@ -423,6 +424,7 @@ void LLTextureFetchWorker::clearPackets() U32 LLTextureFetchWorker::calcWorkPriority() { +// llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerImage::maxDecodePriority()); F32 priority_scale = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerImage::maxDecodePriority(); mWorkPriority = (U32)(mImagePriority * priority_scale); return mWorkPriority; @@ -455,8 +457,9 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size) mDesiredSize = size; prioritize = true; } - if (prioritize && mState == INIT) + if ((prioritize && mState == INIT) || mState == DONE) { + mState = INIT; U32 work_priority = mWorkPriority | LLWorkerThread::PRIORITY_HIGH; setPriority(work_priority); } @@ -464,8 +467,9 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size) void LLTextureFetchWorker::setImagePriority(F32 priority) { +// llassert_always(priority >= 0 && priority <= LLViewerImage::maxDecodePriority()); F32 delta = fabs(priority - mImagePriority); - if (delta > (mImagePriority * .05f)) // 5% + if (delta > (mImagePriority * .05f) || mState == DONE) { mImagePriority = priority; calcWorkPriority(); @@ -530,7 +534,7 @@ bool LLTextureFetchWorker::doWork(S32 param) mBuffer = NULL; mBufferSize = 0; mHaveAllData = FALSE; - clearPackets(); + clearPackets(); // TODO: Shouldn't be necessary mCacheReadHandle = LLTextureCache::nullHandle(); mCacheWriteHandle = LLTextureCache::nullHandle(); mURL.clear(); @@ -893,7 +897,11 @@ bool LLTextureFetchWorker::doWork(S32 param) setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); return false; } - return true; + else + { + setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); + return true; + } } return false; @@ -956,18 +964,14 @@ bool LLTextureFetchWorker::deleteOK() } } - const F32 MAX_IDLE_TIME = 5.f; - if ((mFetchTimer.getElapsedTimeF32() < MAX_IDLE_TIME)) - { - delete_ok = false; - } - else if ((haveWork() && - // not ok to delete from these states - ((mState >= LOAD_FROM_HTTP_GET_URL && mState <= LOAD_FROM_HTTP_GET_DATA) || - (mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE)))) + if ((haveWork() && + // not ok to delete from these states + ((mState >= LOAD_FROM_HTTP_GET_URL && mState <= LOAD_FROM_HTTP_GET_DATA) || + (mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE)))) { delete_ok = false; } + return delete_ok; } @@ -1246,20 +1250,24 @@ LLTextureFetch::~LLTextureFetch() bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 priority, S32 w, S32 h, S32 c, S32 discard, bool needs_aux) { + if (mDebugPause) + { + return false; + } + LLTextureFetchWorker* worker = NULL; LLMutexLock lock(&mQueueMutex); map_t::iterator iter = mRequestMap.find(id); if (iter != mRequestMap.end()) { worker = iter->second; - LLHost host2 = host; - if (host2 == LLHost::invalid) host2 = gAgent.getRegionHost(); - if (worker->mHost != host2) + if (worker->mHost != host) { -// llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: " -// << host << " != " << host2 << llendl; + llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: " + << host << " != " << worker->mHost << llendl; removeRequest(worker, true); worker = NULL; + return false; } } // If the requester knows the dimentions of the image, @@ -1284,6 +1292,11 @@ bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 pri worker->setImagePriority(priority); worker->setDesiredDiscard(discard, desired_size); worker->unlockWorkData(); + if (!worker->haveWork()) + { + worker->mState = LLTextureFetchWorker::INIT; + worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); + } } else { @@ -1317,7 +1330,11 @@ void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker) // i.e. a delete has not been requested mNetworkQueue.insert(worker->mID); } - mCancelQueue[worker->mHost].erase(worker->mID); + for (cancel_queue_t::iterator iter1 = mCancelQueue.begin(); + iter1 != mCancelQueue.end(); ++iter1) + { + iter1->second.erase(worker->mID); + } } // call lockQueue() first! @@ -1368,6 +1385,7 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level, // Should only happen if we set mDebugPause... if (!mDebugPause) { +// llwarns << "Adding work for inactive worker: " << id << llendl; worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority); } } @@ -1451,9 +1469,15 @@ void LLTextureFetch::sendRequestListToSimulators() typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t; typedef std::map< LLHost, request_list_t > work_request_map_t; work_request_map_t requests; - for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); ++iter) + for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); ) { - LLTextureFetchWorker* req = getWorker(*iter); + queue_t::iterator curiter = iter++; + LLTextureFetchWorker* req = getWorker(*curiter); + if (!req) + { + mNetworkQueue.erase(curiter); + continue; // paranoia + } if (req->mID == mDebugID) { mDebugCount++; // for setting breakpoints @@ -1492,7 +1516,11 @@ void LLTextureFetch::sendRequestListToSimulators() bool use_http = http_url.empty() ? false : true; LLHost host = iter1->first; // invalid host = use agent host - if (host != gAgent.getRegionHost()) + if (host == LLHost::invalid) + { + host = gAgent.getRegionHost(); + } + else { use_http = false; } @@ -1521,8 +1549,7 @@ void LLTextureFetch::sendRequestListToSimulators() gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, (S8)req->mSimRequestedDiscard); gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, req->mImagePriority); gMessageSystem->addU32Fast(_PREHASH_Packet, packet); - U8 type = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL; - gMessageSystem->addU8Fast(_PREHASH_Type, type); + gMessageSystem->addU8Fast(_PREHASH_Type, req->mType); // llinfos << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard // << " Packet: " << packet << " Priority: " << req->mImagePriority << llendl; @@ -1555,6 +1582,10 @@ void LLTextureFetch::sendRequestListToSimulators() iter1 != mCancelQueue.end(); ++iter1) { LLHost host = iter1->first; + if (host == LLHost::invalid) + { + host = gAgent.getRegionHost(); + } S32 request_count = 0; for (queue_t::iterator iter2 = iter1->second.begin(); iter2 != iter1->second.end(); ++iter2) @@ -1624,12 +1655,11 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size) return true; } -bool LLTextureFetch::receiveImageHeader(const LLHost& host_in, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, +bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data) { LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); - LLHost host = (host_in == LLHost::invalid) ? gAgent.getRegionHost() : host_in; bool res = true; ++mPacketCount; @@ -1639,17 +1669,12 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host_in, const LLUUID& id, // llwarns << "Received header for non active worker: " << id << llendl; res = false; } - else if (host != worker->mHost) - { -// llwarns << "Received header from wrong host for: " << id << llendl; - res = false; - } else if (worker->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK || worker->mSentRequest != LLTextureFetchWorker::SENT_SIM) { - llwarns << "receiveImageHeader for worker: " << id - << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] - << " sent: " << worker->mSentRequest << llendl; +// llwarns << "receiveImageHeader for worker: " << id +// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] +// << " sent: " << worker->mSentRequest << llendl; res = false; } else if (worker->mLastPacket != -1) @@ -1685,11 +1710,10 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host_in, const LLUUID& id, return res; } -bool LLTextureFetch::receiveImagePacket(const LLHost& host_in, const LLUUID& id, U16 packet_num, U16 data_size, U8* data) +bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data) { LLMutexLock lock(&mQueueMutex); LLTextureFetchWorker* worker = getWorker(id); - LLHost host = (host_in == LLHost::invalid) ? gAgent.getRegionHost() : host_in; bool res = true; ++mPacketCount; @@ -1699,11 +1723,6 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host_in, const LLUUID& id, // llwarns << "Received packet " << packet_num << " for non active worker: " << id << llendl; res = false; } - else if (host != worker->mHost) - { -// llwarns << "Received packet from wrong host for: " << id << llendl; - res = false; - } else if (worker->mLastPacket == -1) { // llwarns << "Received packet " << packet_num << " before header for: " << id << llendl; @@ -1735,6 +1754,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host_in, const LLUUID& id, { // llwarns << "receiveImagePacket " << packet_num << "/" << worker->mLastPacket << " for worker: " << id // << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << llendl; + removeFromNetworkQueue(worker); // failsafe + mCancelQueue[host].insert(id); } worker->unlockWorkData(); diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index b75e379755..683f8b56cf 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -129,21 +129,18 @@ void LLTextureBar::draw() } else if (mHilite) { - S32 idx = llclamp(mHilite,1,4); - if (idx==1) color = LLColor4::yellow; - else color = LLColor4::orange; - } - else if (mImagep->getBoostLevel()) - { - color = LLColor4::magenta; + S32 idx = llclamp(mHilite,1,3); + if (idx==1) color = LLColor4::orange; + else if (idx==2) color = LLColor4::yellow; + else color = LLColor4::pink2; } else if (mImagep->mDontDiscard) { - color = LLColor4::pink2; + color = LLColor4::green4; } - else if (!mImagep->getUseMipMaps()) + else if (mImagep->getBoostLevel()) { - color = LLColor4::green4; + color = LLColor4::magenta; } else if (mImagep->getDecodePriority() == 0.0f) { @@ -577,6 +574,9 @@ void LLTextureView::draw() { LLPointer<LLViewerImage> imagep = *iter++; + S32 cur_discard = imagep->getDiscardLevel(); + S32 desired_discard = imagep->mDesiredDiscardLevel; + if (mPrintList) { llinfos << imagep->getID() @@ -585,7 +585,7 @@ void LLTextureView::draw() << "\t" << imagep->getDecodePriority() << "\t" << imagep->getWidth() << "\t" << imagep->getHeight() - << "\t" << imagep->getDiscardLevel() + << "\t" << cur_discard << llendl; } @@ -614,7 +614,7 @@ void LLTextureView::draw() if (sDebugImages.find(imagep) != sDebugImages.end()) { - pri += 3*HIGH_PRIORITY; + pri += 4*HIGH_PRIORITY; } if (!mOrderFetch) @@ -629,14 +629,14 @@ void LLTextureView::draw() { if (imagep == objectp->getTEImage(te)) { - pri += 2*HIGH_PRIORITY; + pri += 3*HIGH_PRIORITY; break; } } } #endif #if 1 - if (pri < HIGH_PRIORITY) + if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard)) { LLViewerObject *objectp = gHoverView->getLastHoverObject(); if (objectp) @@ -653,15 +653,6 @@ void LLTextureView::draw() } } #endif -#if 0 - if (pri < HIGH_PRIORITY) - { - if (imagep->mBoostPriority) - { - pri += 4*HIGH_PRIORITY; - } - } -#endif #if 1 if (pri > 0.f && pri < HIGH_PRIORITY) { diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index 1053e4a569..b31a70e917 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -34,7 +34,7 @@ LLTool::LLTool( const LLString& name, LLToolComposite* composite ) : LLTool::~LLTool() { - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { llwarns << "Tool deleted holding mouse capture. Mouse capture removed." << llendl; gFocusMgr.removeMouseCaptureWithoutCallback( this ); @@ -113,12 +113,12 @@ void LLTool::setMouseCapture( BOOL b ) { if( b ) { - gViewerWindow->setMouseCapture(mComposite ? mComposite : this, &LLTool::onMouseCaptureLost ); + gViewerWindow->setMouseCapture(mComposite ? mComposite : this ); } else if( hasMouseCapture() ) { - gViewerWindow->setMouseCapture( NULL, NULL ); + gViewerWindow->setMouseCapture( NULL ); } } @@ -128,7 +128,7 @@ void LLTool::draw() BOOL LLTool::hasMouseCapture() { - return gViewerWindow->hasMouseCapture(mComposite ? mComposite : this); + return gFocusMgr.getMouseCapture() == (mComposite ? mComposite : this); } BOOL LLTool::handleKey(KEY key, MASK mask) @@ -144,17 +144,3 @@ LLTool* LLTool::getOverrideTool(MASK mask) } return NULL; } - -// static -void LLTool::onMouseCaptureLost( LLMouseHandler* old_captor ) -{ - LLTool* self = (LLTool*) old_captor; - if( self->mComposite ) - { - self->mComposite->onMouseCaptureLost(); - } - else - { - self->onMouseCaptureLost(); - } -} diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h index d67a0d7d24..0cdeae6bd9 100644 --- a/indra/newview/lltool.h +++ b/indra/newview/lltool.h @@ -72,7 +72,6 @@ public: // Note: NOT virtual. Subclasses should call this version. void setMouseCapture(BOOL b); BOOL hasMouseCapture(); - static void onMouseCaptureLost(LLMouseHandler* old_captor); virtual void onMouseCaptureLost() {} // override this one as needed. protected: diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 5d803b4c52..a1c51cfe44 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -736,6 +736,11 @@ BOOL LLToolCompGun::handleMouseUp(S32 x, S32 y, MASK mask) void LLToolCompGun::onMouseCaptureLost() { + if (mComposite) + { + mComposite->onMouseCaptureLost(); + return; + } mCur->onMouseCaptureLost(); // JC - I don't know if this is necessary. Maybe we could lose capture diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 1eb27f9165..b4aee4e2e1 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -859,7 +859,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, BOOL handled = FALSE; - LLView* top_view = gViewerWindow->getTopView(); + LLView* top_view = gViewerWindow->getTopCtrl(); LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; @@ -2308,7 +2308,7 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject( } if(!obj->permModify()) { - return ACCEPT_NO_LOCKED; + return ACCEPT_NO_LOCKED; } //If texture !copyable don't texture or you'll never get it back. if(!item->getPermissions().allowCopyBy(gAgent.getID())) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 68d9ddbd54..f9511f72a5 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -44,6 +44,7 @@ LLToolPie *gToolPie = NULL; LLViewerObject* LLToolPie::sClickActionObject = NULL; LLHandle<LLObjectSelection> LLToolPie::sLeftClickSelection = NULL; +U8 LLToolPie::sClickAction = 0; extern void handle_buy(void*); @@ -145,17 +146,17 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show) // If it's a left-click, and we have a special action, do it. if (useClickAction(always_show, mask, object, parent)) { - U8 click_action = 0; + sClickAction = 0; if (object && object->getClickAction()) { - click_action = object->getClickAction(); + sClickAction = object->getClickAction(); } else if (parent && parent->getClickAction()) { - click_action = parent->getClickAction(); + sClickAction = parent->getClickAction(); } - switch(click_action) + switch(sClickAction) { case CLICK_ACTION_TOUCH: default: @@ -168,8 +169,9 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show) if (object && object->flagTakesMoney() || parent && parent->flagTakesMoney()) { - sClickActionObject = parent; - sLeftClickSelection = LLToolSelect::handleObjectSelection(parent, MASK_NONE, FALSE, TRUE); + // pay event goes to object actually clicked on + sClickActionObject = object; + sLeftClickSelection = LLToolSelect::handleObjectSelection(object, MASK_NONE, FALSE, TRUE); return TRUE; } break; @@ -398,13 +400,12 @@ void LLToolPie::selectionPropertiesReceived() if (!sLeftClickSelection->isEmpty()) { - LLViewerObject* root = sLeftClickSelection->getFirstRootObject(); + LLViewerObject* selected_object = sLeftClickSelection->getPrimaryObject(); // since we don't currently have a way to lock a selection, it could have changed // after we initially clicked on the object - if (root == sClickActionObject) + if (selected_object == sClickActionObject) { - U8 action = root->getClickAction(); - switch (action) + switch (sClickAction) { case CLICK_ACTION_BUY: handle_buy(NULL); @@ -422,6 +423,7 @@ void LLToolPie::selectionPropertiesReceived() } sLeftClickSelection = NULL; sClickActionObject = NULL; + sClickAction = 0; } BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 2ae125c76e..6c3a200dbc 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -54,6 +54,7 @@ protected: LLUUID mHitObjectID; BOOL mMouseOutsideSlop; // for this drag, has mouse moved outside slop region static LLViewerObject* sClickActionObject; + static U8 sClickAction; static LLHandle<LLObjectSelection> sLeftClickSelection; }; diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp index 9bcc123eb5..f8c54fd6c7 100644 --- a/indra/newview/lluploaddialog.cpp +++ b/indra/newview/lluploaddialog.cpp @@ -62,7 +62,7 @@ LLUploadDialog::LLUploadDialog( const std::string& msg) setMessage(msg); // The dialog view is a root view - gViewerWindow->setTopView( this, NULL ); + gViewerWindow->setTopCtrl( this ); } void LLUploadDialog::setMessage( const std::string& msg) diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 512ddc8565..123dcc8eb4 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -34,6 +34,7 @@ #include "llvoavatar.h" #include "llsky.h" #include "pipeline.h" +#include "llglslshader.h" #if !LL_DARWIN && !LL_LINUX extern PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB; @@ -479,7 +480,7 @@ void LLViewerJointMesh::uploadJointMatrices() //cgGLSetParameterArray4f(gPipeline.mAvatarMatrix, offset, 1, vector); } } - glUniform4fvARB(gPipeline.mAvatarMatrixParam, 45, mat); + glUniform4fvARB(gAvatarMatrixParam, 45, mat); } } @@ -554,14 +555,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass) { glColor4f(0,0,0,1); - if (gPipeline.mMaterialIndex > 0) + if (gMaterialIndex > 0) { - glVertexAttrib4fvARB(gPipeline.mMaterialIndex, mColor.mV); + glVertexAttrib4fvARB(gMaterialIndex, mColor.mV); } - if (mShiny && gPipeline.mSpecularIndex > 0) + if (mShiny && gSpecularIndex > 0) { - glVertexAttrib4fARB(gPipeline.mSpecularIndex, 1,1,1,1); + glVertexAttrib4fARB(gSpecularIndex, 1,1,1,1); } } else @@ -888,7 +889,7 @@ void LLViewerJointMesh::updateGeometry() if (mValid && mMesh && mFace && mMesh->hasWeights() && mFace->mVertexBuffer.notNull() && - gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) == 0) + LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) == 0) { uploadJointMatrices(); LLStrider<LLVector3> o_vertices; diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp new file mode 100644 index 0000000000..ae51726b5e --- /dev/null +++ b/indra/newview/llviewerjoystick.cpp @@ -0,0 +1,252 @@ +/** + * @file llviewerjoystick.cpp + * @brief Joystick functionality. + * + * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llviewercontrol.h" +#include "llviewerwindow.h" +#include "llviewercamera.h" +#include "llviewerjoystick.h" +#include "viewer.h" +#include "llkeyboard.h" + +static LLQuaternion sFlycamRotation; +static LLVector3 sFlycamPosition; +static F32 sFlycamZoom; + +BOOL LLViewerJoystick::sOverrideCamera = FALSE; + +void LLViewerJoystick::updateCamera(BOOL reset) +{ + static F32 last_delta[] = {0,0,0,0,0,0,0}; + static F32 delta[] = { 0,0,0,0,0,0,0 }; + + LLWindow* window = gViewerWindow->getWindow(); + + F32 time = gFrameIntervalSeconds; + + S32 axis[] = + { + gSavedSettings.getS32("FlycamAxis0"), + gSavedSettings.getS32("FlycamAxis1"), + gSavedSettings.getS32("FlycamAxis2"), + gSavedSettings.getS32("FlycamAxis3"), + gSavedSettings.getS32("FlycamAxis4"), + gSavedSettings.getS32("FlycamAxis5"), + gSavedSettings.getS32("FlycamAxis6") + }; + + F32 axis_scale[] = + { + gSavedSettings.getF32("FlycamAxisScale0"), + gSavedSettings.getF32("FlycamAxisScale1"), + gSavedSettings.getF32("FlycamAxisScale2"), + gSavedSettings.getF32("FlycamAxisScale3"), + gSavedSettings.getF32("FlycamAxisScale4"), + gSavedSettings.getF32("FlycamAxisScale5"), + gSavedSettings.getF32("FlycamAxisScale6") + }; + + F32 dead_zone[] = + { + gSavedSettings.getF32("FlycamAxisDeadZone0"), + gSavedSettings.getF32("FlycamAxisDeadZone1"), + gSavedSettings.getF32("FlycamAxisDeadZone2"), + gSavedSettings.getF32("FlycamAxisDeadZone3"), + gSavedSettings.getF32("FlycamAxisDeadZone4"), + gSavedSettings.getF32("FlycamAxisDeadZone5"), + gSavedSettings.getF32("FlycamAxisDeadZone6") + }; + + if (reset) + { + sFlycamPosition = gCamera->getOrigin(); + sFlycamRotation = gCamera->getQuaternion(); + sFlycamZoom = gCamera->getView(); + + for (U32 i = 0; i < 7; i++) + { + last_delta[i] = -window->getJoystickAxis(axis[i]); + delta[i] = 0.f; + } + return; + } + + F32 cur_delta[7]; + F32 feather = gSavedSettings.getF32("FlycamFeathering"); + BOOL absolute = gSavedSettings.getBOOL("FlycamAbsolute"); + + for (U32 i = 0; i < 7; i++) + { + cur_delta[i] = -window->getJoystickAxis(axis[i]); + F32 tmp = cur_delta[i]; + if (absolute) + { + cur_delta[i] = cur_delta[i] - last_delta[i]; + } + last_delta[i] = tmp; + + if (cur_delta[i] > 0) + { + cur_delta[i] = llmax(cur_delta[i]-dead_zone[i], 0.f); + } + else + { + cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f); + } + cur_delta[i] *= axis_scale[i]; + + if (!absolute) + { + cur_delta[i] *= time; + } + + delta[i] = delta[i] + (cur_delta[i]-delta[i])*time*feather; + } + + sFlycamPosition += LLVector3(delta) * sFlycamRotation; + + LLMatrix3 rot_mat(delta[3], + delta[4], + delta[5]); + + sFlycamRotation = LLQuaternion(rot_mat)*sFlycamRotation; + + if (gSavedSettings.getBOOL("FlycamAutoLeveling")) + { + LLMatrix3 level(sFlycamRotation); + + LLVector3 x = LLVector3(level.mMatrix[0]); + LLVector3 y = LLVector3(level.mMatrix[1]); + LLVector3 z = LLVector3(level.mMatrix[2]); + + y.mV[2] = 0.f; + y.normVec(); + + level.setRows(x,y,z); + level.orthogonalize(); + + LLQuaternion quat = LLQuaternion(level); + sFlycamRotation = nlerp(llmin(feather*time,1.f), sFlycamRotation, quat); + } + + if (gSavedSettings.getBOOL("FlycamZoomDirect")) + { + sFlycamZoom = last_delta[6]*axis_scale[6]+dead_zone[6]; + } + else + { + sFlycamZoom += delta[6]; + } + + LLMatrix3 mat(sFlycamRotation); + + gCamera->setView(sFlycamZoom); + gCamera->setOrigin(sFlycamPosition); + gCamera->mXAxis = LLVector3(mat.mMatrix[0]); + gCamera->mYAxis = LLVector3(mat.mMatrix[1]); + gCamera->mZAxis = LLVector3(mat.mMatrix[2]); +} + + +void LLViewerJoystick::scanJoystick() +{ + if (!sOverrideCamera) + { + static U32 joystick_state = 0; + static U32 button_state = 0; + + F32 xval = gViewerWindow->getWindow()->getJoystickAxis(0); + F32 yval = gViewerWindow->getWindow()->getJoystickAxis(1); + + if (xval <= -0.5f) + { + if (!(joystick_state & 0x1)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_LEFT, 0); + joystick_state |= 0x1; + } + } + else + { + if (joystick_state & 0x1) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_LEFT, 0); + joystick_state &= ~0x1; + } + } + if (xval >= 0.5f) + { + if (!(joystick_state & 0x2)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_RIGHT, 0); + joystick_state |= 0x2; + } + } + else + { + if (joystick_state & 0x2) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_RIGHT, 0); + joystick_state &= ~0x2; + } + } + if (yval <= -0.5f) + { + if (!(joystick_state & 0x4)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_UP, 0); + joystick_state |= 0x4; + } + } + else + { + if (joystick_state & 0x4) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_UP, 0); + joystick_state &= ~0x4; + } + } + if (yval >= 0.5f) + { + if (!(joystick_state & 0x8)) + { + gKeyboard->handleTranslatedKeyDown(KEY_PAD_DOWN, 0); + joystick_state |= 0x8; + } + } + else + { + if (joystick_state & 0x8) + { + gKeyboard->handleTranslatedKeyUp(KEY_PAD_DOWN, 0); + joystick_state &= ~0x8; + } + } + + for( int i = 0; i < 15; i++ ) + { + if ( gViewerWindow->getWindow()->getJoystickButton(i) & 0x80 ) + { + if (!(button_state & (1<<i))) + { + gKeyboard->handleTranslatedKeyDown(KEY_BUTTON1+i, 0); + button_state |= (1<<i); + } + } + else + { + if (button_state & (1<<i)) + { + gKeyboard->handleTranslatedKeyUp(KEY_BUTTON1+i, 0); + button_state &= ~(1<<i); + } + } + } + } +} + diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h new file mode 100644 index 0000000000..bc2186c992 --- /dev/null +++ b/indra/newview/llviewerjoystick.h @@ -0,0 +1,20 @@ +/** + * @file llviewerjoystick.h + * @brief Viewer joystick functionality. + * + * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#ifndef LL_LLVIEWERJOYSTICK_H +#define LL_LLVIEWERJOYSTICK_H + +class LLViewerJoystick +{ +public: + static BOOL sOverrideCamera; + static void scanJoystick(); + static void updateCamera(BOOL reset = FALSE); +}; + +#endif diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 9a43729195..89665171c9 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -174,6 +174,7 @@ #include "pipeline.h" #include "viewer.h" #include "roles_constants.h" +#include "llviewerjoystick.h" #include "lltexlayer.h" @@ -994,6 +995,10 @@ void init_debug_ui_menu(LLMenuGL* menu) menu->append(new LLMenuItemToggleGL("Debug Keys", &LLView::sDebugKeys)); menu->append(new LLMenuItemToggleGL("Debug WindowProc", &gDebugWindowProc)); menu->append(new LLMenuItemToggleGL("Debug Text Editor Tips", &gDebugTextEditorTips)); + menu->appendSeparator(); + menu->append(new LLMenuItemCheckGL("Show Time", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowTime")); + menu->append(new LLMenuItemCheckGL("Show Render Info", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderInfo")); + menu->createJumpKeys(); } @@ -3145,6 +3150,11 @@ void reset_view_final( BOOL proceed, void* ) gAgent.changeCameraToDefault(); + if (LLViewerJoystick::sOverrideCamera) + { + handle_toggle_flycam(NULL); + } + gAgent.resetView(!gFloaterTools->getVisible()); gFloaterTools->close(); @@ -6331,14 +6341,15 @@ void handle_dump_followcam(void*) BOOL check_flycam(void*) { - return LLPipeline::sOverrideAgentCamera; + return LLViewerJoystick::sOverrideCamera; } void handle_toggle_flycam(void*) { - LLPipeline::sOverrideAgentCamera = !LLPipeline::sOverrideAgentCamera; - if (LLPipeline::sOverrideAgentCamera) + LLViewerJoystick::sOverrideCamera = !LLViewerJoystick::sOverrideCamera; + if (LLViewerJoystick::sOverrideCamera) { + LLViewerJoystick::updateCamera(TRUE); LLFloaterJoystick::show(NULL); } } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ed13f6dbe9..55256a6f23 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3884,7 +3884,16 @@ void process_alert_core(const char* buffer, BOOL modal) } // Translate system messages here. - if (buffer[0] == '/') + const char ALERT_PREFIX[] = "ALERT: "; + const size_t ALERT_PREFIX_LEN = sizeof(ALERT_PREFIX) - 1; + if (!strncmp(buffer, ALERT_PREFIX, ALERT_PREFIX_LEN)) + { + // Allow the server to spawn a named alert so that server alerts can be + // translated out of English. JC + std::string alert_name(buffer + ALERT_PREFIX_LEN); + LLAlertDialog::showXml(alert_name); + } + else if (buffer[0] == '/') { // System message is important, show in upper-right box not tip LLString text(buffer+1); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index ee29876274..c3f2b2d2f6 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -2568,6 +2568,6 @@ bool LLParcelSelection::hasOthersSelected() const LLParcelSelection* get_null_parcel_selection() { - static LLParcelSelectionHandle null_ptr = new LLParcelSelection(); - return null_ptr; + static LLParcelSelection null_selection; + return &null_selection; } diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp index a6895aff2f..bf09c54100 100644 --- a/indra/newview/llviewerpartsim.cpp +++ b/indra/newview/llviewerpartsim.cpp @@ -461,7 +461,7 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part) const F32 MAX_MAG = 1000000.f*1000000.f; // 1 million if (part->mPosAgent.magVecSquared() > MAX_MAG || !part->mPosAgent.isFinite()) { -#if !LL_RELEASE_FOR_DOWNLOAD +#if 0 && !LL_RELEASE_FOR_DOWNLOAD llwarns << "LLViewerPartSim::put Part out of range!" << llendl; llwarns << part->mPosAgent << llendl; #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 262c7d8ed7..3bc529a9e3 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -422,7 +422,6 @@ LLVector3 LLViewerRegion::getCenterAgent() const return gAgent.getPosAgentFromGlobal(mCenterGlobal); } - void LLViewerRegion::setRegionNameAndZone(const char* name_and_zone) { LLString name_zone(name_and_zone); @@ -705,21 +704,6 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const return getComposition()->getValueScaled((F32)x, (F32)y); } - -// ---------------- Friends ---------------- - -std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) -{ - s << "{ "; - s << region.mHost; - s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n"; - s << "}"; - return s; -} - - -// ---------------- Protected Member Functions ---------------- - void LLViewerRegion::calculateCenterGlobal() { mCenterGlobal = mOriginGlobal; @@ -735,7 +719,24 @@ void LLViewerRegion::calculateCenterGlobal() } } +void LLViewerRegion::calculateCameraDistance() +{ + mCameraDistanceSquared = (F32)(gAgent.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared(); +} + +// ---------------- Friends ---------------- +std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion) +{ + s << "{ "; + s << region.mHost; + s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n"; + s << "}"; + return s; +} + + +// ---------------- Protected Member Functions ---------------- void LLViewerRegion::updateNetStats() { diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 1dc1b3af20..05c37fe08f 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -208,9 +208,19 @@ public: void unpackRegionHandshake(); void calculateCenterGlobal(); + void calculateCameraDistance(); friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion ®ion); +public: + struct CompareDistance + { + bool operator()(const LLViewerRegion* const& lhs, const LLViewerRegion* const& rhs) + { + return lhs->mCameraDistanceSquared < rhs->mCameraDistanceSquared; + } + }; + protected: void disconnectAllNeighbors(); void initStats(); @@ -265,13 +275,15 @@ protected: U32 mPingDelay; F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc + // Misc LLVLComposition *mCompositionp; // Composition layer for the surface U32 mRegionFlags; // includes damage flags U8 mSimAccess; F32 mBillableFactor; U32 mMaxTasks; // max prim count - + F32 mCameraDistanceSquared; // updated once per frame + // Maps local ids to cache entries. // Regions can have order 10,000 objects, so assume // a structure of size 2^14 = 16,000 diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index f9e74f31e6..4ebfef3a9b 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -584,7 +584,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { mDragItem = item_at_pos; mDragItemSaved = LLEmbeddedItems::getEmbeddedItemSaved(wc); - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mMouseDownX = x; mMouseDownY = y; S32 screen_x; @@ -646,7 +646,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) setCursorAtLocalPos( x, y, TRUE ); startSelection(); } - gFocusMgr.setMouseCapture( this, &LLTextEditor::onMouseCaptureLost ); + gFocusMgr.setMouseCapture( this ); } handled = TRUE; @@ -676,7 +676,7 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask) } if( getVisible() ) { - if(gFocusMgr.getMouseCapture() == this ) + if(hasMouseCapture() ) { if( mIsSelecting ) { @@ -829,7 +829,7 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) // Delay cursor flashing mKeystrokeTimer.reset(); - if( gFocusMgr.getMouseCapture() == this ) + if( hasMouseCapture() ) { if (mDragItem) { @@ -842,7 +842,7 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask) } } mDragItem = NULL; - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); handled = TRUE; } diff --git a/indra/newview/llviewertextureanim.cpp b/indra/newview/llviewertextureanim.cpp index b40320ad2d..67b0901162 100644 --- a/indra/newview/llviewertextureanim.cpp +++ b/indra/newview/llviewertextureanim.cpp @@ -17,6 +17,9 @@ LLViewerTextureAnim::LLViewerTextureAnim() : LLTextureAnim() { mLastFrame = -1.f; // Force an update initially mLastTime = 0.f; + mOffS = mOffT = 0; + mScaleS = mScaleT = 1; + mRot = 0; } LLViewerTextureAnim::~LLViewerTextureAnim() @@ -148,13 +151,13 @@ S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t, if (mMode & ROTATE) { result |= ROTATE; - rot = frame_counter; + mRot = rot = frame_counter; } else if (mMode & SCALE) { result |= SCALE; - scale_s = frame_counter; - scale_t = frame_counter; + mScaleS = scale_s = frame_counter; + mScaleT = scale_t = frame_counter; } else { @@ -168,22 +171,22 @@ S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t, &&(mSizeY)) { result |= SCALE; - scale_s = 1.f/mSizeX; - scale_t = 1.f/mSizeY; + mScaleS = scale_s = 1.f/mSizeX; + mScaleT = scale_t = 1.f/mSizeY; x_frame = fmod(frame_counter, mSizeX); y_frame = (S32)(frame_counter / mSizeX); x_pos = x_frame * scale_s; y_pos = y_frame * scale_t; - off_s = (-0.5f + 0.5f*scale_s)+ x_pos; - off_t = (0.5f - 0.5f*scale_t) - y_pos; + mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos; + mOffT = off_t = (0.5f - 0.5f*scale_t) - y_pos; } else { - scale_s = 1.f; - scale_t = 1.f; + mScaleS = scale_s = 1.f; + mScaleT = scale_t = 1.f; x_pos = frame_counter * scale_s; - off_s = (-0.5f + 0.5f*scale_s)+ x_pos; - off_t = 0.f; + mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos; + mOffT = off_t = 0.f; } } } diff --git a/indra/newview/llviewertextureanim.h b/indra/newview/llviewertextureanim.h index c7e75c565c..a5488be4eb 100644 --- a/indra/newview/llviewertextureanim.h +++ b/indra/newview/llviewertextureanim.h @@ -25,6 +25,13 @@ public: { TRANSLATE = 0x01 // Result code JUST for animateTextures }; + + F32 mOffS; + F32 mOffT; + F32 mScaleS; + F32 mScaleT; + F32 mRot; + protected: LLFrameTimer mTimer; F64 mLastTime; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 41f937efd5..732568f652 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -43,7 +43,6 @@ #include "llxfermanager.h" #include "message.h" #include "object_flags.h" -#include "text_out.h" #include "lltimer.h" #include "timing.h" #include "llviewermenu.h" @@ -334,7 +333,216 @@ void LLViewerWindow::printFeedback() } #endif //SABINRIG +//////////////////////////////////////////////////////////////////////////// +// +// LLDebugText +// + +class LLDebugText +{ +private: + struct Line + { + Line(const std::string& in_text, S32 in_x, S32 in_y) : text(in_text), x(in_x), y(in_y) {} + std::string text; + S32 x,y; + }; + + LLViewerWindow *mWindow; + + typedef std::vector<Line> line_list_t; + line_list_t mLineList; + LLColor4 mTextColor; + +public: + LLDebugText(LLViewerWindow* window) : mWindow(window) {} + + void addText(S32 x, S32 y, const std::string &text) + { + mLineList.push_back(Line(text, x, y)); + } + + void update() + { + std::string wind_vel_text; + std::string wind_vector_text; + std::string rwind_vel_text; + std::string rwind_vector_text; + std::string audio_text; + + // Draw the statistics in a light gray + // and in a thin font + mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f ); + + // Draw stuff growing up from right lower corner of screen + U32 xpos = mWindow->getWindowWidth() - 350; + U32 ypos = 64; + const U32 y_inc = 20; + + if (gSavedSettings.getBOOL("DebugShowTime")) + { + const U32 y_inc2 = 15; + for (std::map<S32,LLFrameTimer>::reverse_iterator iter = gDebugTimers.rbegin(); + iter != gDebugTimers.rend(); ++iter) + { + S32 idx = iter->first; + LLFrameTimer& timer = iter->second; + F32 time = timer.getElapsedTimeF32(); + S32 hours = (S32)(time / (60*60)); + S32 mins = (S32)((time - hours*(60*60)) / 60); + S32 secs = (S32)((time - hours*(60*60) - mins*60)); + addText(xpos, ypos, llformat(" Debug %d: %d:%02d:%02d", idx, hours,mins,secs)); ypos += y_inc2; + } + + F32 time = gFrameTimeSeconds; + S32 hours = (S32)(time / (60*60)); + S32 mins = (S32)((time - hours*(60*60)) / 60); + S32 secs = (S32)((time - hours*(60*60) - mins*60)); + addText(xpos, ypos, llformat("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc; + } + + if (gDisplayCameraPos) + { + std::string camera_view_text; + std::string camera_center_text; + std::string agent_view_text; + std::string agent_left_text; + std::string agent_center_text; + std::string agent_root_center_text; + + LLVector3d tvector; // Temporary vector to hold data for printing. + + // Update camera center, camera view, wind info every other frame + tvector = gAgent.getPositionGlobal(); + agent_center_text = llformat("AgentCenter %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + if (gAgent.getAvatarObject()) + { + tvector = gAgent.getPosGlobalFromAgent(gAgent.getAvatarObject()->mRoot.getWorldPosition()); + agent_root_center_text = llformat("AgentRootCenter %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + } + else + { + agent_root_center_text = "---"; + } + + + tvector = LLVector4(gAgent.getFrameAgent().getAtAxis()); + agent_view_text = llformat("AgentAtAxis %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + tvector = LLVector4(gAgent.getFrameAgent().getLeftAxis()); + agent_left_text = llformat("AgentLeftAxis %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + tvector = gAgent.getCameraPositionGlobal(); + camera_center_text = llformat("CameraCenter %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + tvector = LLVector4(gCamera->getAtAxis()); + camera_view_text = llformat("CameraAtAxis %f %f %f", + (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ])); + + addText(xpos, ypos, agent_center_text); ypos += y_inc; + addText(xpos, ypos, agent_root_center_text); ypos += y_inc; + addText(xpos, ypos, agent_view_text); ypos += y_inc; + addText(xpos, ypos, agent_left_text); ypos += y_inc; + addText(xpos, ypos, camera_center_text); ypos += y_inc; + addText(xpos, ypos, camera_view_text); ypos += y_inc; + } + + if (gDisplayWindInfo) + { + wind_vel_text = llformat("Wind velocity %.2f m/s", gWindVec.magVec()); + wind_vector_text = llformat("Wind vector %.2f %.2f %.2f", gWindVec.mV[0], gWindVec.mV[1], gWindVec.mV[2]); + rwind_vel_text = llformat("RWind vel %.2f m/s", gRelativeWindVec.magVec()); + rwind_vector_text = llformat("RWind vec %.2f %.2f %.2f", gRelativeWindVec.mV[0], gRelativeWindVec.mV[1], gRelativeWindVec.mV[2]); + + addText(xpos, ypos, wind_vel_text); ypos += y_inc; + addText(xpos, ypos, wind_vector_text); ypos += y_inc; + addText(xpos, ypos, rwind_vel_text); ypos += y_inc; + addText(xpos, ypos, rwind_vector_text); ypos += y_inc; + } + if (gDisplayWindInfo) + { + if (gAudiop) + { + audio_text= llformat("Audio for wind: %d", gAudiop->isWindEnabled()); + } + addText(xpos, ypos, audio_text); ypos += y_inc; + } + if (gDisplayFOV) + { + addText(xpos, ypos, llformat("FOV: %2.1f deg", RAD_TO_DEG * gCamera->getView())); + ypos += y_inc; + } + if (gSavedSettings.getBOOL("DebugShowRenderInfo")) + { + if (gPipeline.getUseVertexShaders() == 0) + { + addText(xpos, ypos, "Shaders Disabled"); + ypos += y_inc; + } + addText(xpos, ypos, llformat("%d MB Vertex Data", LLVertexBuffer::sAllocatedBytes/(1024*1024))); + ypos += y_inc; + + addText(xpos, ypos, llformat("%d Pending Lock", LLVertexBuffer::sLockedList.size())); + ypos += y_inc; + + addText(xpos, ypos, llformat("%d Vertex Buffers", LLVertexBuffer::sGLCount)); + ypos += y_inc; + } + if (LLPipeline::getRenderParticleBeacons(NULL)) + { + addText(xpos, ypos, "Viewing particle beacons (blue)"); + ypos += y_inc; + } + if (LLPipeline::toggleRenderTypeControlNegated((void*)LLPipeline::RENDER_TYPE_PARTICLES)) + { + addText(xpos, ypos, "Hiding particles"); + ypos += y_inc; + } + if (LLPipeline::getRenderPhysicalBeacons(NULL)) + { + addText(xpos, ypos, "Viewing physical object beacons (green)"); + ypos += y_inc; + } + if (LLPipeline::getRenderScriptedBeacons(NULL)) + { + addText(xpos, ypos, "Viewing scripted object beacons (red)"); + ypos += y_inc; + } + if (LLPipeline::getRenderSoundBeacons(NULL)) + { + addText(xpos, ypos, "Viewing sound beacons (yellow)"); + ypos += y_inc; + } + } + + void draw() + { + for (line_list_t::iterator iter = mLineList.begin(); + iter != mLineList.end(); ++iter) + { + const Line& line = *iter; + LLFontGL::sMonospace->renderUTF8(line.text, 0, (F32)line.x, (F32)line.y, mTextColor, + LLFontGL::LEFT, LLFontGL::TOP, + LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE); + } + mLineList.clear(); + } + +}; + +void LLViewerWindow::updateDebugText() +{ + mDebugText->update(); +} + +//////////////////////////////////////////////////////////////////////////// // // LLViewerWindow // @@ -401,12 +609,23 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask } // Topmost view gets a chance before the hierarchy - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - if (top_view->pointInView(local_x, local_y) && top_view->handleMouseDown(local_x, local_y, mask)) return TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + if (top_ctrl->pointInView(local_x, local_y)) + { + if(top_ctrl->handleMouseDown(local_x, local_y, mask)) + { + return TRUE; + } + } + else if (top_ctrl->hasFocus()) + { + // always defocus top view if we click off of it + top_ctrl->setFocus(FALSE); + } } // Give the UI views a chance to process the click @@ -479,12 +698,25 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma } // Check for hit on UI. - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - if (top_view->pointInView(local_x, local_y) && top_view->handleDoubleClick(local_x, local_y, mask)) return TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + if (top_ctrl->pointInView(local_x, local_y)) + { + if(top_ctrl->handleDoubleClick(local_x, local_y, mask)) + { + return TRUE; + } + } + else + { + if (top_ctrl->hasFocus()) + { + top_ctrl->setFocus(FALSE); + } + } } if (mRootView->handleDoubleClick(x, y, mask)) @@ -574,12 +806,12 @@ BOOL LLViewerWindow::handleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask) return mouse_captor->handleMouseUp(local_x, local_y, mask); } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - handled = top_view->pointInView(local_x, local_y) && top_view->handleMouseUp(local_x, local_y, mask); + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask); } if( !handled ) @@ -670,12 +902,25 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK return mouse_captor->handleRightMouseDown(local_x, local_y, mask); } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - if (top_view->pointInView(local_x, local_y) && top_view->handleRightMouseDown(local_x, local_y, mask)) return TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + if (top_ctrl->pointInView(local_x, local_y)) + { + if(top_ctrl->handleRightMouseDown(local_x, local_y, mask)) + { + return TRUE; + } + } + else + { + if (top_ctrl->hasFocus()) + { + top_ctrl->setFocus(FALSE); + } + } } if( mRootView->handleRightMouseDown(x, y, mask) ) @@ -773,12 +1018,12 @@ BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK m return mouse_captor->handleRightMouseUp(local_x, local_y, mask); } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - handled = top_view->pointInView(local_x, local_y) && top_view->handleRightMouseUp(local_x, local_y, mask); + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleRightMouseUp(local_x, local_y, mask); } if( !handled ) @@ -912,7 +1157,7 @@ void LLViewerWindow::handleFocusLost(LLWindow *window) { gToolMgr->onAppFocusLost(); } - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); if (gMenuBarView) { @@ -1284,6 +1529,8 @@ LLViewerWindow::LLViewerWindow( // sync the keyboard's setting with the saved setting gSavedSettings.getControl("NumpadControl")->firePropertyChanged(); + + mDebugText = new LLDebugText(this); } void LLViewerWindow::initGLDefaults() @@ -1632,6 +1879,8 @@ void LLViewerWindow::initWorldUI() LLViewerWindow::~LLViewerWindow() { + delete mDebugText; + gSavedSettings.setS32("FloaterViewBottom", gFloaterView->getRect().mBottom); // Cleanup global views @@ -1845,6 +2094,10 @@ void LLViewerWindow::reshape(S32 width, S32 height) } } +void LLViewerWindow::drawDebugText() +{ + mDebugText->draw(); +} void LLViewerWindow::draw() { @@ -1916,7 +2169,7 @@ void LLViewerWindow::draw() { LLGLSTexture gls_texture; - show_text_gl(); + drawDebugText(); } if (gToolMgr) @@ -1928,7 +2181,7 @@ void LLViewerWindow::draw() if( gAgent.cameraMouselook() ) { drawMouselookInstructions(); - stop_glerror(); + stop_glerror(); } // Draw all nested UI views. @@ -1936,16 +2189,16 @@ void LLViewerWindow::draw() mRootView->draw(); // Draw optional on-top-of-everyone view - LLView* top_view = gFocusMgr.getTopView(); - if (top_view && top_view->getVisible()) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl && top_ctrl->getVisible()) { S32 screen_x, screen_y; - top_view->localPointToScreen(0, 0, &screen_x, &screen_y); + top_ctrl->localPointToScreen(0, 0, &screen_x, &screen_y); glMatrixMode(GL_MODELVIEW); LLUI::pushMatrix(); LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f); - top_view->draw(); + top_ctrl->draw(); LLUI::popMatrix(); } @@ -2065,7 +2318,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // cursor modes, etc, and re-enable. //if (gFocusMgr.getMouseCapture()) //{ - // gFocusMgr.setMouseCapture(NULL, NULL); + // gFocusMgr.setMouseCapture(NULL); // return TRUE; //} } @@ -2131,10 +2384,10 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // Topmost view gets a chance before the hierarchy // *FIX: get rid of this? - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { - if( top_view->handleKey( key, mask, TRUE ) ) + if( top_ctrl->handleKey( key, mask, TRUE ) ) { return TRUE; } @@ -2207,8 +2460,8 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask) } // Topmost view gets a chance before the hierarchy - LLView* top_view = gFocusMgr.getTopView(); - if (top_view && top_view->handleUnicodeChar( uni_char, FALSE ) ) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl && top_ctrl->handleUnicodeChar( uni_char, FALSE ) ) { return TRUE; } @@ -2244,13 +2497,13 @@ void LLViewerWindow::handleScrollWheel(S32 clicks) return; } - LLView* top_view = gFocusMgr.getTopView(); - if (top_view) + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); + if (top_ctrl) { S32 local_x; S32 local_y; - top_view->screenPointToLocal( mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y ); - if (top_view->handleScrollWheel(local_x, local_y, clicks)) return; + top_ctrl->screenPointToLocal( mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y ); + if (top_ctrl->handleScrollWheel(local_x, local_y, clicks)) return; } if (mRootView->handleScrollWheel(mCurrentMousePoint.mX, mCurrentMousePoint.mY, clicks) ) @@ -2396,8 +2649,8 @@ BOOL LLViewerWindow::handlePerFrameHover() BOOL handled = FALSE; - BOOL handled_by_top_view = FALSE; - LLView* top_view = gFocusMgr.getTopView(); + BOOL handled_by_top_ctrl = FALSE; + LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); if( mouse_captor ) @@ -2419,12 +2672,12 @@ BOOL LLViewerWindow::handlePerFrameHover() } else { - if (top_view) + if (top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - handled = top_view->pointInView(local_x, local_y) && top_view->handleHover(local_x, local_y, mask); - handled_by_top_view = TRUE; + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask); + handled_by_top_ctrl = TRUE; } if ( !handled ) @@ -2511,11 +2764,11 @@ BOOL LLViewerWindow::handlePerFrameHover() mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); tool_tip_handled = mouse_captor->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); } - else if (handled_by_top_view) + else if (handled_by_top_ctrl) { S32 local_x, local_y; - top_view->screenPointToLocal( x, y, &local_x, &local_y ); - tool_tip_handled = top_view->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); + top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); + tool_tip_handled = top_ctrl->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); } else { @@ -4155,9 +4408,9 @@ BOOL LLViewerWindow::childHasKeyboardFocus(const LLView* parent) const return gFocusMgr.childHasKeyboardFocus( parent ); } -void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor)) +void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor) { - gFocusMgr.setMouseCapture( new_captor, on_capture_lost ); + gFocusMgr.setMouseCapture( new_captor ); } LLMouseHandler* LLViewerWindow::getMouseCaptor() const @@ -4165,11 +4418,6 @@ LLMouseHandler* LLViewerWindow::getMouseCaptor() const return gFocusMgr.getMouseCapture(); } -BOOL LLViewerWindow::hasMouseCapture(const LLMouseHandler* possible_captor) const -{ - return possible_captor == gFocusMgr.getMouseCapture(); -} - S32 LLViewerWindow::getWindowHeight() const { return mVirtualWindowRect.getHeight(); @@ -4190,19 +4438,19 @@ S32 LLViewerWindow::getWindowDisplayWidth() const return mWindowRect.getWidth(); } -LLView* LLViewerWindow::getTopView() const +LLUICtrl* LLViewerWindow::getTopCtrl() const { - return gFocusMgr.getTopView(); + return gFocusMgr.getTopCtrl(); } -BOOL LLViewerWindow::hasTopView(LLView* view) const +BOOL LLViewerWindow::hasTopCtrl(LLView* view) const { - return view == gFocusMgr.getTopView(); + return view == gFocusMgr.getTopCtrl(); } -void LLViewerWindow::setTopView(LLView* new_top,void (*on_top_lost)(LLView* old_top)) +void LLViewerWindow::setTopCtrl(LLUICtrl* new_top) { - gFocusMgr.setTopView( new_top, on_top_lost ); + gFocusMgr.setTopCtrl( new_top ); } void LLViewerWindow::setupViewport(S32 x_offset, S32 y_offset) @@ -4810,6 +5058,8 @@ LLAlertDialog* LLViewerWindow::alertXmlEditText(const std::string& xml_filename, return alert; } +//////////////////////////////////////////////////////////////////////////// + LLBottomPanel::LLBottomPanel(const LLString &name, const LLRect &rect) : LLPanel(name, rect, FALSE), mIndicator(NULL) diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 5b56bbae06..8f3642ffd3 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -107,8 +107,8 @@ public: BOOL getLeftMouseDown() const { return mLeftMouseDown; } BOOL getRightMouseDown() const { return mRightMouseDown; } - LLView* getTopView() const; - BOOL hasTopView(LLView* view) const; + LLUICtrl* getTopCtrl() const; + BOOL hasTopCtrl(LLView* view) const; void setupViewport(S32 x_offset = 0, S32 y_offset = 0); void setup3DRender(); @@ -160,17 +160,18 @@ public: BOOL hasKeyboardFocus( const LLUICtrl* possible_focus ) const; BOOL childHasKeyboardFocus( const LLView* parent ) const; - void setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor)); // new_captor = NULL to release the mouse. - BOOL hasMouseCapture(const LLMouseHandler* possible_captor ) const; + void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse. LLMouseHandler* getMouseCaptor() const; - void setTopView(LLView* new_top, void (*on_top_lost)(LLView* old_top)); // set new_top = NULL to release top_view. + void setTopCtrl(LLUICtrl* new_top); // set new_top = NULL to release top_view. void reshape(S32 width, S32 height); void sendShapeToSim(); void draw(); // void drawSelectedObjects(); + void updateDebugText(); + void drawDebugText(); static void loadUserImage(void **cb_data, const LLUUID &uuid); @@ -188,7 +189,7 @@ public: BOOL saveSnapshot(const LLString& filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR); BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, - BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR ); + BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR ); BOOL saveImageNumbered(LLImageRaw *raw, const LLString& extension = ""); void playSnapshotAnimAndSound(); @@ -259,7 +260,7 @@ private: void stopGL(BOOL save_state = TRUE); void restoreGL(const LLString& progress_message = LLString::null); void initFonts(F32 zoom_factor = 1.f); - + void analyzeHit( S32 x, // input S32 y_from_bot, // input @@ -272,6 +273,7 @@ private: F32* hit_u_coord, // output F32* hit_v_coord); // output + public: LLWindow* mWindow; // graphical window object @@ -314,13 +316,16 @@ protected: LLString mOverlayTitle; // Used for special titles such as "Second Life - Special E3 2003 Beta" + BOOL mIgnoreActivate; + U8* mPickBuffer; + + class LLDebugText* mDebugText; // Internal class for debug text + +protected: static char sSnapshotBaseName[LL_MAX_PATH]; /* Flawfinder: ignore */ static char sSnapshotDir[LL_MAX_PATH]; /* Flawfinder: ignore */ static char sMovieBaseName[LL_MAX_PATH]; /* Flawfinder: ignore */ - - BOOL mIgnoreActivate; - U8* mPickBuffer; }; class LLBottomPanel : public LLPanel diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 5db295874c..f0e797b6e9 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -90,6 +90,7 @@ #include "llwearablelist.h" #include "llworld.h" #include "pipeline.h" +#include "llglslshader.h" #include "viewer.h" #include "lscript_byteformat.h" @@ -2556,7 +2557,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } // update wind effect - if ((gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)) + if ((LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)) { F32 hover_strength = 0.f; F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast; @@ -3015,38 +3016,30 @@ void LLVOAvatar::updateCharacter(LLAgent &agent) // clear debug text mDebugText.clear(); - if (LLVOAvatar::sShowAnimationDebug) { - LLString playing_anims; - for (LLMotion* motionp = mMotionController.getFirstActiveMotion(); - motionp; - motionp = mMotionController.getNextActiveMotion()) + for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin(); + iter != mMotionController.getActiveMotions().end(); ++iter) + { + LLMotion* motionp = *iter; + if (motionp->getMinPixelArea() < getPixelArea()) { - if (motionp->getMinPixelArea() < getPixelArea()) + std::string output; + if (motionp->getName().empty()) { - char output[MAX_STRING]; /* Flawfinder: ignore */ - if (motionp->getName().empty()) - { - snprintf( /* Flawfinder: ignore */ - output, - MAX_STRING, - "%s - %d", - motionp->getID().asString().c_str(), - (U32)motionp->getPriority()); - } - else - { - snprintf( /* Flawfinder: ignore */ - output, - MAX_STRING, - "%s - %d", - motionp->getName().c_str(), - (U32)motionp->getPriority()); - } - addDebugText(output); + output = llformat("%s - %d", + motionp->getID().asString().c_str(), + (U32)motionp->getPriority()); } + else + { + output = llformat("%s - %d", + motionp->getName().c_str(), + (U32)motionp->getPriority()); + } + addDebugText(output); } + } } if (gNoRender) @@ -4592,7 +4585,7 @@ S32 LLVOAvatar::getCollisionVolumeID(std::string &name) //----------------------------------------------------------------------------- // addDebugText() //----------------------------------------------------------------------------- -void LLVOAvatar::addDebugText(const char* text) + void LLVOAvatar::addDebugText(const std::string& text) { mDebugText.append(1, '\n'); mDebugText.append(text); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 2660e7c90d..3257e921bc 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -368,7 +368,7 @@ public: virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset); virtual LLJoint* findCollisionVolume(U32 volume_id); virtual S32 getCollisionVolumeID(std::string &name); - virtual void addDebugText(const char* text); + virtual void addDebugText(const std::string& text); virtual const LLUUID& getID(); virtual LLJoint *getJoint( const std::string &name ); diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 987d2ac7cb..94f9f0b21f 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -617,7 +617,6 @@ void LLVOSky::restoreGL() calcBrightnessScaleAndColors(); - // Water is currently broken on Mac. if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap) { LLCubeMap* cube_map = getCubeMap(); @@ -1232,18 +1231,14 @@ BOOL LLVOSky::updateSky() mSkyTex[side].createGLImage(mSkyTex[side].getWhich(FALSE)); } next_frame = 0; - //llSkyTex::stepCurrent(); } - if (!gSavedSettings.getBOOL("RenderDynamicReflections")) + std::vector<LLPointer<LLImageRaw> > images; + for (S32 side = 0; side < 6; side++) { - std::vector<LLPointer<LLImageRaw> > images; - for (S32 side = 0; side < 6; side++) - { - images.push_back(mSkyTex[side].getImageRaw(FALSE)); - } - mCubeMap->init(images); + images.push_back(mSkyTex[side].getImageRaw(FALSE)); } + mCubeMap->init(images); } } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index b5b9e06831..a42d447d5f 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -268,7 +268,11 @@ void LLVOVolume::animateTextures() { continue; } - if (result & LLViewerTextureAnim::ROTATE) + if (!(result & LLViewerTextureAnim::ROTATE)) + { + te->getRotation(&rot); + } + { F32 axis = -1; F32 s,t; @@ -293,16 +297,20 @@ void LLVOVolume::animateTextures() tex_mat.identity(); tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); - tex_mat.rotate(quat); - - if (result & LLViewerTextureAnim::SCALE) + tex_mat.rotate(quat); + + if (!(result & LLViewerTextureAnim::SCALE)) + { + te->getScale(&scale_s, &scale_t); + } + { scale.setVec(scale_s, scale_t, 1.f); LLMatrix4 mat; mat.initAll(scale, LLQuaternion(), LLVector3()); tex_mat *= mat; } - + tex_mat.translate(trans); } } @@ -310,6 +318,35 @@ void LLVOVolume::animateTextures() { if (mTexAnimMode && mTextureAnimp->mRate == 0) { + U8 start, count; + + if (mTextureAnimp->mFace == -1) + { + start = 0; + count = getNumTEs(); + } + else + { + start = (U8) mTextureAnimp->mFace; + count = 1; + } + + for (S32 i = start; i < start + count; i++) + { + if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE) + { + setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT); + } + if (mTexAnimMode & LLViewerTextureAnim::SCALE) + { + setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT); + } + if (mTexAnimMode & LLViewerTextureAnim::ROTATE) + { + setTERotation(i, mTextureAnimp->mRot); + } + } + gPipeline.markTextured(mDrawable); mFaceMappingChanged = TRUE; mTexAnimMode = 0; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 752d5a38c6..83420f8761 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -11,6 +11,7 @@ #include "llworld.h" #include "indra_constants.h" +#include "llstl.h" #include "llagent.h" #include "llviewercontrol.h" @@ -90,8 +91,7 @@ LLWorld::LLWorld(const U32 grids_per_region, const F32 meters_per_grid) LLWorld::~LLWorld() { gObjectList.killAllObjects(); - - mRegionList.deleteAllData(); + for_each(mRegionList.begin(), mRegionList.end(), DeletePointer()); } @@ -151,9 +151,9 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) regionp->mCloudLayer.setWidth((F32)mWidth); regionp->mCloudLayer.setWindPointer(®ionp->mWind); - mRegionList.addData(regionp); - mActiveRegionList.addData(regionp); - mCulledRegionList.addData(regionp); + mRegionList.push_back(regionp); + mActiveRegionList.push_back(regionp); + mCulledRegionList.push_back(regionp); // Find all the adjacent regions, and attach them. @@ -205,9 +205,10 @@ void LLWorld::removeRegion(const LLHost &host) if (regionp == gAgent.getRegion()) { - LLViewerRegion *reg; - for (reg = mRegionList.getFirstData(); reg; reg = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* reg = *iter; llwarns << "RegionDump: " << reg->getName() << " " << reg->getHost() << " " << reg->getOriginGlobal() @@ -230,42 +231,23 @@ void LLWorld::removeRegion(const LLHost &host) from_region_handle(regionp->getHandle(), &x, &y); llinfos << "Removing region " << x << ":" << y << llendl; - // This code can probably be blitzed now... - if (!mRegionList.removeData(regionp)) - { - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) - { - llwarns << "RegionDump: " << regionp->getName() - << " " << regionp->getHost() - << " " << regionp->getOriginGlobal() - << llendl; - } - - llerrs << "Region list is broken" << llendl; - } - - if (!mActiveRegionList.removeData(regionp)) - { - llwarns << "LLWorld.mActiveRegionList is broken." << llendl; - } - if (!mCulledRegionList.removeData(regionp)) - { - if (!mVisibleRegionList.removeData(regionp)) - { - llwarns << "LLWorld.mCulled/mVisibleRegionList are broken" << llendl;; - } - } + mRegionList.remove(regionp); + mActiveRegionList.remove(regionp); + mCulledRegionList.remove(regionp); + mVisibleRegionList.remove(regionp); + delete regionp; updateWaterObjects(); } -LLViewerRegion *LLWorld::getRegion(const LLHost &host) +LLViewerRegion* LLWorld::getRegion(const LLHost &host) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->getHost() == host) { return regionp; @@ -274,16 +256,17 @@ LLViewerRegion *LLWorld::getRegion(const LLHost &host) return NULL; } -LLViewerRegion *LLWorld::getRegionFromPosAgent(const LLVector3 &pos) +LLViewerRegion* LLWorld::getRegionFromPosAgent(const LLVector3 &pos) { return getRegionFromPosGlobal(gAgent.getPosGlobalFromAgent(pos)); } -LLViewerRegion *LLWorld::getRegionFromPosGlobal(const LLVector3d &pos) +LLViewerRegion* LLWorld::getRegionFromPosGlobal(const LLVector3d &pos) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->pointInRegionGlobal(pos)) { return regionp; @@ -357,11 +340,12 @@ LLVector3d LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVe return regionp->getPosGlobalFromRegion(LLVector3(final_region_pos)); } -LLViewerRegion *LLWorld::getRegionFromHandle(const U64 &handle) +LLViewerRegion* LLWorld::getRegionFromHandle(const U64 &handle) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->getHandle() == handle) { return regionp; @@ -374,9 +358,10 @@ LLViewerRegion *LLWorld::getRegionFromHandle(const U64 &handle) void LLWorld::updateAgentOffset(const LLVector3d &offset_global) { #if 0 - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->setAgentOffset(offset_global); } #endif @@ -385,9 +370,10 @@ void LLWorld::updateAgentOffset(const LLVector3d &offset_global) BOOL LLWorld::positionRegionValidGlobal(const LLVector3d &pos_global) { - LLViewerRegion *regionp; - for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp->pointInRegionGlobal(pos_global)) { return TRUE; @@ -552,32 +538,29 @@ void LLWorld::updateVisibilities() gCamera->setFar(mLandFarClip); - LLViewerRegion *regionp; - F32 diagonal_squared = F_SQRT2 * F_SQRT2 * mWidth * mWidth; // Go through the culled list and check for visible regions - for (regionp = mCulledRegionList.getFirstData(); - regionp; - regionp = mCulledRegionList.getNextData()) + for (region_list_t::iterator iter = mCulledRegionList.begin(); + iter != mCulledRegionList.end(); ) { + region_list_t::iterator curiter = iter++; + LLViewerRegion* regionp = *curiter; F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ(); F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared); if (!regionp->getLand().hasZData() || gCamera->sphereInFrustum(regionp->getCenterAgent(), radius)) { - mCulledRegionList.removeCurrentData(); - mVisibleRegionList.addDataAtEnd(regionp); + mCulledRegionList.erase(curiter); + mVisibleRegionList.push_back(regionp); } } - F32 last_dist_squared = 0.0f; - F32 dist_squared; - - // Update all of the visible regions and make single bubble-sort pass - for (regionp = mVisibleRegionList.getFirstData(); - regionp; - regionp = mVisibleRegionList.getNextData()) + // Update all of the visible regions + for (region_list_t::iterator iter = mVisibleRegionList.begin(); + iter != mVisibleRegionList.end(); ) { + region_list_t::iterator curiter = iter++; + LLViewerRegion* regionp = *curiter; if (!regionp->getLand().hasZData()) { continue; @@ -587,44 +570,35 @@ void LLWorld::updateVisibilities() F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared); if (gCamera->sphereInFrustum(regionp->getCenterAgent(), radius)) { + regionp->calculateCameraDistance(); if (!gNoRender) { regionp->getLand().updatePatchVisibilities(gAgent); } - - // sort by distance... closer regions to the front - // Note: regions use absolute frame so we use the agent's center - dist_squared = (F32)(gAgent.getCameraPositionGlobal() - regionp->getCenterGlobal()).magVecSquared(); - if (dist_squared < last_dist_squared) - { - mVisibleRegionList.swapCurrentWithPrevious(); - } - else - { - last_dist_squared = dist_squared; - } } else { - mVisibleRegionList.removeCurrentData(); - mCulledRegionList.addData(regionp); + mVisibleRegionList.erase(curiter); + mCulledRegionList.push_back(regionp); } } + // Sort visible regions + mVisibleRegionList.sort(LLViewerRegion::CompareDistance()); + gCamera->setFar(cur_far_clip); } void LLWorld::updateRegions(F32 max_update_time) { - LLViewerRegion *regionp; LLTimer update_timer; BOOL did_one = FALSE; // Perform idle time updates for the regions (and associated surfaces) - for (regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; F32 max_time = max_update_time - update_timer.getElapsedTimeF32(); if (did_one && max_time <= 0.f) break; @@ -645,47 +619,45 @@ void LLWorld::updateClouds(const F32 dt) // don't move clouds in snapshot mode return; } - LLViewerRegion *regionp; - if (mActiveRegionList.getLength()) + if (mActiveRegionList.size()) { // Update all the cloud puff positions, and timer based stuff // such as death decay - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->mCloudLayer.updatePuffs(dt); } // Reshuffle who owns which puffs - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->mCloudLayer.updatePuffOwnership(); } // Add new puffs - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->mCloudLayer.updatePuffCount(); } } } -LLCloudGroup *LLWorld::findCloudGroup(const LLCloudPuff &puff) +LLCloudGroup* LLWorld::findCloudGroup(const LLCloudPuff &puff) { - LLViewerRegion *regionp; - if (mActiveRegionList.getLength()) + if (mActiveRegionList.size()) { // Update all the cloud puff positions, and timer based stuff // such as death decay - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; LLCloudGroup *groupp = regionp->mCloudLayer.findCloudGroup(puff); if (groupp) { @@ -702,11 +674,12 @@ void LLWorld::renderPropertyLines() S32 region_count = 0; S32 vertex_count = 0; - LLViewerRegion* region; - for (region = mVisibleRegionList.getFirstData(); region; region = mVisibleRegionList.getNextData() ) + for (region_list_t::iterator iter = mVisibleRegionList.begin(); + iter != mVisibleRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; region_count++; - vertex_count += region->renderPropertyLines(); + vertex_count += regionp->renderPropertyLines(); } } @@ -715,10 +688,11 @@ void LLWorld::updateNetStats() { F32 bits = 0.f; U32 packets = 0; - LLViewerRegion *regionp; - for (regionp = mActiveRegionList.getFirstData(); regionp; regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->updateNetStats(); bits += regionp->mBitStat.getCurrent(); packets += llfloor( regionp->mPacketsStat.getCurrent() ); @@ -753,27 +727,24 @@ void LLWorld::updateNetStats() void LLWorld::printPacketsLost() { - LLViewerRegion *regionp; - llinfos << "Simulators:" << llendl; llinfos << "----------" << llendl; LLCircuitData *cdp = NULL; - for (regionp = mActiveRegionList.getFirstData(); - regionp; - regionp = mActiveRegionList.getNextData()) + for (region_list_t::iterator iter = mActiveRegionList.begin(); + iter != mActiveRegionList.end(); ++iter) + { + LLViewerRegion* regionp = *iter; + cdp = gMessageSystem->mCircuitInfo.findCircuit(regionp->getHost()); + if (cdp) { - cdp = gMessageSystem->mCircuitInfo.findCircuit(regionp->getHost()); - if (cdp) - { - LLVector3d range = regionp->getCenterGlobal() - gAgent.getPositionGlobal(); + LLVector3d range = regionp->getCenterGlobal() - gAgent.getPositionGlobal(); - llinfos << regionp->getHost() << ", range: " << range.magVec() << - " packets lost: " << - cdp->getPacketsLost() << llendl; - } + llinfos << regionp->getHost() << ", range: " << range.magVec() + << " packets lost: " << cdp->getPacketsLost() << llendl; } - + } + llinfos << "UserServer:" << llendl; llinfos << "-----------" << llendl; @@ -786,9 +757,11 @@ void LLWorld::printPacketsLost() void LLWorld::processCoarseUpdate(LLMessageSystem* msg, void** user_data) { - LLViewerRegion* region = NULL; - region = gWorldp->getRegion(msg->getSender()); - if( region ) region->updateCoarseLocations(msg); + LLViewerRegion* region = gWorldp->getRegion(msg->getSender()); + if( region ) + { + region->updateCoarseLocations(msg); + } } F32 LLWorld::getLandFarClip() const @@ -809,49 +782,55 @@ void LLWorld::updateWaterObjects() { return; } - S32 min_x, min_y, max_x, max_y; - U32 region_x, region_y; - - S32 rwidth = llfloor(getRegionWidthInMeters()); - - // First, determine the min and max "box" of water objects - LLViewerRegion *regionp; - regionp = mRegionList.getFirstData(); - - if (!regionp) + if (mRegionList.empty()) { llwarns << "No regions!" << llendl; return; } - from_region_handle(regionp->getHandle(), ®ion_x, ®ion_y); - min_x = max_x = region_x; - min_y = max_y = region_y; + // First, determine the min and max "box" of water objects + bool first = true; + S32 min_x, min_y, max_x, max_y; + U32 region_x, region_y; - LLVOWater *waterp; + S32 rwidth = llfloor(getRegionWidthInMeters()); - for (; regionp; regionp = mRegionList.getNextData()) + + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; from_region_handle(regionp->getHandle(), ®ion_x, ®ion_y); - min_x = llmin(min_x, (S32)region_x); - min_y = llmin(min_y, (S32)region_y); - max_x = llmax(max_x, (S32)region_x); - max_y = llmax(max_y, (S32)region_y); - waterp = regionp->getLand().getWaterObj(); + if (first) + { + first = false; + min_x = max_x = region_x; + min_y = max_y = region_y; + } + else + { + min_x = llmin(min_x, (S32)region_x); + min_y = llmin(min_y, (S32)region_y); + max_x = llmax(max_x, (S32)region_x); + max_y = llmax(max_y, (S32)region_y); + } + LLVOWater* waterp = regionp->getLand().getWaterObj(); if (waterp) { gObjectList.updateActive(waterp); } } - for (waterp = mHoleWaterObjects.getFirstData(); waterp; waterp = mHoleWaterObjects.getNextData()) + for (std::list<LLVOWater*>::iterator iter = mHoleWaterObjects.begin(); + iter != mHoleWaterObjects.end(); ++ iter) { + LLVOWater* waterp = *iter; gObjectList.killObject(waterp); } - mHoleWaterObjects.removeAllNodes(); + mHoleWaterObjects.clear(); // We only want to fill in holes for stuff that's near us, say, within 512m - regionp = gAgent.getRegion(); + LLViewerRegion* regionp = gAgent.getRegion(); from_region_handle(regionp->getHandle(), ®ion_x, ®ion_y); min_x = llmax((S32)region_x - 512, min_x); @@ -868,14 +847,14 @@ void LLWorld::updateWaterObjects() U64 region_handle = to_region_handle(x, y); if (!getRegionFromHandle(region_handle)) { - waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion()); + LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion()); waterp->setUseTexture(FALSE); gPipeline.addObject(waterp); waterp->setPositionGlobal(LLVector3d(x + rwidth/2, y + rwidth/2, DEFAULT_WATER_HEIGHT)); waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 0.f)); - mHoleWaterObjects.addData(waterp); + mHoleWaterObjects.push_back(waterp); } } } @@ -924,7 +903,7 @@ void LLWorld::updateWaterObjects() const S32 water_center_y = center_y + llround((wy + dim[1]) * 0.5f * gDirAxes[dir][1]); - waterp = mEdgeWaterObjects[dir]; + LLVOWater* waterp = mEdgeWaterObjects[dir]; if (!waterp || waterp->isDead()) { // The edge water objects can be dead because they're attached to the region that the @@ -952,7 +931,7 @@ void LLWorld::updateWaterObjects() //llinfos << "End water update" << llendl; } -LLViewerImage *LLWorld::getDefaultWaterTexture() +LLViewerImage* LLWorld::getDefaultWaterTexture() { return mDefaultWaterTexturep; } @@ -969,10 +948,10 @@ U64 LLWorld::getSpaceTimeUSec() const void LLWorld::requestCacheMisses() { - for(LLViewerRegion* regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; regionp->requestCacheMisses(); } } @@ -980,10 +959,10 @@ void LLWorld::requestCacheMisses() LLString LLWorld::getInfoString() { LLString info_string("World Info:\n"); - for (LLViewerRegion* regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; info_string += regionp->getInfoString(); } return info_string; @@ -992,10 +971,10 @@ LLString LLWorld::getInfoString() void LLWorld::disconnectRegions() { LLMessageSystem* msg = gMessageSystem; - for(LLViewerRegion* regionp = mRegionList.getFirstData(); - regionp; - regionp = mRegionList.getNextData()) + for (region_list_t::iterator iter = mRegionList.begin(); + iter != mRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; if (regionp == gAgent.getRegion()) { // Skip the main agent @@ -1075,8 +1054,11 @@ void process_region_handshake(LLMessageSystem* msg, void** user_data) void send_agent_pause() { // world not initialized yet - if (!gWorldp) return; - + if (!gWorldp) + { + return; + } + gMessageSystem->newMessageFast(_PREHASH_AgentPause); gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID); @@ -1085,11 +1067,10 @@ void send_agent_pause() gAgentPauseSerialNum++; gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); - LLViewerRegion *regionp; - for (regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; gMessageSystem->sendReliable(regionp->getHost()); } @@ -1113,11 +1094,10 @@ void send_agent_resume() gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); - LLViewerRegion *regionp; - for (regionp = gWorldp->mActiveRegionList.getFirstData(); - regionp; - regionp = gWorldp->mActiveRegionList.getNextData()) + for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin(); + iter != gWorldp->mActiveRegionList.end(); ++iter) { + LLViewerRegion* regionp = *iter; gMessageSystem->sendReliable(regionp->getHost()); } diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h index 0d0d1b3211..4c1dc0343e 100644 --- a/indra/newview/llworld.h +++ b/indra/newview/llworld.h @@ -10,8 +10,6 @@ #define LL_LLWORLD_H #include "llpatchvertexarray.h" -#include "doublelinkedlist.h" -#include "linked_lists.h" #include "llmath.h" //#include "vmath.h" @@ -122,14 +120,17 @@ public: U64 getSpaceTimeUSec() const; LLString getInfoString(); + public: - LLDoubleLinkedList<LLViewerRegion> mActiveRegionList; + typedef std::list<LLViewerRegion*> region_list_t; + + region_list_t mActiveRegionList; LLViewerPartSim mPartSim; private: - LLLinkedList<LLViewerRegion> mRegionList; - LLDoubleLinkedList<LLViewerRegion> mVisibleRegionList; - LLDoubleLinkedList<LLViewerRegion> mCulledRegionList; + region_list_t mRegionList; + region_list_t mVisibleRegionList; + region_list_t mCulledRegionList; // Number of points on edge const U32 mWidth; @@ -156,7 +157,7 @@ private: U32 mMinRegionY; U32 mMaxRegionY; - LLLinkedList<LLVOWater> mHoleWaterObjects; + std::list<LLVOWater*> mHoleWaterObjects; LLPointer<LLVOWater> mEdgeWaterObjects[8]; LLPointer<LLViewerImage> mDefaultWaterTexturep; diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index fde1411563..9d2fb122e5 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1770,7 +1770,7 @@ BOOL outside_slop(S32 x, S32 y, S32 start_x, S32 start_y) BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask ) { - gFocusMgr.setMouseCapture( this, NULL ); + gFocusMgr.setMouseCapture( this ); mMouseDownPanX = llround(sPanX); mMouseDownPanY = llround(sPanY); @@ -1782,7 +1782,7 @@ BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask ) { - if (this == gFocusMgr.getMouseCapture()) + if (hasMouseCapture()) { if (mPanning) { @@ -1809,7 +1809,7 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask ) handleClick(x, y, mask, &hit_type, &id); } gViewerWindow->showCursor(); - gFocusMgr.setMouseCapture( NULL, NULL ); + gFocusMgr.setMouseCapture( NULL ); return TRUE; } return FALSE; @@ -1855,7 +1855,7 @@ void LLWorldMapView::updateVisibleBlocks() BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask ) { - if (this == gFocusMgr.getMouseCapture()) + if (hasMouseCapture()) { if (mPanning || outside_slop(x, y, mMouseDownX, mMouseDownY)) { diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 6b7f60457d..52ceb481d9 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -71,6 +71,8 @@ #include "viewer.h" #include "llcubemap.h" #include "lldebugmessagebox.h" +#include "llglslshader.h" +#include "llviewerjoystick.h" #ifdef _DEBUG // Debug indices is disabled for now for debug performance - djs 4/24/02 @@ -110,84 +112,6 @@ S32 gTrivialAccepts = 0; BOOL gRenderForSelect = FALSE; -//glsl parameter tables -const char* LLPipeline::sReservedAttribs[] = -{ - "materialColor", - "specularColor", - "binormal" -}; - -U32 LLPipeline::sReservedAttribCount = LLPipeline::GLSL_END_RESERVED_ATTRIBS; - -const char* LLPipeline::sAvatarAttribs[] = -{ - "weight", - "clothing", - "gWindDir", - "gSinWaveParams", - "gGravity" -}; - -U32 LLPipeline::sAvatarAttribCount = sizeof(LLPipeline::sAvatarAttribs)/sizeof(char*); - -const char* LLPipeline::sAvatarUniforms[] = -{ - "matrixPalette" -}; - -U32 LLPipeline::sAvatarUniformCount = 1; - -const char* LLPipeline::sReservedUniforms[] = -{ - "diffuseMap", - "specularMap", - "bumpMap", - "environmentMap", - "scatterMap" -}; - -U32 LLPipeline::sReservedUniformCount = LLPipeline::GLSL_END_RESERVED_UNIFORMS; - -const char* LLPipeline::sTerrainUniforms[] = -{ - "detail0", - "detail1", - "alphaRamp" -}; - -U32 LLPipeline::sTerrainUniformCount = sizeof(LLPipeline::sTerrainUniforms)/sizeof(char*); - -const char* LLPipeline::sGlowUniforms[] = -{ - "delta" -}; - -U32 LLPipeline::sGlowUniformCount = sizeof(LLPipeline::sGlowUniforms)/sizeof(char*); - -const char* LLPipeline::sShinyUniforms[] = -{ - "origin" -}; - -U32 LLPipeline::sShinyUniformCount = sizeof(LLPipeline::sShinyUniforms)/sizeof(char*); - -const char* LLPipeline::sWaterUniforms[] = -{ - "screenTex", - "eyeVec", - "time", - "d1", - "d2", - "lightDir", - "specular", - "lightExp", - "fbScale", - "refScale" -}; - -U32 LLPipeline::sWaterUniformCount = sizeof(LLPipeline::sWaterUniforms)/sizeof(char*); - //---------------------------------------- void stamp(F32 x, F32 y, F32 xs, F32 ys) @@ -227,7 +151,6 @@ BOOL LLPipeline::sUseOcclusion = FALSE; BOOL LLPipeline::sSkipUpdate = FALSE; BOOL LLPipeline::sDynamicReflections = FALSE; BOOL LLPipeline::sRenderGlow = FALSE; -BOOL LLPipeline::sOverrideAgentCamera = FALSE; LLPipeline::LLPipeline() : mScreenTex(0), @@ -298,14 +221,7 @@ void LLPipeline::init() // Enable features stop_glerror(); - setShaders(); -} - -void LLPipeline::LLScatterShader::init(GLhandleARB shader, int map_stage) -{ - glUseProgramObjectARB(shader); - glUniform1iARB(glGetUniformLocationARB(shader, "scatterMap"), map_stage); - glUseProgramObjectARB(0); + LLShaderMgr::setShaders(); } LLPipeline::~LLPipeline() @@ -381,7 +297,6 @@ void LLPipeline::cleanup() } mObjectPartition.clear(); - mGroupQ.clear(); mVisibleList.clear(); mVisibleGroups.clear(); mDrawableGroups.clear(); @@ -400,7 +315,6 @@ void LLPipeline::destroyGL() stop_glerror(); unloadShaders(); mHighlightFaces.clear(); - mGroupQ.clear(); mVisibleList.clear(); mVisibleGroups.clear(); mDrawableGroups.clear(); @@ -460,7 +374,7 @@ void LLPipeline::restoreGL() if (mVertexShadersEnabled) { - setShaders(); + LLShaderMgr::setShaders(); } for (U32 i = 0; i < mObjectPartition.size()-1; i++) @@ -472,352 +386,6 @@ void LLPipeline::restoreGL() } } -//============================================================================ -// Load Shader - -static LLString get_object_log(GLhandleARB ret) -{ - LLString res; - - //get log length - GLint length; - glGetObjectParameterivARB(ret, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length); - if (length > 0) - { - //the log could be any size, so allocate appropriately - GLcharARB* log = new GLcharARB[length]; - glGetInfoLogARB(ret, length, &length, log); - res = LLString(log); - delete[] log; - } - return res; -} - -void LLPipeline::dumpObjectLog(GLhandleARB ret, BOOL warns) -{ - LLString log = get_object_log(ret); - if (warns) - { - llwarns << log << llendl; - } - else - { - llinfos << log << llendl; - } -} - -GLhandleARB LLPipeline::loadShader(const LLString& filename, S32 cls, GLenum type) -{ - GLenum error; - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR entering loadShader(): " << error << llendl; - } - - llinfos << "Loading shader file: " << filename << llendl; - - if (filename.empty()) - { - return 0; - } - - - //read in from file - FILE* file = NULL; - - S32 try_gpu_class = mVertexShaderLevel[cls]; - S32 gpu_class; - - //find the most relevant file - for (gpu_class = try_gpu_class; gpu_class > 0; gpu_class--) - { //search from the current gpu class down to class 1 to find the most relevant shader - std::stringstream fname; - fname << gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class"); - fname << gpu_class << "/" << filename; - -// llinfos << "Looking in " << fname.str().c_str() << llendl; - file = fopen(fname.str().c_str(), "r"); /* Flawfinder: ignore */ - if (file) - { - break; // done - } - } - - if (file == NULL) - { - llinfos << "GLSL Shader file not found: " << filename << llendl; - return 0; - } - - //we can't have any lines longer than 1024 characters - //or any shaders longer than 1024 lines... deal - DaveP - GLcharARB buff[1024]; - GLcharARB* text[1024]; - GLuint count = 0; - - //copy file into memory - while(fgets(buff, 1024, file) != NULL) - { - text[count++] = strdup(buff); - } - fclose(file); - - //create shader object - GLhandleARB ret = glCreateShaderObjectARB(type); - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR in glCreateShaderObjectARB: " << error << llendl; - } - else - { - //load source - glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL); - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR in glShaderSourceARB: " << error << llendl; - } - else - { - //compile source - glCompileShaderARB(ret); - error = glGetError(); - if (error != GL_NO_ERROR) - { - llwarns << "GL ERROR in glCompileShaderARB: " << error << llendl; - } - } - } - //free memory - for (GLuint i = 0; i < count; i++) - { - free(text[i]); - } - if (error == GL_NO_ERROR) - { - //check for errors - GLint success = GL_TRUE; - glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success); - error = glGetError(); - if (error != GL_NO_ERROR || success == GL_FALSE) - { - //an error occured, print log - llwarns << "GLSL Compilation Error: (" << error << ") in " << filename << llendl; - dumpObjectLog(ret); - ret = 0; - } - } - else - { - ret = 0; - } - stop_glerror(); - - //successfully loaded, save results -#if 1 // 1.9.1 - if (ret) - { - mVertexShaderLevel[cls] = try_gpu_class; - } - else - { - if (mVertexShaderLevel[cls] > 1) - { - mVertexShaderLevel[cls] = mVertexShaderLevel[cls] - 1; - ret = loadShader(filename,cls,type); - if (ret && mMaxVertexShaderLevel[cls] > mVertexShaderLevel[cls]) - { - mMaxVertexShaderLevel[cls] = mVertexShaderLevel[cls]; - } - } - } -#else - if (ret) - { - S32 max = -1; - /*if (try_gpu_class == mMaxVertexShaderLevel[cls]) - { - max = gpu_class; - }*/ - saveVertexShaderLevel(cls,try_gpu_class,max); - } - else - { - if (mVertexShaderLevel[cls] > 1) - { - mVertexShaderLevel[cls] = mVertexShaderLevel[cls] - 1; - ret = loadShader(f,cls,type); - if (ret && mMaxVertexShaderLevel[cls] > mVertexShaderLevel[cls]) - { - saveVertexShaderLevel(cls, mVertexShaderLevel[cls], mVertexShaderLevel[cls]); - } - } - } -#endif - return ret; -} - -BOOL LLPipeline::linkProgramObject(GLhandleARB obj, BOOL suppress_errors) -{ - //check for errors - glLinkProgramARB(obj); - GLint success = GL_TRUE; - glGetObjectParameterivARB(obj, GL_OBJECT_LINK_STATUS_ARB, &success); - if (!suppress_errors && success == GL_FALSE) - { - //an error occured, print log - llwarns << "GLSL Linker Error:" << llendl; - } - - LLString log = get_object_log(obj); - LLString::toLower(log); - if (log.find("software") != LLString::npos) - { - llwarns << "GLSL Linker: Running in Software:" << llendl; - success = GL_FALSE; - suppress_errors = FALSE; - } - if (!suppress_errors) - { - dumpObjectLog(obj, !success); - } - - return success; -} - -BOOL LLPipeline::validateProgramObject(GLhandleARB obj) -{ - //check program validity against current GL - glValidateProgramARB(obj); - GLint success = GL_TRUE; - glGetObjectParameterivARB(obj, GL_OBJECT_VALIDATE_STATUS_ARB, &success); - if (success == GL_FALSE) - { - llwarns << "GLSL program not valid: " << llendl; - dumpObjectLog(obj); - } - else - { - dumpObjectLog(obj, FALSE); - } - - return success; -} - -//============================================================================ -// Shader Management - -void LLPipeline::setShaders() -{ - if (gGLManager.mHasFramebufferObject) - { - sDynamicReflections = gSavedSettings.getBOOL("RenderDynamicReflections"); - sRenderGlow = gSavedSettings.getBOOL("RenderGlow"); - } - else - { - sDynamicReflections = sRenderGlow = FALSE; - } - - //hack to reset buffers that change behavior with shaders - resetVertexBuffers(); - - if (gViewerWindow) - { - gViewerWindow->setCursor(UI_CURSOR_WAIT); - } - - // Lighting - setLightingDetail(-1); - - // Shaders - for (S32 i=0; i<SHADER_COUNT; i++) - { - mVertexShaderLevel[i] = 0; - mMaxVertexShaderLevel[i] = 0; - } - if (canUseVertexShaders()) - { - S32 light_class = 2; - S32 env_class = 2; - S32 obj_class = 0; - - if (getLightingDetail() == 0) - { - light_class = 1; - } - // Load lighting shaders - mVertexShaderLevel[SHADER_LIGHTING] = light_class; - mMaxVertexShaderLevel[SHADER_LIGHTING] = light_class; - mVertexShaderLevel[SHADER_ENVIRONMENT] = env_class; - mMaxVertexShaderLevel[SHADER_ENVIRONMENT] = env_class; - mVertexShaderLevel[SHADER_OBJECT] = obj_class; - mMaxVertexShaderLevel[SHADER_OBJECT] = obj_class; - - BOOL loaded = loadShadersLighting(); - - if (loaded) - { - mVertexShadersEnabled = TRUE; - mVertexShadersLoaded = 1; - - // Load all shaders to set max levels - loadShadersEnvironment(); - loadShadersObject(); - // Load max avatar shaders to set the max level - mVertexShaderLevel[SHADER_AVATAR] = 3; - mMaxVertexShaderLevel[SHADER_AVATAR] = 3; - loadShadersAvatar(); - - // Load shaders to correct levels - if (!gSavedSettings.getBOOL("RenderRippleWater")) - { - mVertexShaderLevel[SHADER_ENVIRONMENT] = 0; - loadShadersEnvironment(); // unloads - } - -#if LL_DARWIN // force avatar shaders off for mac - mVertexShaderLevel[SHADER_AVATAR] = 0; - mMaxVertexShaderLevel[SHADER_AVATAR] = 0; -#else - if (gSavedSettings.getBOOL("RenderAvatarVP")) - { - S32 avatar = gSavedSettings.getS32("RenderAvatarMode"); - S32 avatar_class = 1 + avatar; - // Set the actual level - mVertexShaderLevel[SHADER_AVATAR] = avatar_class; - loadShadersAvatar(); - if (mVertexShaderLevel[SHADER_AVATAR] != avatar_class) - { - if (mVertexShaderLevel[SHADER_AVATAR] == 0) - { - gSavedSettings.setBOOL("RenderAvatarVP", FALSE); - } - avatar = llmax(mVertexShaderLevel[SHADER_AVATAR]-1,0); - gSavedSettings.setS32("RenderAvatarMode", avatar); - } - } - else - { - mVertexShaderLevel[SHADER_AVATAR] = 0; - gSavedSettings.setS32("RenderAvatarMode", 0); - loadShadersAvatar(); // unloads - } -#endif - } - else - { - mVertexShadersEnabled = FALSE; - mVertexShadersLoaded = 0; - } - } - if (gViewerWindow) - { - gViewerWindow->setCursor(UI_CURSOR_ARROW); - } -} BOOL LLPipeline::canUseVertexShaders() { @@ -836,490 +404,10 @@ BOOL LLPipeline::canUseVertexShaders() void LLPipeline::unloadShaders() { - mObjectSimpleProgram.unload(); - mObjectShinyProgram.unload(); - mObjectBumpProgram.unload(); - mObjectAlphaProgram.unload(); - mWaterProgram.unload(); - mTerrainProgram.unload(); - mGlowProgram.unload(); - mGroundProgram.unload(); - mAvatarProgram.unload(); - mAvatarEyeballProgram.unload(); - mAvatarPickProgram.unload(); - mHighlightProgram.unload(); - - mVertexShaderLevel[SHADER_LIGHTING] = 0; - mVertexShaderLevel[SHADER_OBJECT] = 0; - mVertexShaderLevel[SHADER_AVATAR] = 0; - mVertexShaderLevel[SHADER_ENVIRONMENT] = 0; - mVertexShaderLevel[SHADER_INTERFACE] = 0; - - mLightVertex = mLightFragment = mScatterVertex = mScatterFragment = 0; + LLShaderMgr::unloadShaders(); mVertexShadersLoaded = 0; } -#if 0 // 1.9.2 -// Any time shader options change -BOOL LLPipeline::loadShaders() -{ - unloadShaders(); - - if (!canUseVertexShaders()) - { - return FALSE; - } - - S32 light_class = mMaxVertexShaderLevel[SHADER_LIGHTING]; - if (getLightingDetail() == 0) - { - light_class = 1; // Use minimum lighting shader - } - else if (getLightingDetail() == 1) - { - light_class = 2; // Use medium lighting shader - } - mVertexShaderLevel[SHADER_LIGHTING] = light_class; - //mVertexShaderLevel[SHADER_OBJECT] = llmin(mMaxVertexShaderLevel[SHADER_OBJECT], gSavedSettings.getS32("VertexShaderLevelObject")); - mVertexShaderLevel[SHADER_OBJECT] = 0; - mVertexShaderLevel[SHADER_AVATAR] = llmin(mMaxVertexShaderLevel[SHADER_AVATAR], gSavedSettings.getS32("VertexShaderLevelAvatar")); - mVertexShaderLevel[SHADER_ENVIRONMENT] = llmin(mMaxVertexShaderLevel[SHADER_ENVIRONMENT], gSavedSettings.getS32("VertexShaderLevelEnvironment")); - mVertexShaderLevel[SHADER_INTERFACE] = mMaxVertexShaderLevel[SHADER_INTERFACE]; - - BOOL loaded = loadShadersLighting(); - if (loaded) - { - loadShadersEnvironment(); // Must load this before object/avatar for scatter - loadShadersObject(); - loadShadersAvatar(); - loadShadersInterface(); - mVertexShadersLoaded = 1; - } - else - { - unloadShaders(); - mVertexShadersEnabled = FALSE; - mVertexShadersLoaded = 0; //-1; // -1 = failed - setLightingDetail(-1); - } - - return loaded; -} -#endif - -BOOL LLPipeline::loadShadersLighting() -{ - // Load light dependency shaders first - // All of these have to load for any shaders to function - - std::string lightvertex = "lighting/lightV.glsl"; - //get default light function implementation - mLightVertex = loadShader(lightvertex, SHADER_LIGHTING, GL_VERTEX_SHADER_ARB); - if( !mLightVertex ) - { - llwarns << "Failed to load " << lightvertex << llendl; - return FALSE; - } - - std::string lightfragment = "lighting/lightF.glsl"; - mLightFragment = loadShader(lightfragment, SHADER_LIGHTING, GL_FRAGMENT_SHADER_ARB); - if ( !mLightFragment ) - { - llwarns << "Failed to load " << lightfragment << llendl; - return FALSE; - } - - // NOTE: Scatter shaders use the ENVIRONMENT detail level - - std::string scattervertex = "environment/scatterV.glsl"; - mScatterVertex = loadShader(scattervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB); - if ( !mScatterVertex ) - { - llwarns << "Failed to load " << scattervertex << llendl; - return FALSE; - } - - std::string scatterfragment = "environment/scatterF.glsl"; - mScatterFragment = loadShader(scatterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB); - if ( !mScatterFragment ) - { - llwarns << "Failed to load " << scatterfragment << llendl; - return FALSE; - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersEnvironment() -{ - GLhandleARB baseObjects[] = - { - mLightFragment, - mLightVertex, - mScatterFragment, - mScatterVertex - }; - S32 baseCount = 4; - - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_ENVIRONMENT] == 0) - { - mWaterProgram.unload(); - mGroundProgram.unload(); - mTerrainProgram.unload(); - mGlowProgram.unload(); - return FALSE; - } - - if (success) - { - //load water vertex shader - std::string waterfragment = "environment/waterF.glsl"; - std::string watervertex = "environment/waterV.glsl"; - mWaterProgram.mProgramObject = glCreateProgramObjectARB(); - mWaterProgram.attachObjects(baseObjects, baseCount); - mWaterProgram.attachObject(loadShader(watervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); - mWaterProgram.attachObject(loadShader(waterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); - - success = mWaterProgram.mapAttributes(); - if (success) - { - success = mWaterProgram.mapUniforms(sWaterUniforms, sWaterUniformCount); - } - if (!success) - { - llwarns << "Failed to load " << watervertex << llendl; - } - } - if (success) - { - //load ground vertex shader - std::string groundvertex = "environment/groundV.glsl"; - std::string groundfragment = "environment/groundF.glsl"; - mGroundProgram.mProgramObject = glCreateProgramObjectARB(); - mGroundProgram.attachObjects(baseObjects, baseCount); - mGroundProgram.attachObject(loadShader(groundvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); - mGroundProgram.attachObject(loadShader(groundfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); - - success = mGroundProgram.mapAttributes(); - if (success) - { - success = mGroundProgram.mapUniforms(); - } - if (!success) - { - llwarns << "Failed to load " << groundvertex << llendl; - } - } - - if (success) - { - //load terrain vertex shader - std::string terrainvertex = "environment/terrainV.glsl"; - std::string terrainfragment = "environment/terrainF.glsl"; - mTerrainProgram.mProgramObject = glCreateProgramObjectARB(); - mTerrainProgram.attachObjects(baseObjects, baseCount); - mTerrainProgram.attachObject(loadShader(terrainvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); - mTerrainProgram.attachObject(loadShader(terrainfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); - success = mTerrainProgram.mapAttributes(); - if (success) - { - success = mTerrainProgram.mapUniforms(sTerrainUniforms, sTerrainUniformCount); - } - if (!success) - { - llwarns << "Failed to load " << terrainvertex << llendl; - } - } - - if (success) - { - //load glow shader - std::string glowvertex = "environment/glowV.glsl"; - std::string glowfragment = "environment/glowF.glsl"; - mGlowProgram.mProgramObject = glCreateProgramObjectARB(); - mGlowProgram.attachObjects(baseObjects, baseCount); - mGlowProgram.attachObject(loadShader(glowvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB)); - mGlowProgram.attachObject(loadShader(glowfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB)); - success = mGlowProgram.mapAttributes(); - if (success) - { - success = mGlowProgram.mapUniforms(sGlowUniforms, sGlowUniformCount); - } - if (!success) - { - llwarns << "Failed to load " << glowvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_ENVIRONMENT] = 0; - mMaxVertexShaderLevel[SHADER_ENVIRONMENT] = 0; - return FALSE; - } - - if (gWorldPointer) - { - gWorldPointer->updateWaterObjects(); - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersObject() -{ - GLhandleARB baseObjects[] = - { - mLightFragment, - mLightVertex, - mScatterFragment, - mScatterVertex - }; - S32 baseCount = 4; - - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_OBJECT] == 0) - { - mObjectShinyProgram.unload(); - mObjectSimpleProgram.unload(); - mObjectBumpProgram.unload(); - mObjectAlphaProgram.unload(); - return FALSE; - } - -#if 0 - if (success) - { - //load object (volume/tree) vertex shader - std::string simplevertex = "objects/simpleV.glsl"; - std::string simplefragment = "objects/simpleF.glsl"; - mObjectSimpleProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectSimpleProgram.attachObjects(baseObjects, baseCount); - mObjectSimpleProgram.attachObject(loadShader(simplevertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectSimpleProgram.attachObject(loadShader(simplefragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - success = mObjectSimpleProgram.mapAttributes(); - if (success) - { - success = mObjectSimpleProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << simplevertex << llendl; - } - } - - if (success) - { - //load object bumpy vertex shader - std::string bumpshinyvertex = "objects/bumpshinyV.glsl"; - std::string bumpshinyfragment = "objects/bumpshinyF.glsl"; - mObjectBumpProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectBumpProgram.attachObjects(baseObjects, baseCount); - mObjectBumpProgram.attachObject(loadShader(bumpshinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectBumpProgram.attachObject(loadShader(bumpshinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - success = mObjectBumpProgram.mapAttributes(); - if (success) - { - success = mObjectBumpProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << bumpshinyvertex << llendl; - } - } - - if (success) - { - //load object alpha vertex shader - std::string alphavertex = "objects/alphaV.glsl"; - std::string alphafragment = "objects/alphaF.glsl"; - mObjectAlphaProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectAlphaProgram.attachObjects(baseObjects, baseCount); - mObjectAlphaProgram.attachObject(loadShader(alphavertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectAlphaProgram.attachObject(loadShader(alphafragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - - success = mObjectAlphaProgram.mapAttributes(); - if (success) - { - success = mObjectAlphaProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << alphavertex << llendl; - } - } -#endif - - if (success) - { - //load shiny vertex shader - std::string shinyvertex = "objects/shinyV.glsl"; - std::string shinyfragment = "objects/shinyF.glsl"; - mObjectShinyProgram.mProgramObject = glCreateProgramObjectARB(); - mObjectShinyProgram.attachObjects(baseObjects, baseCount); - mObjectShinyProgram.attachObject(loadShader(shinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB)); - mObjectShinyProgram.attachObject(loadShader(shinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB)); - - success = mObjectShinyProgram.mapAttributes(); - if (success) - { - success = mObjectShinyProgram.mapUniforms(LLPipeline::sShinyUniforms, LLPipeline::sShinyUniformCount); - } - if( !success ) - { - llwarns << "Failed to load " << shinyvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_OBJECT] = 0; - mMaxVertexShaderLevel[SHADER_OBJECT] = 0; - return FALSE; - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersAvatar() -{ - GLhandleARB baseObjects[] = - { - mLightFragment, - mLightVertex, - mScatterFragment, - mScatterVertex - }; - S32 baseCount = 4; - - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_AVATAR] == 0) - { - mAvatarProgram.unload(); - mAvatarEyeballProgram.unload(); - mAvatarPickProgram.unload(); - return FALSE; - } - - if (success) - { - //load specular (eyeball) vertex program - std::string eyeballvertex = "avatar/eyeballV.glsl"; - std::string eyeballfragment = "avatar/eyeballF.glsl"; - mAvatarEyeballProgram.mProgramObject = glCreateProgramObjectARB(); - mAvatarEyeballProgram.attachObjects(baseObjects, baseCount); - mAvatarEyeballProgram.attachObject(loadShader(eyeballvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); - mAvatarEyeballProgram.attachObject(loadShader(eyeballfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); - success = mAvatarEyeballProgram.mapAttributes(); - if (success) - { - success = mAvatarEyeballProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << eyeballvertex << llendl; - } - } - - if (success) - { - mAvatarSkinVertex = loadShader("avatar/avatarSkinV.glsl", SHADER_AVATAR, GL_VERTEX_SHADER_ARB); - //load avatar vertex shader - std::string avatarvertex = "avatar/avatarV.glsl"; - std::string avatarfragment = "avatar/avatarF.glsl"; - - mAvatarProgram.mProgramObject = glCreateProgramObjectARB(); - mAvatarProgram.attachObjects(baseObjects, baseCount); - mAvatarProgram.attachObject(mAvatarSkinVertex); - mAvatarProgram.attachObject(loadShader(avatarvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); - mAvatarProgram.attachObject(loadShader(avatarfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); - - success = mAvatarProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount); - if (success) - { - success = mAvatarProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount); - } - if( !success ) - { - llwarns << "Failed to load " << avatarvertex << llendl; - } - } - - if (success) - { - //load avatar picking shader - std::string pickvertex = "avatar/pickAvatarV.glsl"; - std::string pickfragment = "avatar/pickAvatarF.glsl"; - mAvatarPickProgram.mProgramObject = glCreateProgramObjectARB(); - mAvatarPickProgram.attachObject(loadShader(pickvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB)); - mAvatarPickProgram.attachObject(loadShader(pickfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB)); - mAvatarPickProgram.attachObject(mAvatarSkinVertex); - - success = mAvatarPickProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount); - if (success) - { - success = mAvatarPickProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount); - } - if( !success ) - { - llwarns << "Failed to load " << pickvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_AVATAR] = 0; - mMaxVertexShaderLevel[SHADER_AVATAR] = 0; - return FALSE; - } - - return TRUE; -} - -BOOL LLPipeline::loadShadersInterface() -{ - BOOL success = TRUE; - - if (mVertexShaderLevel[SHADER_INTERFACE] == 0) - { - mHighlightProgram.unload(); - return FALSE; - } - - if (success) - { - //load highlighting shader - std::string highlightvertex = "interface/highlightV.glsl"; - std::string highlightfragment = "interface/highlightF.glsl"; - mHighlightProgram.mProgramObject = glCreateProgramObjectARB(); - mHighlightProgram.attachObject(loadShader(highlightvertex, SHADER_INTERFACE, GL_VERTEX_SHADER_ARB)); - mHighlightProgram.attachObject(loadShader(highlightfragment, SHADER_INTERFACE, GL_FRAGMENT_SHADER_ARB)); - - success = mHighlightProgram.mapAttributes(); - if (success) - { - success = mHighlightProgram.mapUniforms(); - } - if( !success ) - { - llwarns << "Failed to load " << highlightvertex << llendl; - } - } - - if( !success ) - { - mVertexShaderLevel[SHADER_INTERFACE] = 0; - mMaxVertexShaderLevel[SHADER_INTERFACE] = 0; - return FALSE; - } - - return TRUE; -} - //============================================================================ void LLPipeline::enableShadows(const BOOL enable_shadows) @@ -1357,7 +445,7 @@ S32 LLPipeline::setLightingDetail(S32 level) if (mVertexShadersLoaded == 1) { - gPipeline.setShaders(); + LLShaderMgr::setShaders(); } } return mLightingDetail; @@ -1384,7 +472,6 @@ public: if (mTextures.find(params->mTexture) != mTextures.end()) { group->setState(LLSpatialGroup::GEOM_DIRTY); - gPipeline.markRebuild(group); } } } @@ -1828,9 +915,6 @@ void LLPipeline::updateCull(LLCamera& camera) } } - //do a terse update on some off-screen geometry - processGeometry(camera); - if (gSky.mVOSkyp.notNull() && gSky.mVOSkyp->mDrawable.notNull()) { // Hack for sky - always visible. @@ -2171,11 +1255,6 @@ void LLPipeline::markTextured(LLDrawable *drawablep) } } -void LLPipeline::markRebuild(LLSpatialGroup* group) -{ - mGroupQ.insert(group); -} - void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag, BOOL priority) { LLMemType mt(LLMemType::MTYPE_PIPELINE); @@ -2475,16 +1554,8 @@ void LLPipeline::postSort(LLCamera& camera) } - //rebuild offscreen geometry if (!sSkipUpdate) { - for (LLSpatialGroup::sg_set_t::iterator iter = mGroupQ.begin(); iter != mGroupQ.end(); ++iter) - { - LLSpatialGroup* group = *iter; - group->rebuildGeom(); - } - mGroupQ.clear(); - //rebuild drawable geometry for (LLSpatialGroup::sg_vector_t::iterator i = mDrawableGroups.begin(); i != mDrawableGroups.end(); ++i) { @@ -2721,10 +1792,10 @@ void LLPipeline::renderHighlights() LLGLEnable color_mat(GL_COLOR_MATERIAL); disableLights(); - if ((mVertexShaderLevel[SHADER_INTERFACE] > 0)) + if ((LLShaderMgr::sVertexShaderLevel[LLShaderMgr::SHADER_INTERFACE] > 0)) { - mHighlightProgram.bind(); - gPipeline.mHighlightProgram.vertexAttrib4f(LLPipeline::GLSL_MATERIAL_COLOR,1,0,0,0.5f); + gHighlightProgram.bind(); + gHighlightProgram.vertexAttrib4f(LLShaderMgr::MATERIAL_COLOR,1,0,0,0.5f); } if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED)) @@ -2763,9 +1834,9 @@ void LLPipeline::renderHighlights() // have touch-handlers. mHighlightFaces.clear(); - if (mVertexShaderLevel[SHADER_INTERFACE] > 0) + if (LLShaderMgr::sVertexShaderLevel[LLShaderMgr::SHADER_INTERFACE] > 0) { - mHighlightProgram.unbind(); + gHighlightProgram.unbind(); } } @@ -2858,7 +1929,7 @@ void LLPipeline::renderGeom(LLCamera& camera) { LLFastTimer t(LLFastTimer::FTM_POOLS); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); - calcNearbyLights(); + calcNearbyLights(camera); pool_set_t::iterator iter1 = mPools.begin(); while ( iter1 != mPools.end() ) { @@ -3001,22 +2072,6 @@ void LLPipeline::renderGeom(LLCamera& camera) } } -void LLPipeline::processGeometry(LLCamera& camera) -{ - if (sSkipUpdate) - { - return; - } - - for (U32 i = 0; i < mObjectPartition.size(); i++) - { - if (mObjectPartition[i] && hasRenderType(mObjectPartition[i]->mDrawableType)) - { - mObjectPartition[i]->processGeometry(&camera); - } - } -} - void LLPipeline::processOcclusion(LLCamera& camera) { //process occlusion (readback) @@ -3691,7 +2746,7 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_ return dist; } -void LLPipeline::calcNearbyLights() +void LLPipeline::calcNearbyLights(LLCamera& camera) { if (mLightingDetail >= 1) { @@ -3699,34 +2754,39 @@ void LLPipeline::calcNearbyLights() // begin() == the closest light and rbegin() == the farthest light const S32 MAX_LOCAL_LIGHTS = 6; // LLVector3 cam_pos = gAgent.getCameraPositionAgent(); - LLVector3 cam_pos = gAgent.getPositionAgent(); + LLVector3 cam_pos = LLPipeline::sSkipUpdate || LLViewerJoystick::sOverrideCamera ? + camera.getOrigin() : + gAgent.getPositionAgent(); F32 max_dist = LIGHT_MAX_RADIUS * 4.f; // ignore enitrely lights > 4 * max light rad // UPDATE THE EXISTING NEARBY LIGHTS - light_set_t cur_nearby_lights; - for (light_set_t::iterator iter = mNearbyLights.begin(); - iter != mNearbyLights.end(); iter++) + if (!LLPipeline::sSkipUpdate) { - const Light* light = &(*iter); - LLDrawable* drawable = light->drawable; - LLVOVolume* volight = drawable->getVOVolume(); - if (!volight || !drawable->isState(LLDrawable::LIGHT)) - { - drawable->clearState(LLDrawable::NEARBY_LIGHT); - continue; - } - if (light->fade <= -LIGHT_FADE_TIME) - { - drawable->clearState(LLDrawable::NEARBY_LIGHT); - } - else + light_set_t cur_nearby_lights; + for (light_set_t::iterator iter = mNearbyLights.begin(); + iter != mNearbyLights.end(); iter++) { - F32 dist = calc_light_dist(volight, cam_pos, max_dist); - cur_nearby_lights.insert(Light(drawable, dist, light->fade)); + const Light* light = &(*iter); + LLDrawable* drawable = light->drawable; + LLVOVolume* volight = drawable->getVOVolume(); + if (!volight || !drawable->isState(LLDrawable::LIGHT)) + { + drawable->clearState(LLDrawable::NEARBY_LIGHT); + continue; + } + if (light->fade <= -LIGHT_FADE_TIME) + { + drawable->clearState(LLDrawable::NEARBY_LIGHT); + } + else + { + F32 dist = calc_light_dist(volight, cam_pos, max_dist); + cur_nearby_lights.insert(Light(drawable, dist, light->fade)); + } } + mNearbyLights = cur_nearby_lights; } - mNearbyLights = cur_nearby_lights; // FIND NEW LIGHTS THAT ARE IN RANGE light_set_t new_nearby_lights; @@ -3861,7 +2921,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) LLColor4 light_color = light->getLightColor(); light_color.mV[3] = 0.0f; - F32 fade = iter->fade; + F32 fade = LLPipeline::sSkipUpdate ? 1.f : iter->fade; if (fade < LIGHT_FADE_TIME) { // fade in/out light @@ -4407,255 +3467,6 @@ BOOL LLPipeline::getRenderSoundBeacons(void*) return sRenderSoundBeacons; } -//=============================== -// LLGLSL Shader implementation -//=============================== -LLGLSLShader::LLGLSLShader() -: mProgramObject(0) -{ } - -void LLGLSLShader::unload() -{ - stop_glerror(); - mAttribute.clear(); - mTexture.clear(); - mUniform.clear(); - - if (mProgramObject) - { - GLhandleARB obj[1024]; - GLsizei count; - - glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj); - for (GLsizei i = 0; i < count; i++) - { - glDeleteObjectARB(obj[i]); - } - - glDeleteObjectARB(mProgramObject); - - mProgramObject = 0; - } - - //hack to make apple not complain - glGetError(); - - stop_glerror(); -} - -void LLGLSLShader::attachObject(GLhandleARB object) -{ - if (object != 0) - { - stop_glerror(); - glAttachObjectARB(mProgramObject, object); - stop_glerror(); - } - else - { - llwarns << "Attempting to attach non existing shader object. " << llendl; - } -} - -void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count) -{ - for (S32 i = 0; i < count; i++) - { - attachObject(objects[i]); - } -} - -BOOL LLGLSLShader::mapAttributes(const char** attrib_names, S32 count) -{ - //link the program - BOOL res = link(); - - mAttribute.clear(); - mAttribute.resize(LLPipeline::sReservedAttribCount + count, -1); - - if (res) - { //read back channel locations - - //read back reserved channels first - for (S32 i = 0; i < (S32) LLPipeline::sReservedAttribCount; i++) - { - const char* name = LLPipeline::sReservedAttribs[i]; - S32 index = glGetAttribLocationARB(mProgramObject, name); - if (index != -1) - { - mAttribute[i] = index; - llinfos << "Attribute " << name << " assigned to channel " << index << llendl; - } - } - - for (S32 i = 0; i < count; i++) - { - const char* name = attrib_names[i]; - S32 index = glGetAttribLocationARB(mProgramObject, name); - if (index != -1) - { - mAttribute[LLPipeline::sReservedAttribCount + i] = index; - llinfos << "Attribute " << name << " assigned to channel " << index << llendl; - } - } - - return TRUE; - } - - return FALSE; -} - -void LLGLSLShader::mapUniform(GLint index, const char** uniform_names, S32 count) -{ - if (index == -1) - { - return; - } - - GLenum type; - GLsizei length; - GLint size; - char name[1024]; /* Flawfinder: ignore */ - name[0] = 0; - - glGetActiveUniformARB(mProgramObject, index, 1024, &length, &size, &type, name); - - //find the index of this uniform - for (S32 i = 0; i < (S32) LLPipeline::sReservedUniformCount; i++) - { - if (mUniform[i] == -1 && !strncmp(LLPipeline::sReservedUniforms[i],name, strlen(LLPipeline::sReservedUniforms[i]))) /* Flawfinder: ignore */ - { - //found it - S32 location = glGetUniformLocationARB(mProgramObject, name); - mUniform[i] = location; - llinfos << "Uniform " << name << " is at location " << location << llendl; - mTexture[i] = mapUniformTextureChannel(location, type); - return; - } - } - - for (S32 i = 0; i < count; i++) - { - if (mUniform[i+LLPipeline::sReservedUniformCount] == -1 && - !strncmp(uniform_names[i],name, strlen(uniform_names[i]))) /* Flawfinder: ignore */ - { - //found it - S32 location = glGetUniformLocationARB(mProgramObject, name); - mUniform[i+LLPipeline::sReservedUniformCount] = location; - llinfos << "Uniform " << name << " is at location " << location << " stored in index " << - (i+LLPipeline::sReservedUniformCount) << llendl; - mTexture[i+LLPipeline::sReservedUniformCount] = mapUniformTextureChannel(location, type); - return; - } - } - - //llinfos << "Unknown uniform: " << name << llendl; - } - -GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) -{ - if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB) - { //this here is a texture - glUniform1iARB(location, mActiveTextureChannels); - llinfos << "Assigned to texture channel " << mActiveTextureChannels << llendl; - return mActiveTextureChannels++; - } - return -1; -} - -BOOL LLGLSLShader::mapUniforms(const char** uniform_names, S32 count) -{ - BOOL res = TRUE; - - mActiveTextureChannels = 0; - mUniform.clear(); - mTexture.clear(); - - //initialize arrays - mUniform.resize(count + LLPipeline::sReservedUniformCount, -1); - mTexture.resize(count + LLPipeline::sReservedUniformCount, -1); - - bind(); - - //get the number of active uniforms - GLint activeCount; - glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount); - - for (S32 i = 0; i < activeCount; i++) - { - mapUniform(i, uniform_names, count); - } - - unbind(); - - return res; -} - -BOOL LLGLSLShader::link(BOOL suppress_errors) -{ - return gPipeline.linkProgramObject(mProgramObject, suppress_errors); -} - -void LLGLSLShader::bind() -{ - glUseProgramObjectARB(mProgramObject); - if (mAttribute.size() > 0) - { - gPipeline.mMaterialIndex = mAttribute[0]; - } -} - -void LLGLSLShader::unbind() -{ - for (U32 i = 0; i < mAttribute.size(); ++i) - { - vertexAttrib4f(i, 0,0,0,1); - } - glUseProgramObjectARB(0); -} - -S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode) -{ - if (uniform < 0 || uniform >= (S32)mTexture.size()) - { - llerrs << "LLGLSLShader::enableTexture: uniform out of range: " << uniform << llendl; - } - S32 index = mTexture[uniform]; - if (index != -1) - { - glActiveTextureARB(GL_TEXTURE0_ARB+index); - glEnable(mode); - } - return index; -} - -S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode) -{ - S32 index = mTexture[uniform]; - if (index != -1) - { - glActiveTextureARB(GL_TEXTURE0_ARB+index); - glDisable(mode); - } - return index; -} - -void LLGLSLShader::vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - if (mAttribute[index] > 0) - { - glVertexAttrib4fARB(mAttribute[index], x, y, z, w); - } -} - -void LLGLSLShader::vertexAttrib4fv(U32 index, GLfloat* v) -{ - if (mAttribute[index] > 0) - { - glVertexAttrib4fvARB(mAttribute[index], v); - } -} - LLViewerObject* LLPipeline::pickObject(const LLVector3 &start, const LLVector3 &end, LLVector3 &collision) { LLDrawable* drawable = mObjectPartition[PARTITION_VOLUME]->pickDrawable(start, end, collision); @@ -4847,7 +3658,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, LLVector3 origin = cube_cam.getOrigin(); - gPipeline.calcNearbyLights(); + gPipeline.calcNearbyLights(cube_cam); cube_map->bind(); for (S32 i = 0; i < 6; i++) @@ -4909,7 +3720,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, cube_cam.setOrigin(origin); gPipeline.resetDrawOrders(); - gPipeline.mShinyOrigin.setVec(cube_cam.getOrigin(), cube_cam.getFar()*2.f); + gShinyOrigin.setVec(cube_cam.getOrigin(), cube_cam.getFar()*2.f); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); @@ -5112,12 +3923,7 @@ void LLPipeline::bindScreenToTexture() void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, LLVector2 tc1, LLVector2 tc2) { - mGlowProgram.bind(); - - if (!gGLManager.mHasFramebufferObject) - { - llerrs << "WTF?" << llendl; - } + gGlowProgram.bind(); LLGLEnable tex(GL_TEXTURE_2D); LLGLDepthTest depth(GL_FALSE); @@ -5160,7 +3966,7 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, i%2==0 ? dest : buffer); - glUniform1fARB(mGlowProgram.mUniform[LLPipeline::GLSL_GLOW_DELTA],delta); + glUniform1fARB(gGlowProgram.mUniform[LLShaderMgr::GLOW_DELTA],delta); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(tc1.mV[0], tc1.mV[1]); @@ -5182,7 +3988,7 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, } glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); - mGlowProgram.unbind(); + gGlowProgram.unbind(); glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); @@ -5220,107 +4026,3 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, glPopMatrix(); } -void LLPipeline::updateCamera() -{ - LLWindow* window = gViewerWindow->getWindow(); - - F32 time = gFrameIntervalSeconds; - - S32 axis[] = - { - gSavedSettings.getS32("JoystickAxis0"), - gSavedSettings.getS32("JoystickAxis1"), - gSavedSettings.getS32("JoystickAxis2"), - gSavedSettings.getS32("JoystickAxis3"), - gSavedSettings.getS32("JoystickAxis4"), - gSavedSettings.getS32("JoystickAxis5") - }; - - F32 axis_scale[] = - { - gSavedSettings.getF32("JoystickAxisScale0"), - gSavedSettings.getF32("JoystickAxisScale1"), - gSavedSettings.getF32("JoystickAxisScale2"), - gSavedSettings.getF32("JoystickAxisScale3"), - gSavedSettings.getF32("JoystickAxisScale4"), - gSavedSettings.getF32("JoystickAxisScale5") - }; - - F32 dead_zone[] = - { - gSavedSettings.getF32("JoystickAxisDeadZone0"), - gSavedSettings.getF32("JoystickAxisDeadZone1"), - gSavedSettings.getF32("JoystickAxisDeadZone2"), - gSavedSettings.getF32("JoystickAxisDeadZone3"), - gSavedSettings.getF32("JoystickAxisDeadZone4"), - gSavedSettings.getF32("JoystickAxisDeadZone5") - }; - - F32 cur_delta[6]; - static F32 last_delta[] = {0,0,0,0,0,0}; - static F32 delta[] = { 0,0,0,0,0,0 }; - - F32 feather = gSavedSettings.getF32("FlycamFeathering"); - BOOL absolute = gSavedSettings.getBOOL("FlycamAbsolute"); - - for (U32 i = 0; i < 6; i++) - { - cur_delta[i] = window->getJoystickAxis(axis[i]); - F32 tmp = cur_delta[i]; - if (absolute) - { - cur_delta[i] = cur_delta[i] - last_delta[i]; - } - last_delta[i] = tmp; - - if (cur_delta[i] > 0) - { - cur_delta[i] = llmax(cur_delta[i]-dead_zone[i], 0.f); - } - else - { - cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f); - } - cur_delta[i] *= axis_scale[i]; - - if (!absolute) - { - cur_delta[i] *= time; - } - - delta[i] = delta[i] + (cur_delta[i]-delta[i])*time*feather; - } - - mFlyCamPosition += LLVector3(delta) * mFlyCamRotation; - - LLMatrix3 rot_mat(delta[3], - delta[4], - delta[5]); - - mFlyCamRotation = LLQuaternion(rot_mat)*mFlyCamRotation; - - if (gSavedSettings.getBOOL("FlycamAutoLeveling")) - { - LLMatrix3 level(mFlyCamRotation); - - LLVector3 x = LLVector3(level.mMatrix[0]); - LLVector3 y = LLVector3(level.mMatrix[1]); - LLVector3 z = LLVector3(level.mMatrix[2]); - - y.mV[2] = 0.f; - y.normVec(); - - level.setRows(x,y,z); - level.orthogonalize(); - - LLQuaternion quat = LLQuaternion(level); - mFlyCamRotation = nlerp(llmin(feather*time,1.f), mFlyCamRotation, quat); - } - - LLMatrix3 mat(mFlyCamRotation); - - gCamera->setOrigin(mFlyCamPosition); - gCamera->mXAxis = LLVector3(mat.mMatrix[0]); - gCamera->mYAxis = LLVector3(mat.mMatrix[1]); - gCamera->mZAxis = LLVector3(mat.mMatrix[2]); -} diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 4d89b65c90..5baf01de51 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -43,41 +43,6 @@ bool LLRayAABB(const LLVector3 ¢er, const LLVector3 &size, const LLVector3& BOOL LLLineSegmentAABB(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size); BOOL setup_hud_matrices(BOOL for_select); -class LLGLSLShader -{ -public: - LLGLSLShader(); - - void unload(); - void attachObject(GLhandleARB object); - void attachObjects(GLhandleARB* objects = NULL, S32 count = 0); - BOOL mapAttributes(const char** attrib_names = NULL, S32 count = 0); - BOOL mapUniforms(const char** uniform_names = NULL, S32 count = 0); - void mapUniform(GLint index, const char** uniform_names = NULL, S32 count = 0); - void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - void vertexAttrib4fv(U32 index, GLfloat* v); - - GLint mapUniformTextureChannel(GLint location, GLenum type); - - - //enable/disable texture channel for specified uniform - //if given texture uniform is active in the shader, - //the corresponding channel will be active upon return - //returns channel texture is enabled in from [0-MAX) - S32 enableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); - S32 disableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); - - BOOL link(BOOL suppress_errors = FALSE); - void bind(); - void unbind(); - - GLhandleARB mProgramObject; - std::vector<GLint> mAttribute; - std::vector<GLint> mUniform; - std::vector<GLint> mTexture; - S32 mActiveTextureChannels; -}; - class LLPipeline { public: @@ -125,7 +90,6 @@ public: void markShift(LLDrawable *drawablep); void markTextured(LLDrawable *drawablep); void markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE); - void markRebuild(LLSpatialGroup* groupp); void markRelight(LLDrawable *drawablep, const BOOL now = FALSE); //get the object between start and end that's closest to start. Return the point of collision in collision. @@ -149,17 +113,7 @@ public: void setUseVertexShaders(BOOL use_shaders); BOOL getUseVertexShaders() const { return mVertexShadersEnabled; } BOOL canUseVertexShaders(); - BOOL setVertexShaderLevel(S32 type, S32 level); - S32 getVertexShaderLevel(S32 type) const { return mVertexShaderLevel[type]; } - S32 getMaxVertexShaderLevel(S32 type) const { return mMaxVertexShaderLevel[type]; } - - void setShaders(); - void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE); - BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE); - BOOL validateProgramObject(GLhandleARB obj); - GLhandleARB loadShader(const LLString& filename, S32 cls, GLenum type); - // phases void resetFrameStats(); @@ -187,7 +141,6 @@ public: void renderGeom(LLCamera& camera); void renderHighlights(); void renderDebug(); - void processGeometry(LLCamera& camera); void processOcclusion(LLCamera& camera); void renderForSelect(std::set<LLViewerObject*>& objects); @@ -200,7 +153,7 @@ public: S32 getVisibleCount() const { return mVisibleList.size(); } S32 getLightCount() const { return mLights.size(); } - void calcNearbyLights(); + void calcNearbyLights(LLCamera& camera); void setupHWLights(LLDrawPool* pool); void setupAvatarLights(BOOL for_edit = FALSE); void enableLights(U32 mask, F32 shadow_factor); @@ -250,11 +203,6 @@ private: void initShaders(BOOL force); void unloadShaders(); BOOL loadShaders(); - BOOL loadShadersLighting(); - BOOL loadShadersObject(); - BOOL loadShadersAvatar(); - BOOL loadShadersEnvironment(); - BOOL loadShadersInterface(); void saveVertexShaderLevel(S32 type, S32 level, S32 max); void addToQuickLookup( LLDrawPool* new_poolp ); void removeFromQuickLookup( LLDrawPool* poolp ); @@ -262,15 +210,7 @@ private: public: enum {GPU_CLASS_MAX = 3 }; - enum EShaderClass - { - SHADER_LIGHTING, - SHADER_OBJECT, - SHADER_AVATAR, - SHADER_ENVIRONMENT, - SHADER_INTERFACE, - SHADER_COUNT - }; + enum LLRenderTypeMask { // Following are pool types (some are also object types) @@ -361,7 +301,7 @@ public: LLSpatialPartition* getSpatialPartition(LLViewerObject* vobj); LLSpatialPartition* getSpatialPartition(U32 index); - void updateCamera(); + void updateCamera(BOOL reset = FALSE); LLVector3 mFlyCamPosition; LLQuaternion mFlyCamRotation; @@ -390,7 +330,6 @@ public: static BOOL sSkipUpdate; //skip lod updates static BOOL sDynamicReflections; static BOOL sRenderGlow; - static BOOL sOverrideAgentCamera; //screen texture GLuint mScreenTex; @@ -412,140 +351,7 @@ public: //depth buffer object for rendering dynamic cube maps GLuint mCubeDepth; - class LLScatterShader - { - public: - static void init(GLhandleARB shader, int map_stage); - }; - - //utility shader objects (not shader programs) - GLhandleARB mLightVertex; - GLhandleARB mLightFragment; - GLhandleARB mScatterVertex; - GLhandleARB mScatterFragment; - - //global (reserved slot) shader parameters - static const char* sReservedAttribs[]; - static U32 sReservedAttribCount; - - typedef enum - { - GLSL_MATERIAL_COLOR = 0, - GLSL_SPECULAR_COLOR, - GLSL_BINORMAL, - GLSL_END_RESERVED_ATTRIBS - } eGLSLReservedAttribs; - - static const char* sReservedUniforms[]; - static U32 sReservedUniformCount; - - typedef enum - { - GLSL_DIFFUSE_MAP = 0, - GLSL_SPECULAR_MAP, - GLSL_BUMP_MAP, - GLSL_ENVIRONMENT_MAP, - GLSL_END_RESERVED_UNIFORMS - } eGLSLReservedUniforms; - - static const char* sShinyUniforms[]; - static U32 sShinyUniformCount; - - typedef enum - { - GLSL_SHINY_ORIGIN = GLSL_END_RESERVED_UNIFORMS - } eShinyUniforms; - - LLVector4 mShinyOrigin; - - //object shaders - LLGLSLShader mObjectSimpleProgram; - LLGLSLShader mObjectAlphaProgram; - LLGLSLShader mObjectBumpProgram; - LLGLSLShader mObjectShinyProgram; - - //water parameters - static const char* sWaterUniforms[]; - static U32 sWaterUniformCount; - - typedef enum - { - GLSL_WATER_SCREENTEX = GLSL_END_RESERVED_UNIFORMS, - GLSL_WATER_EYEVEC, - GLSL_WATER_TIME, - GLSL_WATER_WAVE_DIR1, - GLSL_WATER_WAVE_DIR2, - GLSL_WATER_LIGHT_DIR, - GLSL_WATER_SPECULAR, - GLSL_WATER_SPECULAR_EXP, - GLSL_WATER_FBSCALE, - GLSL_WATER_REFSCALE - } eWaterUniforms; - - - //terrain parameters - static const char* sTerrainUniforms[]; - static U32 sTerrainUniformCount; - - typedef enum - { - GLSL_TERRAIN_DETAIL0 = GLSL_END_RESERVED_UNIFORMS, - GLSL_TERRAIN_DETAIL1, - GLSL_TERRAIN_ALPHARAMP - } eTerrainUniforms; - - //glow parameters - static const char* sGlowUniforms[]; - static U32 sGlowUniformCount; - - typedef enum - { - GLSL_GLOW_DELTA = GLSL_END_RESERVED_UNIFORMS - } eGlowUniforms; - - //environment shaders - LLGLSLShader mTerrainProgram; - LLGLSLShader mGlowProgram; - LLGLSLShader mGroundProgram; - LLGLSLShader mWaterProgram; - - //interface shaders - LLGLSLShader mHighlightProgram; - //avatar shader parameter tables - static const char* sAvatarAttribs[]; - static U32 sAvatarAttribCount; - - typedef enum - { - GLSL_AVATAR_WEIGHT = GLSL_END_RESERVED_ATTRIBS, - GLSL_AVATAR_CLOTHING, - GLSL_AVATAR_WIND, - GLSL_AVATAR_SINWAVE, - GLSL_AVATAR_GRAVITY - } eAvatarAttribs; - - static const char* sAvatarUniforms[]; - static U32 sAvatarUniformCount; - - typedef enum - { - GLSL_AVATAR_MATRIX = GLSL_END_RESERVED_UNIFORMS - } eAvatarUniforms; - - //avatar skinning utility shader object - GLhandleARB mAvatarSkinVertex; - - //avatar shader handles - LLGLSLShader mAvatarProgram; - LLGLSLShader mAvatarEyeballProgram; - LLGLSLShader mAvatarPickProgram; - - //current avatar shader parameter pointer - GLint mAvatarMatrixParam; - GLint mMaterialIndex; - GLint mSpecularIndex; - LLColor4 mSunDiffuse; LLVector3 mSunDir; @@ -557,13 +363,11 @@ public: LLSpatialGroup::sg_vector_t mDrawableGroups; void clearRenderMap(); - -protected: + BOOL mVertexShadersEnabled; S32 mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed - S32 mVertexShaderLevel[SHADER_COUNT]; - S32 mMaxVertexShaderLevel[SHADER_COUNT]; - + +protected: U32 mRenderTypeMask; U32 mRenderFeatureMask; U32 mRenderDebugFeatureMask; @@ -619,7 +423,6 @@ protected: // LLDrawable::drawable_list_t mBuildQ1; // priority LLDrawable::drawable_list_t mBuildQ2; // non-priority - LLSpatialGroup::sg_set_t mGroupQ; //spatial groups LLDrawable::drawable_set_t mActiveQ; diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 2c04a34da8..e9dfa0a382 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -272,9 +272,6 @@ class DarwinManifest(ViewerManifest): if self.prefix(src="", dst="Resources"): super(DarwinManifest, self).construct() - # the trial directory seems to be not used [rdw] - self.path('trial') - if self.prefix("cursors_mac"): self.path("*.tif") self.end_prefix("cursors_mac") |