summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcharacter/llcharacter.h2
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp126
-rw-r--r--indra/llcharacter/llkeyframemotion.h15
-rw-r--r--indra/llcharacter/llmotioncontroller.cpp118
-rw-r--r--indra/llcharacter/llmotioncontroller.h18
-rw-r--r--indra/llcharacter/llpose.cpp44
-rw-r--r--indra/llcharacter/llpose.h6
-rw-r--r--indra/llcommon/llframetimer.cpp44
-rw-r--r--indra/llcommon/llframetimer.h15
-rw-r--r--indra/llcommon/llmemory.cpp5
-rw-r--r--indra/llcommon/llmemory.h81
-rw-r--r--indra/llimage/llimagejpeg.h1
-rw-r--r--indra/llimagej2coj/llimagej2coj.cpp17
-rw-r--r--indra/llrender/llfontgl.cpp2
-rw-r--r--indra/llui/llbutton.cpp37
-rw-r--r--indra/llui/llbutton.h7
-rw-r--r--indra/llui/llcombobox.cpp280
-rw-r--r--indra/llui/llcombobox.h29
-rw-r--r--indra/llui/lldraghandle.cpp8
-rw-r--r--indra/llui/llfloater.cpp35
-rw-r--r--indra/llui/llfocusmgr.cpp69
-rw-r--r--indra/llui/llfocusmgr.h16
-rw-r--r--indra/llui/lllineeditor.cpp34
-rw-r--r--indra/llui/lllineeditor.h7
-rw-r--r--indra/llui/llmenugl.cpp30
-rw-r--r--indra/llui/llmenugl.h1
-rw-r--r--indra/llui/llmodaldialog.cpp20
-rw-r--r--indra/llui/llresizebar.cpp129
-rw-r--r--indra/llui/llresizebar.h4
-rw-r--r--indra/llui/llresizehandle.cpp117
-rw-r--r--indra/llui/llresizehandle.h4
-rw-r--r--indra/llui/llscrollbar.cpp10
-rw-r--r--indra/llui/llscrollcontainer.cpp2
-rw-r--r--indra/llui/llscrolllistctrl.cpp908
-rw-r--r--indra/llui/llscrolllistctrl.h133
-rw-r--r--indra/llui/llslider.cpp12
-rw-r--r--indra/llui/llsliderctrl.cpp2
-rw-r--r--indra/llui/llspinctrl.cpp4
-rw-r--r--indra/llui/lltabcontainer.cpp8
-rw-r--r--indra/llui/lltextbox.cpp6
-rw-r--r--indra/llui/lltexteditor.cpp16
-rw-r--r--indra/llui/lltexteditor.h3
-rw-r--r--indra/llui/llui.cpp4
-rw-r--r--indra/llui/lluictrl.cpp13
-rw-r--r--indra/llui/lluictrl.h2
-rw-r--r--indra/llui/lluictrlfactory.cpp4
-rw-r--r--indra/llui/llview.cpp38
-rw-r--r--indra/llui/llview.h10
-rw-r--r--indra/llwindow/llmousehandler.h6
-rw-r--r--indra/llwindow/llwindow.cpp14
-rw-r--r--indra/llwindow/llwindow.h5
-rw-r--r--indra/llwindow/llwindowwin32.cpp86
-rw-r--r--indra/llwindow/llwindowwin32.h3
-rw-r--r--indra/newview/English.lproj/language.txt1
-rw-r--r--indra/newview/German.lproj/language.txt1
-rw-r--r--indra/newview/Japanese.lproj/language.txt1
-rw-r--r--indra/newview/Korean.lproj/language.txt1
-rw-r--r--indra/newview/installers/windows/lang_de.nsi57
-rw-r--r--indra/newview/installers/windows/lang_en-us.nsi57
-rw-r--r--indra/newview/installers/windows/lang_ja.nsi57
-rw-r--r--indra/newview/installers/windows/lang_ko.nsi57
-rw-r--r--indra/newview/llagent.cpp42
-rw-r--r--indra/newview/llagent.h5
-rw-r--r--indra/newview/llassetuploadresponders.cpp2
-rw-r--r--indra/newview/llchatbar.cpp2
-rw-r--r--indra/newview/llchatbar.h2
-rw-r--r--indra/newview/llcolorswatch.cpp6
-rw-r--r--indra/newview/lldrawable.cpp3
-rw-r--r--indra/newview/lldrawpoolalpha.cpp3
-rw-r--r--indra/newview/lldrawpoolavatar.cpp59
-rw-r--r--indra/newview/lldrawpoolbump.cpp18
-rw-r--r--indra/newview/lldrawpoolground.cpp3
-rw-r--r--indra/newview/lldrawpoolsimple.cpp3
-rw-r--r--indra/newview/lldrawpoolsky.cpp3
-rw-r--r--indra/newview/lldrawpoolterrain.cpp21
-rw-r--r--indra/newview/lldrawpooltree.cpp3
-rw-r--r--indra/newview/lldrawpoolwater.cpp60
-rw-r--r--indra/newview/llface.cpp8
-rw-r--r--indra/newview/llfloateranimpreview.cpp8
-rw-r--r--indra/newview/llfloateranimpreview.h2
-rw-r--r--indra/newview/llfloateravatarpicker.cpp22
-rw-r--r--indra/newview/llfloaterbump.cpp15
-rw-r--r--indra/newview/llfloaterbuyland.cpp6
-rw-r--r--indra/newview/llfloatercolorpicker.cpp15
-rw-r--r--indra/newview/llfloatercolorpicker.h2
-rw-r--r--indra/newview/llfloatergodtools.cpp14
-rw-r--r--indra/newview/llfloaterimagepreview.cpp6
-rw-r--r--indra/newview/llfloaterland.cpp6
-rw-r--r--indra/newview/llfloaterland.h2
-rw-r--r--indra/newview/llfloatersnapshot.cpp2
-rw-r--r--indra/newview/llfloatertools.cpp2
-rw-r--r--indra/newview/llfolderview.cpp63
-rw-r--r--indra/newview/llfolderview.h3
-rw-r--r--indra/newview/llimpanel.cpp2
-rw-r--r--indra/newview/llimpanel.h2
-rw-r--r--indra/newview/lljoystickbutton.cpp8
-rw-r--r--indra/newview/llnameeditor.cpp2
-rw-r--r--indra/newview/llnameeditor.h2
-rw-r--r--indra/newview/llnamelistctrl.cpp28
-rw-r--r--indra/newview/llnetmap.cpp14
-rw-r--r--indra/newview/llpanelavatar.cpp86
-rw-r--r--indra/newview/llpanelavatar.h3
-rw-r--r--indra/newview/llpanelclassified.cpp18
-rw-r--r--indra/newview/llpanelclassified.h3
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp8
-rw-r--r--indra/newview/llpanelgroupinvite.cpp10
-rw-r--r--indra/newview/llpanelpick.cpp12
-rw-r--r--indra/newview/llpanelpick.h3
-rw-r--r--indra/newview/llpanelplace.cpp11
-rw-r--r--indra/newview/llpanelplace.h3
-rw-r--r--indra/newview/llpreview.cpp8
-rw-r--r--indra/newview/llpreviewgesture.cpp21
-rw-r--r--indra/newview/llpreviewscript.cpp61
-rw-r--r--indra/newview/llprogressview.cpp6
-rw-r--r--indra/newview/llprogressview.h4
-rw-r--r--indra/newview/llselectmgr.cpp4
-rw-r--r--indra/newview/llspatialpartition.cpp75
-rw-r--r--indra/newview/llspatialpartition.h10
-rw-r--r--indra/newview/llstartup.cpp25
-rw-r--r--indra/newview/lltexturectrl.cpp2
-rw-r--r--indra/newview/lltexturefetch.cpp111
-rw-r--r--indra/newview/lltextureview.cpp37
-rw-r--r--indra/newview/lltool.cpp22
-rw-r--r--indra/newview/lltool.h1
-rw-r--r--indra/newview/lltoolcomp.cpp5
-rw-r--r--indra/newview/lltooldraganddrop.cpp4
-rw-r--r--indra/newview/lltoolpie.cpp22
-rw-r--r--indra/newview/lltoolpie.h1
-rw-r--r--indra/newview/lluploaddialog.cpp2
-rw-r--r--indra/newview/llviewerjointmesh.cpp13
-rw-r--r--indra/newview/llviewerjoystick.cpp252
-rw-r--r--indra/newview/llviewerjoystick.h20
-rw-r--r--indra/newview/llviewermenu.cpp17
-rw-r--r--indra/newview/llviewermessage.cpp11
-rw-r--r--indra/newview/llviewerparcelmgr.cpp4
-rw-r--r--indra/newview/llviewerpartsim.cpp2
-rw-r--r--indra/newview/llviewerregion.cpp33
-rw-r--r--indra/newview/llviewerregion.h14
-rw-r--r--indra/newview/llviewertexteditor.cpp10
-rw-r--r--indra/newview/llviewertextureanim.cpp25
-rw-r--r--indra/newview/llviewertextureanim.h7
-rw-r--r--indra/newview/llviewerwindow.cpp370
-rw-r--r--indra/newview/llviewerwindow.h25
-rw-r--r--indra/newview/llvoavatar.cpp49
-rw-r--r--indra/newview/llvoavatar.h2
-rw-r--r--indra/newview/llvosky.cpp13
-rw-r--r--indra/newview/llvovolume.cpp47
-rw-r--r--indra/newview/llworld.cpp306
-rw-r--r--indra/newview/llworld.h15
-rw-r--r--indra/newview/llworldmapview.cpp8
-rw-r--r--indra/newview/pipeline.cpp1386
-rw-r--r--indra/newview/pipeline.h209
-rwxr-xr-xindra/newview/viewer_manifest.py3
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 &region)
-{
- 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 &region)
+{
+ 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 &region);
+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 &region_handle, const LLHost &host)
regionp->mCloudLayer.setWidth((F32)mWidth);
regionp->mCloudLayer.setWindPointer(&regionp->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(), &region_x, &region_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(), &region_x, &region_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(), &region_x, &region_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 &center, 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")