summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Bennetts <steve@lindenlab.com>2008-08-12 17:29:50 +0000
committerSteven Bennetts <steve@lindenlab.com>2008-08-12 17:29:50 +0000
commit80be4c1d2d73982ea2df6dd7ef3fc3465416c882 (patch)
tree9c5958572368be494b6302db8b03967a2c67b7ad
parenta09f7d41efdb945755efaeb07f7418c1f6e2a78b (diff)
QAR-767 Combined maint-render-7 and maint-viewer-9 merge
merge release@93398 viewer-merge-1@94007 -> release dataserver-is-deprecated
-rw-r--r--doc/contributions.txt5
-rw-r--r--indra/cmake/00-Common.cmake5
-rw-r--r--indra/cmake/ELFIO.cmake1
-rw-r--r--indra/copy_win_scripts/CMakeLists.txt4
-rw-r--r--indra/linux_crash_logger/CMakeLists.txt17
-rw-r--r--indra/llaudio/llaudiodecodemgr.cpp10
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp14
-rw-r--r--indra/llcharacter/llkeyframemotion.h5
-rw-r--r--indra/llcommon/llmemory.cpp1
-rw-r--r--indra/llcommon/llmemtype.h1
-rw-r--r--indra/llcommon/llstring.h64
-rw-r--r--indra/llcommon/lltimer.cpp2
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llimage/llimagejpeg.cpp33
-rw-r--r--indra/llimage/llimagejpeg.h4
-rw-r--r--indra/llmath/llvolume.cpp31
-rw-r--r--indra/llmessage/llcurl.cpp6
-rw-r--r--indra/llmessage/llcurl.h5
-rw-r--r--indra/llmessage/llmessageconfig.cpp17
-rw-r--r--indra/llrender/llgl.cpp16
-rw-r--r--indra/llrender/llgl.h1
-rw-r--r--indra/llrender/llrender.cpp6
-rw-r--r--indra/llrender/llrender.h1
-rw-r--r--indra/llrender/llvertexbuffer.cpp3
-rw-r--r--indra/llui/llbutton.cpp28
-rw-r--r--indra/llui/llbutton.h1
-rw-r--r--indra/llui/llcombobox.cpp6
-rw-r--r--indra/llui/llfloater.cpp51
-rw-r--r--indra/llui/llfloater.h7
-rw-r--r--indra/llui/llmenugl.cpp7
-rw-r--r--indra/llui/lltabcontainer.cpp48
-rw-r--r--indra/llui/lltexteditor.cpp4
-rw-r--r--indra/llui/llview.cpp2
-rw-r--r--indra/llui/llview.h4
-rw-r--r--indra/llvfs/lldir.cpp37
-rw-r--r--indra/llvfs/lldir.h5
-rw-r--r--indra/llvfs/lldir_mac.cpp11
-rw-r--r--indra/llwindow/llmousehandler.h7
-rw-r--r--indra/llwindow/llwindow.cpp6
-rw-r--r--indra/llwindow/llwindow.h5
-rw-r--r--indra/llwindow/llwindowmacosx.cpp28
-rw-r--r--indra/llwindow/llwindowmacosx.h3
-rw-r--r--indra/llwindow/llwindowsdl.cpp6
-rw-r--r--indra/mac_crash_logger/CMakeLists.txt33
-rw-r--r--indra/mac_crash_logger/CrashReporter.nib/classes.nib8
-rw-r--r--indra/mac_crash_logger/CrashReporter.nib/info.nib20
-rw-r--r--indra/mac_crash_logger/CrashReporter.nib/objects.xib69
-rw-r--r--indra/mac_crash_logger/Info.plist26
-rw-r--r--indra/mac_updater/CMakeLists.txt35
-rw-r--r--indra/mac_updater/Info.plist26
-rw-r--r--indra/mac_updater/mac_updater.cpp12
-rw-r--r--indra/newview/CMakeLists.txt33
-rw-r--r--indra/newview/app_settings/settings.xml48
-rw-r--r--indra/newview/featuretable.txt42
-rw-r--r--indra/newview/featuretable_linux.txt145
-rw-r--r--indra/newview/llagent.cpp105
-rw-r--r--indra/newview/llagent.h4
-rw-r--r--indra/newview/llappviewer.cpp81
-rw-r--r--indra/newview/llappviewer.h4
-rw-r--r--indra/newview/llappviewerlinux.cpp6
-rw-r--r--indra/newview/llappviewermacosx.cpp2
-rw-r--r--indra/newview/llappviewerwin32.cpp5
-rw-r--r--indra/newview/llcolorswatch.cpp4
-rw-r--r--indra/newview/lldrawable.cpp88
-rw-r--r--indra/newview/lldrawable.h2
-rw-r--r--indra/newview/lldrawpoolavatar.cpp10
-rw-r--r--indra/newview/lldrawpoolbump.cpp2
-rw-r--r--indra/newview/lldrawpoolwlsky.cpp3
-rw-r--r--indra/newview/llfeaturemanager.cpp4
-rw-r--r--indra/newview/llfloaterabout.cpp15
-rw-r--r--indra/newview/llfloateranimpreview.cpp6
-rw-r--r--indra/newview/llfloatercolorpicker.cpp6
-rw-r--r--indra/newview/llfloaterfriends.cpp106
-rw-r--r--indra/newview/llfloaterfriends.h6
-rw-r--r--indra/newview/llfloaterimagepreview.cpp6
-rw-r--r--indra/newview/llfloatermemleak.cpp265
-rw-r--r--indra/newview/llfloatermemleak.h89
-rw-r--r--indra/newview/llfloaternamedesc.cpp1
-rw-r--r--indra/newview/llfloatertools.cpp2
-rw-r--r--indra/newview/llfloatertopobjects.cpp9
-rw-r--r--indra/newview/llfolderview.cpp47
-rw-r--r--indra/newview/llfolderview.h2
-rw-r--r--indra/newview/llhudtext.cpp15
-rw-r--r--indra/newview/llhudtext.h3
-rw-r--r--indra/newview/llimpanel.cpp10
-rw-r--r--indra/newview/llinventorymodel.cpp40
-rw-r--r--indra/newview/llinventorymodel.h2
-rw-r--r--indra/newview/lllogchat.cpp13
-rw-r--r--indra/newview/lllogchat.h2
-rw-r--r--indra/newview/llmaniprotate.cpp57
-rw-r--r--indra/newview/llmanipscale.cpp12
-rw-r--r--indra/newview/llmaniptranslate.cpp26
-rw-r--r--indra/newview/llmemoryview.cpp1
-rw-r--r--indra/newview/llnetmap.cpp2
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp3
-rw-r--r--indra/newview/llpanelobject.cpp60
-rw-r--r--indra/newview/llpanelobject.h8
-rw-r--r--indra/newview/llpolymesh.cpp4
-rw-r--r--indra/newview/llpreviewtexture.cpp4
-rw-r--r--indra/newview/llselectmgr.cpp36
-rw-r--r--indra/newview/llsky.h3
-rw-r--r--indra/newview/llstartup.cpp147
-rw-r--r--indra/newview/llstartup.h17
-rw-r--r--indra/newview/llstylemap.cpp10
-rw-r--r--indra/newview/llstylemap.h3
-rw-r--r--indra/newview/lltextureview.cpp5
-rw-r--r--indra/newview/lltool.cpp4
-rw-r--r--indra/newview/lltool.h3
-rw-r--r--indra/newview/lltooldraganddrop.cpp344
-rw-r--r--indra/newview/lltooldraganddrop.h17
-rw-r--r--indra/newview/lltoolselect.cpp7
-rw-r--r--indra/newview/lluploaddialog.cpp2
-rw-r--r--indra/newview/llviewercontrol.cpp7
-rw-r--r--indra/newview/llviewerdisplay.cpp8
-rw-r--r--indra/newview/llviewerjointattachment.cpp25
-rw-r--r--indra/newview/llviewerjoystick.cpp31
-rw-r--r--indra/newview/llviewermedia.cpp2
-rw-r--r--indra/newview/llviewermenu.cpp100
-rw-r--r--indra/newview/llviewermessage.cpp2
-rw-r--r--indra/newview/llviewerobject.cpp246
-rw-r--r--indra/newview/llviewerobject.h24
-rw-r--r--indra/newview/llviewerobjectlist.cpp6
-rw-r--r--indra/newview/llviewerpartsim.cpp211
-rw-r--r--indra/newview/llviewerpartsim.h6
-rw-r--r--indra/newview/llviewerpartsource.cpp8
-rw-r--r--indra/newview/llviewerregion.cpp11
-rw-r--r--indra/newview/llviewerregion.h8
-rw-r--r--indra/newview/llviewershadermgr.cpp4
-rw-r--r--indra/newview/llviewerwindow.cpp280
-rw-r--r--indra/newview/llviewerwindow.h27
-rw-r--r--indra/newview/llvoavatar.cpp254
-rw-r--r--indra/newview/llvoavatar.h9
-rw-r--r--indra/newview/llvoiceclient.cpp46
-rw-r--r--indra/newview/llvoiceclient.h1
-rw-r--r--indra/newview/llvoicevisualizer.cpp8
-rw-r--r--indra/newview/llvopartgroup.cpp19
-rw-r--r--indra/newview/llvovolume.cpp11
-rw-r--r--indra/newview/llvovolume.h1
-rw-r--r--indra/newview/llwearable.h7
-rw-r--r--indra/newview/llwearablelist.cpp2
-rw-r--r--indra/newview/llworld.cpp4
-rw-r--r--indra/newview/pipeline.cpp77
-rw-r--r--indra/newview/pipeline.h6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_joystick.xml14
-rwxr-xr-xindra/newview/viewer_manifest.py5
-rw-r--r--indra/win_crash_logger/CMakeLists.txt20
146 files changed, 2852 insertions, 1397 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 511c552a33..b9bf6f5ff9 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -79,6 +79,7 @@ bushing Spatula
VWR-424
Carjay McGinnis
VWR-3737
+ VWR-6154
Catherine Pfeffer
VWR-1282
Dale Glass
@@ -122,6 +123,8 @@ Feep Larsson
VWR-447
VWR-1314
VWR-4444
+Fluf Fredriksson
+ VWR-3450
Fremont Cunningham
VWR-1147
Gudmund Shepherd
@@ -207,6 +210,7 @@ Michelle2 Zenovka
VWR-3749
VWR-4506
VWR-7831
+ VWR-4022
Mm Alder
VWR-3777
VWR-4794
@@ -377,6 +381,7 @@ Wilton Lundquist
Whoops Babii
VWR-631
VWR-1640
+ VWR-3340
Zarkonnen Decosta
VWR-253
Zi Ree
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index d404150bfd..1d697deeae 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -146,6 +146,11 @@ if (LINUX)
if (VIEWER)
add_definitions(-DAPPID=secondlife)
+ add_definitions(-fvisibility=hidden)
+ if (NOT STANDALONE)
+ # this stops us requiring a really recent glibc at runtime
+ add_definitions(-fno-stack-protector)
+ endif (NOT STANDALONE)
endif (VIEWER)
set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}")
diff --git a/indra/cmake/ELFIO.cmake b/indra/cmake/ELFIO.cmake
index e420ce27bb..e51993b0f7 100644
--- a/indra/cmake/ELFIO.cmake
+++ b/indra/cmake/ELFIO.cmake
@@ -9,6 +9,7 @@ elseif (LINUX)
use_prebuilt_binary(elfio)
set(ELFIO_LIBRARIES ELFIO)
set(ELFIO_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
+ set(ELFIO_FOUND "YES")
endif (STANDALONE)
if (ELFIO_FOUND)
diff --git a/indra/copy_win_scripts/CMakeLists.txt b/indra/copy_win_scripts/CMakeLists.txt
index 35581e83fe..93a8c1d6d2 100644
--- a/indra/copy_win_scripts/CMakeLists.txt
+++ b/indra/copy_win_scripts/CMakeLists.txt
@@ -24,12 +24,12 @@ foreach(file ${file-list})
set(win_scripts-files ${win_scripts-files} ${file})
endif(EXISTS ${win_scripts-src}/${file})
endforeach(file ${file-list})
-
+
copy_if_different(
${win_scripts-src}
${win_scripts-dst}
win_scripts-targets
${win_scripts-files}
)
-
+
add_custom_target(copy_win_scripts ALL DEPENDS ${win_scripts-targets})
diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt
index a3a4d6be0b..628d4acefc 100644
--- a/indra/linux_crash_logger/CMakeLists.txt
+++ b/indra/linux_crash_logger/CMakeLists.txt
@@ -57,25 +57,12 @@ target_link_libraries(linux-crash-logger
)
add_custom_command(
- OUTPUT linux-crash-logger-stripped-globalsyms
+ OUTPUT linux-crash-logger-stripped
COMMAND strip
- ARGS --strip-debug -o linux-crash-logger-stripped-globalsyms
+ ARGS --strip-debug -o linux-crash-logger-stripped
linux-crash-logger
DEPENDS linux-crash-logger
)
-add_custom_command(
- OUTPUT linux-crash-logger-stripped
- COMMAND objcopy
- ARGS
- --keep-global-symbols
- ${VIEWER_DIR}/newview/linux_tools/exposed-symbols.txt
- linux-crash-logger-stripped-globalsyms
- linux-crash-logger-stripped
- DEPENDS
- linux-crash-logger-stripped-globalsyms
- ${VIEWER_DIR}/newview/linux_tools/exposed-symbols.txt
- )
-
add_custom_target(linux-crash-logger-stripped ALL
DEPENDS linux-crash-logger-stripped)
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index d45026c2df..699f0e65de 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -386,7 +386,7 @@ BOOL LLVorbisDecodeState::finishDecode()
mWAVBuffer[7] = (data_length >> 24) & 0x000000FF;
//
- // FUCK!!! Vorbis encode/decode messes up loop point transitions (pop)
+ // FUDGECAKES!!! Vorbis encode/decode messes up loop point transitions (pop)
// do a cheap-and-cheesy crossfade
//
{
@@ -413,12 +413,12 @@ BOOL LLVorbisDecodeState::finishDecode()
if((WAV_HEADER_SIZE+(2 * fade_length)) < (S32)mWAVBuffer.size())
{
memcpy(&mWAVBuffer[WAV_HEADER_SIZE], pcmout, (2 * fade_length)); /*Flawfinder: ignore*/
- }
+ }
S32 near_end = mWAVBuffer.size() - (2 * fade_length);
if ((S32)mWAVBuffer.size() >= ( near_end + 2* fade_length))
{
memcpy(pcmout, &mWAVBuffer[near_end], (2 * fade_length)); /*Flawfinder: ignore*/
- }
+ }
llendianswizzle(&pcmout, 2, fade_length);
samplep = (S16 *)pcmout;
@@ -443,8 +443,8 @@ BOOL LLVorbisDecodeState::finishDecode()
}
#if !defined(USE_WAV_VFILE)
mBytesRead = -1;
- mFileHandle = LLLFSThread::sLocal->write(mOutFilename, &mWAVBuffer[0], 0, data_length,
- new WriteResponder(this));
+ mFileHandle = LLLFSThread::sLocal->write(mOutFilename, &mWAVBuffer[0], 0, mWAVBuffer.size(),
+ new WriteResponder(this));
#endif
}
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 710cd44a6f..090e1913cf 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -655,9 +655,9 @@ BOOL LLKeyframeMotion::setupPose()
BOOL LLKeyframeMotion::onActivate()
{
// If the keyframe anim has an associated emote, trigger it.
- if( mEmoteName.length() > 0 )
+ if( mJointMotionList->mEmoteName.length() > 0 )
{
- mCharacter->startMotion( gAnimLibrary.stringToAnimState(mEmoteName) );
+ mCharacter->startMotion( gAnimLibrary.stringToAnimState(mJointMotionList->mEmoteName) );
}
mLastLoopedTime = 0.f;
@@ -1230,7 +1230,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
//-------------------------------------------------------------------------
// get emote (optional)
//-------------------------------------------------------------------------
- if (!dp.unpackString(mEmoteName, "emote_name"))
+ if (!dp.unpackString(mJointMotionList->mEmoteName, "emote_name"))
{
llwarns << "can't read optional_emote_animation" << llendl;
return FALSE;
@@ -1672,7 +1672,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
if (!parent)
{
llwarns << "Joint with no parent: " << joint->getName()
- << " Emote: " << mEmoteName << llendl;
+ << " Emote: " << mJointMotionList->mEmoteName << llendl;
return FALSE;
}
joint = parent;
@@ -1710,7 +1710,7 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
success &= dp.packU16(KEYFRAME_MOTION_SUBVERSION, "sub_version");
success &= dp.packS32(mJointMotionList->mBasePriority, "base_priority");
success &= dp.packF32(mJointMotionList->mDuration, "duration");
- success &= dp.packString(mEmoteName, "emote_name");
+ success &= dp.packString(mJointMotionList->mEmoteName, "emote_name");
success &= dp.packF32(mJointMotionList->mLoopInPoint, "loop_in_point");
success &= dp.packF32(mJointMotionList->mLoopOutPoint, "loop_out_point");
success &= dp.packS32(mJointMotionList->mLoop, "loop");
@@ -1848,11 +1848,11 @@ void LLKeyframeMotion::setEmote(const LLUUID& emote_id)
const char* emote_name = gAnimLibrary.animStateToString(emote_id);
if (emote_name)
{
- mEmoteName = emote_name;
+ mJointMotionList->mEmoteName = emote_name;
}
else
{
- mEmoteName = "";
+ mJointMotionList->mEmoteName = "";
}
}
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index a50447c3bf..d11aec1ed8 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -420,6 +420,10 @@ public:
typedef std::list<JointConstraintSharedData*> constraint_list_t;
constraint_list_t mConstraints;
LLBBoxLocal mPelvisBBox;
+ // mEmoteName is a facial motion, but it's necessary to appear here so that it's cached.
+ // TODO: LLKeyframeDataCache::getKeyframeData should probably return a class containing
+ // JointMotionList and mEmoteName, see LLKeyframeMotion::onInitialize.
+ std::string mEmoteName;
public:
JointMotionList();
~JointMotionList();
@@ -439,7 +443,6 @@ protected:
std::vector<LLPointer<LLJointState> > mJointStates;
LLJoint* mPelvisp;
LLCharacter* mCharacter;
- std::string mEmoteName;
typedef std::list<JointConstraint*> constraint_list_t;
constraint_list_t mConstraints;
U32 mLastSkeletonSerialNum;
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp
index 56879f4e73..c6008052c3 100644
--- a/indra/llcommon/llmemory.cpp
+++ b/indra/llcommon/llmemory.cpp
@@ -335,7 +335,6 @@ U64 getCurrentRSS()
U64 getCurrentRSS()
{
U64 residentSize = 0;
-
task_basic_info_data_t basicInfo;
mach_msg_type_number_t basicInfoCount = TASK_BASIC_INFO_COUNT;
if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&basicInfo, &basicInfoCount) == KERN_SUCCESS)
diff --git a/indra/llcommon/llmemtype.h b/indra/llcommon/llmemtype.h
index 2e275bd523..e16b7713a9 100644
--- a/indra/llcommon/llmemtype.h
+++ b/indra/llcommon/llmemtype.h
@@ -80,6 +80,7 @@ public:
MTYPE_SPACE_PARTITION,
MTYPE_PIPELINE,
MTYPE_AVATAR,
+ MTYPE_AVATAR_MESH,
MTYPE_PARTICLES,
MTYPE_REGIONS,
MTYPE_INVENTORY,
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 50681b7967..475531a2ad 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -155,6 +155,16 @@ public:
static BOOL isDigit(llwchar a) { return iswdigit(a) != 0; }
};
+// Allowing assignments from non-strings into format_map_t is apparently
+// *really* error-prone, so subclass std::string with just basic c'tors.
+class FormatMapString : public std::string
+{
+public:
+ FormatMapString() : std::string() {};
+ FormatMapString(const char* s) : std::string(s) {};
+ FormatMapString(const std::string& s) : std::string(s) {};
+};
+
template <class T>
class LLStringUtilBase
{
@@ -167,7 +177,7 @@ public:
static std::basic_string<T> null;
- typedef std::map<std::basic_string<T>, std::basic_string<T> > format_map_t;
+ typedef std::map<FormatMapString, FormatMapString> format_map_t;
static S32 format(std::basic_string<T>& s, const format_map_t& fmt_map);
static BOOL isValidIndex(const std::basic_string<T>& string, size_type i)
@@ -516,27 +526,57 @@ namespace LLStringFn
////////////////////////////////////////////////////////////
+// LLStringBase::format()
+//
+// This function takes a string 's' and a map 'fmt_map' of strings-to-strings.
+// All occurances of strings in 's' from the left-hand side of 'fmt_map' are
+// then replaced with the corresponding right-hand side of 'fmt_map', non-
+// recursively. The function returns the number of substitutions made.
+
// static
template<class T>
S32 LLStringUtilBase<T>::format(std::basic_string<T>& s, const format_map_t& fmt_map)
{
typedef typename std::basic_string<T>::size_type string_size_type_t;
- typedef typename format_map_t::const_iterator format_map_const_iterator_t;
+ string_size_type_t scanstart = 0;
S32 res = 0;
- for (format_map_const_iterator_t iter = fmt_map.begin(); iter != fmt_map.end(); ++iter)
+
+ // Look for the first match of any keyword, replace that keyword,
+ // repeat from the end of the replacement string. This avoids
+ // accidentally performing substitution on a substituted string.
+ while (1)
{
- U32 fmtlen = iter->first.size();
- string_size_type_t n = 0;
- while (1)
+ string_size_type_t first_match_pos = scanstart;
+ string_size_type_t first_match_str_length = 0;
+ std::basic_string<T> first_match_str_replacement;
+
+ for (format_map_t::const_iterator iter = fmt_map.begin();
+ iter != fmt_map.end();
+ ++iter)
{
- n = s.find(iter->first, n);
- if (n == std::basic_string<T>::npos)
+ string_size_type_t n = s.find(iter->first, scanstart);
+ if (n != std::basic_string<T>::npos &&
+ (n < first_match_pos ||
+ 0 == first_match_str_length))
{
- break;
+ first_match_pos = n;
+ first_match_str_length = iter->first.length();
+ first_match_str_replacement = iter->second;
}
- s.erase(n, fmtlen);
- s.insert(n, iter->second);
- n += fmtlen;
+ }
+
+ if (0 == first_match_str_length)
+ {
+ // no more keys found to substitute from this point
+ // in the string forward.
+ break;
+ }
+ else
+ {
+ s.erase(first_match_pos, first_match_str_length);
+ s.insert(first_match_pos, first_match_str_replacement);
+ scanstart = first_match_pos +
+ first_match_str_replacement.length();
++res;
}
}
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 77d683adc0..7570420d2c 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -538,7 +538,7 @@ void LLEventTimer::updateClass()
{
LLEventTimer* timer = *iter++;
F32 et = timer->mEventTimer.getElapsedTimeF32();
- if (et > timer->mPeriod) {
+ if (timer->mEventTimer.getStarted() && et > timer->mPeriod) {
timer->mEventTimer.reset();
if ( timer->tick() )
{
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index f58154602b..0555b9ea3c 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -33,8 +33,8 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 1;
-const S32 LL_VERSION_MINOR = 20;
-const S32 LL_VERSION_PATCH = 15;
+const S32 LL_VERSION_MINOR = 21;
+const S32 LL_VERSION_PATCH = 0;
const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Release";
diff --git a/indra/llimage/llimagejpeg.cpp b/indra/llimage/llimagejpeg.cpp
index 1bddd7a051..aab19aa261 100644
--- a/indra/llimage/llimagejpeg.cpp
+++ b/indra/llimage/llimagejpeg.cpp
@@ -35,6 +35,7 @@
#include "llerror.h"
+jmp_buf LLImageJPEG::sSetjmpBuffer ;
LLImageJPEG::LLImageJPEG(S32 quality)
:
LLImageFormatted(IMG_CODEC_JPEG),
@@ -42,8 +43,6 @@ LLImageJPEG::LLImageJPEG(S32 quality)
mOutputBufferSize( 0 ),
mEncodeQuality( quality ) // on a scale from 1 to 100
{
- // Including in initializer list above generates warning on VC2005
- memset(mSetjmpBuffer, 0, sizeof(mSetjmpBuffer));
}
LLImageJPEG::~LLImageJPEG()
@@ -78,7 +77,16 @@ BOOL LLImageJPEG::updateData()
jerr.error_exit = &LLImageJPEG::errorExit; // Error exit handler: does not return to caller
jerr.emit_message = &LLImageJPEG::errorEmitMessage; // Conditionally emit a trace or warning message
jerr.output_message = &LLImageJPEG::errorOutputMessage; // Routine that actually outputs a trace or error message
-
+
+ //
+ //try/catch will crash on Mac and Linux if LLImageJPEG::errorExit throws an error
+ //so as instead, we use setjmp/longjmp to avoid this crash, which is the best we can get. --bao
+ //
+ if(setjmp(sSetjmpBuffer))
+ {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
try
{
// Now we can initialize the JPEG decompression object.
@@ -210,7 +218,15 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
jerr.emit_message = &LLImageJPEG::errorEmitMessage; // Conditionally emit a trace or warning message
jerr.output_message = &LLImageJPEG::errorOutputMessage; // Routine that actually outputs a trace or error message
-
+ //
+ //try/catch will crash on Mac and Linux if LLImageJPEG::errorExit throws an error
+ //so as instead, we use setjmp/longjmp to avoid this crash, which is the best we can get. --bao
+ //
+ if(setjmp(sSetjmpBuffer))
+ {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
try
{
// Now we can initialize the JPEG decompression object.
@@ -404,7 +420,7 @@ void LLImageJPEG::errorExit( j_common_ptr cinfo )
jpeg_destroy(cinfo);
// Return control to the setjmp point
- throw 1;
+ longjmp(sSetjmpBuffer, 1) ;
}
// Decide whether to emit a trace or warning message.
@@ -502,8 +518,11 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
jerr.emit_message = &LLImageJPEG::errorEmitMessage; // Conditionally emit a trace or warning message
jerr.output_message = &LLImageJPEG::errorOutputMessage; // Routine that actually outputs a trace or error message
- // Establish the setjmp return context mSetjmpBuffer. Used by library to abort.
- if( setjmp(mSetjmpBuffer) )
+ //
+ //try/catch will crash on Mac and Linux if LLImageJPEG::errorExit throws an error
+ //so as instead, we use setjmp/longjmp to avoid this crash, which is the best we can get. --bao
+ //
+ if( setjmp(sSetjmpBuffer) )
{
// If we get here, the JPEG code has signaled an error.
// We need to clean up the JPEG object, close the input file, and return.
diff --git a/indra/llimage/llimagejpeg.h b/indra/llimage/llimagejpeg.h
index 36d3454d4b..85e69d9b8f 100644
--- a/indra/llimage/llimagejpeg.h
+++ b/indra/llimage/llimagejpeg.h
@@ -84,8 +84,8 @@ protected:
S32 mOutputBufferSize; // bytes in mOuputBuffer
S32 mEncodeQuality; // on a scale from 1 to 100
-
- jmp_buf mSetjmpBuffer; // To allow the library to abort.
+private:
+ static jmp_buf sSetjmpBuffer; // To allow the library to abort.
};
#endif // LL_LLIMAGEJPEG_H
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 242b0809eb..7418be46cc 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -280,9 +280,6 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3
F32 t, t_step, t_first, t_fraction, ang, ang_step;
LLVector3 pt1,pt2;
- mMaxX = 0.f;
- mMinX = 0.f;
-
F32 begin = params.getBegin();
F32 end = params.getEnd();
@@ -318,15 +315,6 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3
if (t_fraction < 0.9999f)
{
LLVector3 new_pt = lerp(pt1, pt2, t_fraction);
- F32 pt_x = new_pt.mV[VX];
- if (pt_x < mMinX)
- {
- mMinX = pt_x;
- }
- else if (pt_x > mMaxX)
- {
- mMaxX = pt_x;
- }
mProfile.push_back(new_pt);
}
@@ -336,16 +324,6 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3
// Iterate through all the integer steps of t.
pt1.setVec(cos(ang)*scale,sin(ang)*scale,t);
- F32 pt_x = pt1.mV[VX];
- if (pt_x < mMinX)
- {
- mMinX = pt_x;
- }
- else if (pt_x > mMaxX)
- {
- mMaxX = pt_x;
- }
-
if (mProfile.size() > 0) {
LLVector3 p = mProfile[mProfile.size()-1];
for (S32 i = 0; i < split && mProfile.size() > 0; i++) {
@@ -369,15 +347,6 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3
if (t_fraction > 0.0001f)
{
LLVector3 new_pt = lerp(pt1, pt2, t_fraction);
- F32 pt_x = new_pt.mV[VX];
- if (pt_x < mMinX)
- {
- mMinX = pt_x;
- }
- else if (pt_x > mMaxX)
- {
- mMaxX = pt_x;
- }
if (mProfile.size() > 0) {
LLVector3 p = mProfile[mProfile.size()-1];
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 376b2ecc99..c3ffbcc8ed 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -101,6 +101,12 @@ void LLCurl::setCAFile(const std::string& file)
sCAFile = file;
}
+//static
+std::string LLCurl::getVersionString()
+{
+ return std::string(curl_version());
+}
+
//////////////////////////////////////////////////////////////////////////////
LLCurl::Responder::Responder()
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index b7634d420f..0700befab3 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -134,6 +134,11 @@ public:
* @ brief Set certificate authority path used to verify HTTPS certs.
*/
static void setCAPath(const std::string& path);
+
+ /**
+ * @ brief Return human-readable string describing libcurl version.
+ */
+ static std::string getVersionString();
/**
* @ brief Get certificate authority file used to verify HTTPS certs.
diff --git a/indra/llmessage/llmessageconfig.cpp b/indra/llmessage/llmessageconfig.cpp
index 0159eb3562..8f957f4ebf 100644
--- a/indra/llmessage/llmessageconfig.cpp
+++ b/indra/llmessage/llmessageconfig.cpp
@@ -52,13 +52,14 @@ static LLSD sMessages;
class LLMessageConfigFile : public LLLiveFile
{
public:
- LLMessageConfigFile()
- : LLLiveFile(filename(), messageConfigRefreshRate)
+ LLMessageConfigFile() :
+ LLLiveFile(filename(), messageConfigRefreshRate),
+ mMaxQueuedEvents(0)
{ }
- static std::string filename();
+ static std::string filename();
- LLSD mMessages;
+ LLSD mMessages;
std::string mServerDefault;
static LLMessageConfigFile& instance();
@@ -66,7 +67,7 @@ public:
/* virtual */ void loadFile();
void loadServerDefaults(const LLSD& data);
- void loadMaxQueuedEvents(const LLSD& data);
+ void loadMaxQueuedEvents(const LLSD& data);
void loadMessages(const LLSD& data);
void loadCapBans(const LLSD& blacklist);
void loadMessageBans(const LLSD& blacklist);
@@ -74,7 +75,10 @@ public:
public:
LLSD mCapBans;
- S32 mMaxQueuedEvents;
+ S32 mMaxQueuedEvents;
+
+private:
+ static const S32 DEFAULT_MAX_QUEUED_EVENTS = 100;
};
std::string LLMessageConfigFile::filename()
@@ -125,7 +129,6 @@ void LLMessageConfigFile::loadServerDefaults(const LLSD& data)
mServerDefault = data["serverDefaults"][sServerName].asString();
}
-const S32 DEFAULT_MAX_QUEUED_EVENTS = 100;
void LLMessageConfigFile::loadMaxQueuedEvents(const LLSD& data)
{
if (data.has("maxQueuedEvents"))
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 8c63122cb8..bd7cdf3d70 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -284,6 +284,7 @@ LLGLManager::LLGLManager() :
mIsGF3(FALSE),
mIsGFFX(FALSE),
mATIOffsetVerticalLines(FALSE),
+ mATIOldDriver(FALSE),
mHasRequirements(TRUE),
@@ -381,6 +382,17 @@ bool LLGLManager::initGL()
mATIOffsetVerticalLines = TRUE;
}
#endif // LL_WINDOWS
+
+#if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS
+ // release 7277 is a point at which we verify that ATI OpenGL
+ // drivers get pretty stable with SL, ~Catalyst 8.2,
+ // for both Win32 and Linux.
+ if (mDriverVersionRelease < 7277 &&
+ mDriverVersionRelease != 0) // 0 == Undetectable driver version - these get to pretend to be new ATI drivers, though that decision may be revisited.
+ {
+ mATIOldDriver = TRUE;
+ }
+#endif // (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS
}
else if (mGLVendor.find("NVIDIA ") != std::string::npos)
{
@@ -988,6 +1000,10 @@ void LLGLState::initClass()
{
sStateMap[GL_DITHER] = GL_TRUE;
sStateMap[GL_TEXTURE_2D] = GL_TRUE;
+
+ //make sure multisample defaults to disabled
+ sStateMap[GL_MULTISAMPLE_ARB] = GL_FALSE;
+ glDisable(GL_MULTISAMPLE_ARB);
}
//static
diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h
index e9b4c7929e..f387b7b179 100644
--- a/indra/llrender/llgl.h
+++ b/indra/llrender/llgl.h
@@ -100,6 +100,7 @@ public:
BOOL mIsGF3;
BOOL mIsGFFX;
BOOL mATIOffsetVerticalLines;
+ BOOL mATIOldDriver;
// Whether this version of GL is good enough for SL to use
BOOL mHasRequirements;
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index fc911de46b..4a87424bb8 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -451,6 +451,12 @@ void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
glTranslatef(x,y,z);
}
+void LLRender::scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z)
+{
+ flush();
+ glScalef(x,y,z);
+}
+
void LLRender::pushMatrix()
{
flush();
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index a0a492bc73..2d512ab543 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -178,6 +178,7 @@ public:
~LLRender();
void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
+ void scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z);
void pushMatrix();
void popMatrix();
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 2e827ed442..3f2eb61641 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -190,6 +190,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
if (mode > NUM_MODES)
{
llerrs << "Invalid draw mode: " << mode << llendl;
+ return;
}
glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,
@@ -217,6 +218,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
if (mode > NUM_MODES)
{
llerrs << "Invalid draw mode: " << mode << llendl;
+ return;
}
glDrawElements(sGLMode[mode], count, GL_UNSIGNED_SHORT,
@@ -240,6 +242,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
if (mode > NUM_MODES)
{
llerrs << "Invalid draw mode: " << mode << llendl;
+ return;
}
glDrawArrays(sGLMode[mode], first, count);
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 4f5f630fcd..3f6338006f 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -208,6 +208,7 @@ void LLButton::init(void (*click_callback)(void*), void *callback_data, const LL
mHighlightColor = ( LLUI::sColorsGroup->getColor( "ButtonUnselectedFgColor" ) );
mUnselectedBgColor = ( LLUI::sColorsGroup->getColor( "ButtonUnselectedBgColor" ) );
mSelectedBgColor = ( LLUI::sColorsGroup->getColor( "ButtonSelectedBgColor" ) );
+ mFlashBgColor = ( LLUI::sColorsGroup->getColor( "ButtonFlashBgColor" ) );
mImageOverlayAlignment = LLFontGL::HCENTER;
mImageOverlayColor = LLColor4::white;
@@ -433,7 +434,9 @@ void LLButton::draw()
|| mToggleState;
BOOL use_glow_effect = FALSE;
- if ( mNeedsHighlight || flash )
+ LLColor4 glow_color = LLColor4::white;
+ LLRender::eBlendType glow_type = LLRender::BT_ADD_WITH_ALPHA;
+ if ( mNeedsHighlight )
{
if (pressed)
{
@@ -469,6 +472,16 @@ void LLButton::draw()
mImagep = mImageUnselected;
}
+ if (mFlashing)
+ {
+ use_glow_effect = TRUE;
+ glow_type = LLRender::BT_ALPHA; // blend the glow
+ if (mNeedsHighlight) // highlighted AND flashing
+ glow_color = (glow_color*0.5f + mFlashBgColor*0.5f) % 2.0f; // average between flash and highlight colour, with sum of the opacity
+ else
+ glow_color = mFlashBgColor;
+ }
+
// Override if more data is available
// HACK: Use gray checked state to mean either:
// enabled and tentative
@@ -555,7 +568,10 @@ void LLButton::draw()
if (use_glow_effect)
{
- mCurGlowStrength = lerp(mCurGlowStrength, mHoverGlowStrength, LLCriticalDamp::getInterpolant(0.05f));
+ mCurGlowStrength = lerp(mCurGlowStrength,
+ mFlashing ? (flash? 1.0 : 0.0)
+ : mHoverGlowStrength,
+ LLCriticalDamp::getInterpolant(0.05f));
}
else
{
@@ -571,8 +587,8 @@ void LLButton::draw()
mImagep->draw(getLocalRect(), getEnabled() ? mImageColor : mDisabledImageColor );
if (mCurGlowStrength > 0.01f)
{
- gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
- mImagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), LLColor4(1.f, 1.f, 1.f, mCurGlowStrength));
+ gGL.setSceneBlendType(glow_type);
+ mImagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), glow_color % mCurGlowStrength);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
}
@@ -581,8 +597,8 @@ void LLButton::draw()
mImagep->draw(0, 0, getEnabled() ? mImageColor : mDisabledImageColor );
if (mCurGlowStrength > 0.01f)
{
- gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
- mImagep->drawSolid(0, 0, LLColor4(1.f, 1.f, 1.f, mCurGlowStrength));
+ gGL.setSceneBlendType(glow_type);
+ mImagep->drawSolid(0, 0, glow_color % mCurGlowStrength);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
}
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 9e24376938..2c35614401 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -267,6 +267,7 @@ private:
LLColor4 mHighlightColor;
LLColor4 mUnselectedBgColor;
LLColor4 mSelectedBgColor;
+ LLColor4 mFlashBgColor;
LLColor4 mImageColor;
LLColor4 mDisabledImageColor;
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 8d8487f612..89ce68a32e 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -774,6 +774,12 @@ BOOL LLComboBox::handleKeyHere(KEY key, MASK mask)
BOOL result = FALSE;
if (hasFocus())
{
+ if (mList->getVisible()
+ && key == KEY_ESCAPE && mask == MASK_NONE)
+ {
+ hideList();
+ return TRUE;
+ }
//give list a chance to pop up and handle key
LLScrollListItem* last_selected_item = mList->getLastSelectedItem();
if (last_selected_item)
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 838f6fa193..7f8f54a44a 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -649,24 +649,55 @@ void LLFloater::applyRectControl()
}
}
-void LLFloater::setTitle( const std::string& title )
+void LLFloater::applyTitle()
{
if (gNoRender)
{
return;
}
- if (mDragHandle)
- mDragHandle->setTitle( title );
+
+ if (!mDragHandle)
+ {
+ return;
+ }
+
+ if (isMinimized() && !mShortTitle.empty())
+ {
+ mDragHandle->setTitle( mShortTitle );
+ }
+ else
+ {
+ mDragHandle->setTitle ( mTitle );
+ }
}
-const std::string& LLFloater::getTitle() const
+const std::string& LLFloater::getCurrentTitle() const
{
return mDragHandle ? mDragHandle->getTitle() : LLStringUtil::null;
}
+void LLFloater::setTitle( const std::string& title )
+{
+ mTitle = title;
+ applyTitle();
+}
+
+std::string LLFloater::getTitle()
+{
+ if (mTitle.empty())
+ {
+ return mDragHandle ? mDragHandle->getTitle() : LLStringUtil::null;
+ }
+ else
+ {
+ return mTitle;
+ }
+}
+
void LLFloater::setShortTitle( const std::string& short_title )
{
mShortTitle = short_title;
+ applyTitle();
}
std::string LLFloater::getShortTitle()
@@ -895,6 +926,9 @@ void LLFloater::setMinimized(BOOL minimize)
// Reshape *after* setting mMinimized
reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
}
+
+ applyTitle ();
+
make_ui_sound("UISndWindowClose");
updateButtons();
}
@@ -1340,7 +1374,7 @@ void LLFloater::draw()
gl_rect_2d( left, top, right, bottom, getTransparentColor() );
}
- if(gFocusMgr.childHasKeyboardFocus(this) && !getIsChrome() && !getTitle().empty())
+ if(gFocusMgr.childHasKeyboardFocus(this) && !getIsChrome() && !getCurrentTitle().empty())
{
// draw highlight on title bar to indicate focus. RDW
const LLFontGL* font = LLResMgr::getInstance()->getRes( LLFONT_SANSSERIF );
@@ -2846,7 +2880,7 @@ LLXMLNodePtr LLFloater::getXML(bool save_children) const
{
LLXMLNodePtr node = LLPanel::getXML();
- node->createChild("title", TRUE)->setStringValue(getTitle());
+ node->createChild("title", TRUE)->setStringValue(getCurrentTitle());
node->createChild("can_resize", TRUE)->setBoolValue(isResizable());
@@ -2893,7 +2927,7 @@ LLView* LLFloater::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *f
void LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *factory, BOOL open) /* Flawfinder: ignore */
{
std::string name(getName());
- std::string title(getTitle());
+ std::string title(getCurrentTitle());
std::string short_title(getShortTitle());
std::string rect_control("");
BOOL resizable = isResizable();
@@ -2933,6 +2967,9 @@ void LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactor
minimizable,
close_btn);
+ setTitle(title);
+ applyTitle ();
+
setShortTitle(short_title);
BOOL can_tear_off;
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index e467d6f921..4ca15857b9 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -142,8 +142,10 @@ public:
LLMultiFloater* getHost() { return (LLMultiFloater*)mHostHandle.get(); }
- void setTitle( const std::string& title );
- const std::string& getTitle() const;
+ void applyTitle();
+ const std::string& getCurrentTitle() const;
+ void setTitle( const std::string& title);
+ std::string getTitle();
void setShortTitle( const std::string& short_title );
std::string getShortTitle();
void setTitleVisible(bool visible);
@@ -247,6 +249,7 @@ private:
BOOL mMinimized;
BOOL mForeground;
LLHandle<LLFloater> mDependeeHandle;
+ std::string mTitle;
std::string mShortTitle;
BOOL mFirstLook; // TRUE if the _next_ time this floater is visible will be the first time in the session that it is visible.
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index fba0984dce..3237ef8e27 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -3902,6 +3902,13 @@ BOOL LLMenuBarGL::handleKeyHere(KEY key, MASK mask)
{
mAltKeyTrigger = FALSE;
}
+
+ if (key == KEY_ESCAPE && mask == MASK_NONE)
+ {
+ LLMenuGL::setKeyboardMode(FALSE);
+ // if any menus are visible, this will return TRUE, stopping further processing of ESCAPE key
+ return LLMenuGL::sMenuContainer->hideMenus();
+ }
// before processing any other key, check to see if ALT key has triggered menu access
checkMenuTrigger();
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 488e62c61e..0bf7162d56 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -152,24 +152,43 @@ LLView* LLTabContainer::getChildView(const std::string& name, BOOL recurse, BOOL
void LLTabContainer::draw()
{
S32 target_pixel_scroll = 0;
- S32 cur_scroll_pos = mIsVertical ? 0 : getScrollPos();
+ S32 cur_scroll_pos = getScrollPos();
if (cur_scroll_pos > 0)
{
- S32 available_width_with_arrows = getRect().getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1);
- for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
+ if (!mIsVertical)
{
- if (cur_scroll_pos == 0)
+ S32 available_width_with_arrows = getRect().getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1);
+ for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
{
- break;
+ if (cur_scroll_pos == 0)
+ {
+ break;
+ }
+ target_pixel_scroll += (*iter)->mButton->getRect().getWidth();
+ cur_scroll_pos--;
}
- target_pixel_scroll += (*iter)->mButton->getRect().getWidth();
- cur_scroll_pos--;
- }
- // Show part of the tab to the left of what is fully visible
- target_pixel_scroll -= TABCNTR_TAB_PARTIAL_WIDTH;
- // clamp so that rightmost tab never leaves right side of screen
- target_pixel_scroll = llmin(mTotalTabWidth - available_width_with_arrows, target_pixel_scroll);
+ // Show part of the tab to the left of what is fully visible
+ target_pixel_scroll -= TABCNTR_TAB_PARTIAL_WIDTH;
+ // clamp so that rightmost tab never leaves right side of screen
+ target_pixel_scroll = llmin(mTotalTabWidth - available_width_with_arrows, target_pixel_scroll);
+ }
+ else
+ {
+ S32 available_height_with_arrows = getRect().getHeight() - getTopBorderHeight() - (LLPANEL_BORDER_WIDTH + TABCNTR_ARROW_BTN_SIZE + TABCNTR_ARROW_BTN_SIZE + 1);
+ for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)
+ {
+ if (cur_scroll_pos==0)
+ {
+ break;
+ }
+ target_pixel_scroll += (*iter)->mButton->getRect().getHeight();
+ cur_scroll_pos--;
+ }
+ S32 total_tab_height = (BTN_HEIGHT + TABCNTRV_PAD) * getTabCount() + TABCNTRV_PAD;
+ // clamp so that the bottom tab never leaves bottom of panel
+ target_pixel_scroll = llmin(total_tab_height - available_height_with_arrows, target_pixel_scroll);
+ }
}
setScrollPosPixels((S32)lerp((F32)getScrollPosPixels(), (F32)target_pixel_scroll, LLCriticalDamp::getInterpolant(0.08f)));
@@ -612,13 +631,13 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDrag
{
if (has_scroll_arrows)
{
- if (mJumpPrevArrowBtn->getRect().pointInRect(x, y))
+ if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y))
{
S32 local_x = x - mJumpPrevArrowBtn->getRect().mLeft;
S32 local_y = y - mJumpPrevArrowBtn->getRect().mBottom;
mJumpPrevArrowBtn->handleHover(local_x, local_y, mask);
}
- if (mJumpNextArrowBtn->getRect().pointInRect(x, y))
+ if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y))
{
S32 local_x = x - mJumpNextArrowBtn->getRect().mLeft;
S32 local_y = y - mJumpNextArrowBtn->getRect().mBottom;
@@ -1794,3 +1813,4 @@ void LLTabContainer::commitHoveredButton(S32 x, S32 y)
}
+
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index b70ad4c53c..4f02715d2c 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -4180,8 +4180,8 @@ void LLTextEditor::setTextEditorParameters(LLXMLNodePtr node)
///////////////////////////////////////////////////////////////////
S32 LLTextEditor::findHTMLToken(const std::string &line, S32 pos, BOOL reverse) const
{
- std::string openers=" \t('\"[{<>";
- std::string closers=" \t)'\"]}><;";
+ std::string openers=" \t\n('\"[{<>";
+ std::string closers=" \t\n)'\"]}><;";
S32 m2;
S32 retval;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index c1da6c93fe..b05014d94e 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -698,7 +698,7 @@ BOOL LLView::handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_s
{
BOOL handled = FALSE;
- std::string tool_tip;
+ std::string tool_tip;
for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 2e1d0e3868..130c3b52f7 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -518,7 +518,7 @@ public:
{
// need non-const to update private dummy widget cache
llwarns << "Making dummy " << xml_tag << " named " << name << " in " << getName() << llendl;
- const_cast<LLView*>(this)->mDummyWidgets.insert(std::make_pair(name, widget));
+ mDummyWidgets.insert(std::make_pair(name, widget));
}
else
{
@@ -646,7 +646,7 @@ private:
std::string mControlName;
typedef std::map<std::string, LLView*> dummy_widget_map_t;
- dummy_widget_map_t mDummyWidgets;
+ mutable dummy_widget_map_t mDummyWidgets;
boost::signals::connection mControlConnection;
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index f4865202d5..325a2a39b6 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -59,8 +59,19 @@ LLDir_Linux gDirUtil;
LLDir *gDirUtilp = (LLDir *)&gDirUtil;
-LLDir::LLDir()
-: mDirDelimiter("/") // fallback to forward slash if not overridden
+LLDir::LLDir()
+: mAppName(""),
+ mExecutablePathAndName(""),
+ mExecutableFilename(""),
+ mExecutableDir(""),
+ mAppRODataDir(""),
+ mOSUserDir(""),
+ mOSUserAppDir(""),
+ mLindenUserDir(""),
+ mOSCacheDir(""),
+ mCAFile(""),
+ mTempDir(""),
+ mDirDelimiter("/") // fallback to forward slash if not overridden
{
}
@@ -205,13 +216,20 @@ const std::string LLDir::getCacheDir(bool get_default) const
if (mCacheDir.empty() || get_default)
{
std::string res;
- if (getOSUserAppDir().empty())
+ if (getOSCacheDir().empty())
{
- res = "data";
+ if (getOSUserAppDir().empty())
+ {
+ res = "data";
+ }
+ else
+ {
+ res = getOSUserAppDir() + mDirDelimiter + "cache";
+ }
}
else
{
- res = getOSUserAppDir() + mDirDelimiter + "cache";
+ res = getOSCacheDir() + mDirDelimiter + "SecondLife";
}
return res;
}
@@ -221,6 +239,12 @@ const std::string LLDir::getCacheDir(bool get_default) const
}
}
+const std::string &LLDir::getOSCacheDir() const
+{
+ return mOSCacheDir;
+}
+
+
const std::string &LLDir::getCAFile() const
{
return mCAFile;
@@ -350,6 +374,9 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
prefix += mDirDelimiter;
prefix += "browser_profile";
break;
+
+ case LL_PATH_EXECUTABLE:
+ prefix = getExecutableDir();
default:
llassert(0);
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 93b15276a3..b0255b4d00 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -51,7 +51,8 @@ typedef enum ELLPath
LL_PATH_PER_ACCOUNT_CHAT_LOGS = 13,
LL_PATH_MOZILLA_PROFILE = 14,
// LL_PATH_HTML = 15,
- LL_PATH_LAST = 16
+ LL_PATH_EXECUTABLE = 16,
+ LL_PATH_LAST
} ELLPath;
@@ -86,6 +87,7 @@ class LLDir
const std::string &getPerAccountChatLogsDir() const; // Location of the per account chat logs dir.
const std::string &getTempDir() const; // Common temporary directory
const std::string getCacheDir(bool get_default = false) const; // Location of the cache.
+ const std::string &getOSCacheDir() const; // location of OS-specific cache folder (may be empty string)
const std::string &getCAFile() const; // File containing TLS certificate authorities
const std::string &getDirDelimiter() const; // directory separator for platform (ie. '\' or '/' or ':')
const std::string &getSkinDir() const; // User-specified skin folder.
@@ -135,6 +137,7 @@ protected:
std::string mCAFile; // Location of the TLS certificate authority PEM file.
std::string mTempDir;
std::string mCacheDir;
+ std::string mOSCacheDir;
std::string mDirDelimiter;
std::string mSkinDir; // Location for current skin info.
std::string mDefaultSkinDir; // Location for default skin info.
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index 80134e2978..a6072c02fe 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -159,13 +159,22 @@ LLDir_Mac::LLDir_Mac()
// Create our sub-dirs
(void) CFCreateDirectory(&newFileRef, CFSTR("data"), NULL);
- (void) CFCreateDirectory(&newFileRef, CFSTR("cache"), NULL);
+ //(void) CFCreateDirectory(&newFileRef, CFSTR("cache"), NULL);
(void) CFCreateDirectory(&newFileRef, CFSTR("logs"), NULL);
(void) CFCreateDirectory(&newFileRef, CFSTR("user_settings"), NULL);
(void) CFCreateDirectory(&newFileRef, CFSTR("browser_profile"), NULL);
}
}
+ //mOSCacheDir
+ FSRef cacheDirRef;
+ error = FSFindFolder(kUserDomain, kCachedDataFolderType, true, &cacheDirRef);
+ if (error == noErr)
+ {
+ FSRefToLLString(&cacheDirRef, mOSCacheDir);
+ (void)CFCreateDirectory(&cacheDirRef, CFSTR("SecondLife"),NULL);
+ }
+
// mOSUserAppDir
mOSUserAppDir = mOSUserDir;
diff --git a/indra/llwindow/llmousehandler.h b/indra/llwindow/llmousehandler.h
index 6fbdbe3c3e..3ede7e7830 100644
--- a/indra/llwindow/llmousehandler.h
+++ b/indra/llwindow/llmousehandler.h
@@ -43,7 +43,11 @@ class LLMouseHandler
public:
LLMouseHandler() {}
virtual ~LLMouseHandler() {}
-
+ typedef enum {
+ SHOW_NEVER,
+ SHOW_IF_NOT_BLOCKED,
+ SHOW_ALWAYS,
+ } EShowToolTip;
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask) = 0;
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask) = 0;
virtual BOOL handleHover(S32 x, S32 y, MASK mask) = 0;
@@ -52,6 +56,7 @@ public:
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) = 0;
virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask) = 0;
virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen) = 0;
+ virtual EShowToolTip getShowToolTip() { return SHOW_IF_NOT_BLOCKED; };
virtual const std::string& getName() const = 0;
virtual void onMouseCaptureLost() = 0;
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 5f46b36c68..6b1cabc505 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -285,6 +285,12 @@ void LLWindow::setCallbacks(LLWindowCallbacks *callbacks)
}
}
+void *LLWindow::getMediaWindow()
+{
+ // Default to returning the platform window.
+ return getPlatformWindow();
+}
+
// static
std::string LLWindow::getFontListSans()
{
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 84ea9755fd..ec09234c83 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -219,8 +219,11 @@ public:
// opens system default color picker
virtual BOOL dialog_color_picker (F32 *r, F32 *g, F32 *b) { return FALSE; };
-// return a platform-specific window reference (HWND on Windows, WindowRef on the Mac)
+// return a platform-specific window reference (HWND on Windows, WindowRef on the Mac, Gtk window on Linux)
virtual void *getPlatformWindow() = 0;
+
+// return the platform-specific window reference we use to initialize llmozlib (HWND on Windows, WindowRef on the Mac, Gtk window on Linux)
+ virtual void *getMediaWindow();
// control platform's Language Text Input mechanisms.
virtual void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b) {}
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index df3fb2e240..72623a17f2 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -61,6 +61,7 @@ const S32 MAX_NUM_RESOLUTIONS = 32;
//
BOOL LLWindowMacOSX::sUseMultGL = FALSE;
+WindowRef LLWindowMacOSX::sMediaWindow = NULL;
// Cross-platform bits:
@@ -3201,22 +3202,31 @@ BOOL LLWindowMacOSX::dialog_color_picker ( F32 *r, F32 *g, F32 *b)
return (retval);
}
-static WindowRef dummywindowref = NULL;
void *LLWindowMacOSX::getPlatformWindow()
{
- if(mWindow != NULL)
- return (void*)mWindow;
+ // NOTE: this will be NULL in fullscreen mode. Plan accordingly.
+ return (void*)mWindow;
+}
+
+void *LLWindowMacOSX::getMediaWindow()
+{
+ /*
+ Mozilla needs to be initialized with a WindowRef to function properly.
+ (There's no good reason for this, since it shouldn't be interacting with our window in any way, but that's another issue.)
+ If we're in windowed mode, we _could_ hand it our actual window pointer, but a subsequent switch to fullscreen will destroy that window,
+ which trips up Mozilla.
+ Instead of using our actual window, we create an invisible window which will persist for the lifetime of the application and pass that to Mozilla.
+ This satisfies its deep-seated need to latch onto a WindowRef and solves the issue with switching between fullscreen and windowed modes.
- // If we're in fullscreen mode, there's no window pointer available.
- // Since Mozilla needs one to function, create a dummy window here.
- // Note that we will never destroy it, but since only one will be created per run of the application, that's okay.
+ Note that we will never destroy this window (by design!), but since only one will ever be created per run of the application, that's okay.
+ */
- if(dummywindowref == NULL)
+ if(sMediaWindow == NULL)
{
Rect window_rect = {100, 100, 200, 200};
- dummywindowref = NewCWindow(
+ sMediaWindow = NewCWindow(
NULL,
&window_rect,
(ConstStr255Param) "\p",
@@ -3227,7 +3237,7 @@ void *LLWindowMacOSX::getPlatformWindow()
0);
}
- return (void*)dummywindowref;
+ return (void*)sMediaWindow;
}
void LLWindowMacOSX::stopDockTileBounce()
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 10955b1288..24cdb54a9e 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -105,6 +105,7 @@ public:
/*virtual*/ BOOL dialog_color_picker(F32 *r, F32 *g, F32 *b);
/*virtual*/ void *getPlatformWindow();
+ /*virtual*/ void *getMediaWindow();
/*virtual*/ void bringToFront() {};
/*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b);
@@ -201,6 +202,8 @@ protected:
static BOOL sUseMultGL;
friend class LLWindowManager;
+ static WindowRef sMediaWindow;
+
};
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index 42a9144d58..e2d114245d 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -2830,14 +2830,18 @@ std::string LLWindowSDL::getFontListSans()
{
if (success >= 2 && locale->lang) // confident!
{
+ LL_INFOS("AppInit") << "Language " << locale->lang << LL_ENDL;
+ LL_INFOS("AppInit") << "Location " << locale->country << LL_ENDL;
+ LL_INFOS("AppInit") << "Variant " << locale->variant << LL_ENDL;
+
llinfos << "Preferring fonts of language: "
<< locale->lang
<< llendl;
sort_order = "lang=" + std::string(locale->lang) + ":"
+ sort_order;
}
- FL_FreeLocale(&locale);
}
+ FL_FreeLocale(&locale);
if (!FcInit())
{
diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt
index c8eb17e325..9cddb562f7 100644
--- a/indra/mac_crash_logger/CMakeLists.txt
+++ b/indra/mac_crash_logger/CMakeLists.txt
@@ -33,10 +33,28 @@ set(mac_crash_logger_HEADER_FILES
set_source_files_properties(${mac_crash_logger_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
-
list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_HEADER_FILES})
-add_executable(mac-crash-logger ${mac_crash_logger_SOURCE_FILES})
+set(mac_crash_logger_RESOURCE_FILES
+ Info.plist
+ CrashReporter.nib/
+ )
+set_source_files_properties(
+ ${mac_crash_logger_RESOURCE_FILES}
+ PROPERTIES
+ HEADER_FILE_ONLY TRUE
+ )
+set_source_files_properties(
+ Info.plist
+ PROPERTIES
+ MACOSX_PACKAGE_LOCATION . # will it blend? + poppy
+ )
+SOURCE_GROUP("Resources" FILES ${mac_crash_logger_RESOURCE_FILES})
+list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_RESOURCE_FILES})
+
+add_executable(mac-crash-logger
+ MACOSX_BUNDLE
+ ${mac_crash_logger_SOURCE_FILES})
target_link_libraries(mac-crash-logger
${LLCRASHLOGGER_LIBRARIES}
@@ -48,3 +66,14 @@ target_link_libraries(mac-crash-logger
${LLCOMMON_LIBRARIES}
${BOOST_SIGNALS_LIBRARY}
)
+
+add_custom_command(
+ TARGET mac-crash-logger POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_directory
+ ${CMAKE_CURRENT_SOURCE_DIR}/CrashReporter.nib
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib
+ )
+
diff --git a/indra/mac_crash_logger/CrashReporter.nib/classes.nib b/indra/mac_crash_logger/CrashReporter.nib/classes.nib
new file mode 100644
index 0000000000..c4b887e72b
--- /dev/null
+++ b/indra/mac_crash_logger/CrashReporter.nib/classes.nib
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBVersion</key>
+ <string>1</string>
+</dict>
+</plist>
diff --git a/indra/mac_crash_logger/CrashReporter.nib/info.nib b/indra/mac_crash_logger/CrashReporter.nib/info.nib
new file mode 100644
index 0000000000..b5417442d0
--- /dev/null
+++ b/indra/mac_crash_logger/CrashReporter.nib/info.nib
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBFramework Version</key>
+ <string>629</string>
+ <key>IBLastKnownRelativeProjectPath</key>
+ <string>../macview.xcodeproj</string>
+ <key>IBOldestOS</key>
+ <integer>5</integer>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>193</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>9B18</string>
+ <key>targetFramework</key>
+ <string>IBCarbonFramework</string>
+</dict>
+</plist>
diff --git a/indra/mac_crash_logger/CrashReporter.nib/objects.xib b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
new file mode 100644
index 0000000000..1099f561e7
--- /dev/null
+++ b/indra/mac_crash_logger/CrashReporter.nib/objects.xib
@@ -0,0 +1,69 @@
+<?xml version="1.0" standalone="yes"?>
+<object class="NSIBObjectData">
+ <object name="rootObject" class="NSCustomObject" id="1">
+ </object>
+ <array count="7" name="allObjects">
+ <object class="IBCarbonStaticText" id="181">
+ <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string>
+ <string name="bounds">20 20 231 487 </string>
+ </object>
+ <object class="IBCarbonButton" id="183">
+ <ostype name="command">not!</ostype>
+ <int name="buttonType">2</int>
+ <string name="title">Don&apos;t Send</string>
+ <string name="bounds">414 390 434 487 </string>
+ </object>
+ <object class="IBCarbonRootControl" id="167">
+ <array count="5" name="subviews">
+ <reference idRef="181"/>
+ <object class="IBCarbonButton" id="182">
+ <ostype name="command">ok </ostype>
+ <string name="title">Send Report</string>
+ <string name="bounds">414 273 434 378 </string>
+ </object>
+ <reference idRef="183"/>
+ <object class="IBCarbonEditText" id="185">
+ <ostype name="controlSignature">text</ostype>
+ <boolean name="isUnicode">TRUE</boolean>
+ <string name="bounds">242 23 391 484 </string>
+ </object>
+ <object class="IBCarbonCheckBox" id="193">
+ <ostype name="controlSignature">remb</ostype>
+ <int name="initialState">1</int>
+ <string name="title">Remember This Choice</string>
+ <string name="bounds">415 20 433 186 </string>
+ </object>
+ </array>
+ <string name="bounds">0 0 454 507 </string>
+ </object>
+ <object class="IBCarbonWindow" id="166">
+ <int name="carbonWindowClass">2</int>
+ <int name="themeBrush">3</int>
+ <int name="windowPosition">7</int>
+ <string name="title">Second Life Crash Logger</string>
+ <reference name="rootControl" idRef="167"/>
+ <string name="windowRect">257 653 711 1160 </string>
+ <string name="ScreenRectAtEncodeTime">0 0 768 1024 </string>
+ </object>
+ <reference idRef="193"/>
+ <reference idRef="185"/>
+ <reference idRef="182"/>
+ </array>
+ <array count="7" name="allParents">
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="166"/>
+ <reference idRef="1"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ <reference idRef="167"/>
+ </array>
+ <dictionary count="2" name="nameTable">
+ <string>CrashReporter</string>
+ <reference idRef="166"/>
+ <string>File&apos;s Owner</string>
+ <reference idRef="1"/>
+ </dictionary>
+ <string name="targetFramework">IBCarbonFramework</string>
+ <unsigned_int name="nextObjectID">194</unsigned_int>
+</object>
diff --git a/indra/mac_crash_logger/Info.plist b/indra/mac_crash_logger/Info.plist
new file mode 100644
index 0000000000..f48293e825
--- /dev/null
+++ b/indra/mac_crash_logger/Info.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>mac-crash-logger</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.secondlife.indra.crashreporter</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string></string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0.0</string>
+</dict>
+</plist>
diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt
index 39aa4d2b15..3ac5aeebd5 100644
--- a/indra/mac_updater/CMakeLists.txt
+++ b/indra/mac_updater/CMakeLists.txt
@@ -40,10 +40,43 @@ set_source_files_properties(${mac_updater_HEADER_FILES}
list(APPEND mac_updater_SOURCE_FILES ${mac_updater_HEADER_FILES})
-add_executable(mac-updater ${mac_updater_SOURCE_FILES})
+
+set(mac_updater_RESOURCE_FILES
+ Info.plist
+ AutoUpdater.nib/
+ )
+set_source_files_properties(
+ ${mac_updater_RESOURCE_FILES}
+ PROPERTIES
+ HEADER_FILE_ONLY TRUE
+ )
+set_source_files_properties(
+ Info.plist
+ PROPERTIES
+ MACOSX_PACKAGE_LOCATION . # will it blend? + poppy
+ )
+SOURCE_GROUP("Resources" FILES ${mac_updater_RESOURCE_FILES})
+list(APPEND mac_updater_SOURCE_FILES ${mac_updater_RESOURCE_FILES})
+
+
+add_executable(mac-updater
+ MACOSX_BUNDLE
+ ${mac_updater_SOURCE_FILES})
target_link_libraries(mac-updater
${LLVFS_LIBRARIES}
${CURL_LIBRARIES}
${LLCOMMON_LIBRARIES}
)
+
+add_custom_command(
+ TARGET mac-updater POST_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_directory
+ ${CMAKE_CURRENT_SOURCE_DIR}/AutoUpdater.nib
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-updater.app/Contents/Resources/AutoUpdater.nib
+ )
+
+
diff --git a/indra/mac_updater/Info.plist b/indra/mac_updater/Info.plist
new file mode 100644
index 0000000000..bb27fddb03
--- /dev/null
+++ b/indra/mac_updater/Info.plist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>mac-updater</string>
+ <key>CFBundleGetInfoString</key>
+ <string></string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.secondlife.indra.autoupdater</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string></string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0.0</string>
+</dict>
+</plist>
diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp
index 800521e572..4531e5ac18 100644
--- a/indra/mac_updater/mac_updater.cpp
+++ b/indra/mac_updater/mac_updater.cpp
@@ -50,6 +50,8 @@
#include "MoreFilesX.h"
#include "FSCopyObject.h"
+#include "llerrorcontrol.h"
+
enum
{
kEventClassCustom = 'Cust',
@@ -345,6 +347,16 @@ int main(int argc, char **argv)
// We assume that all the logs we're looking for reside on the current drive
gDirUtilp->initAppDirs("SecondLife");
+ LLError::initForApplication( gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+
+ // Rename current log file to ".old"
+ std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "updater.log.old");
+ std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "updater.log");
+ LLFile::rename(log_file.c_str(), old_log_file.c_str());
+
+ // Set the log file to updater.log
+ LLError::logToFile(log_file);
+
/////////////////////////////////////////
//
// Process command line arguments
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0fea3076c3..699d13ea9b 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -159,6 +159,7 @@ set(viewer_SOURCE_FILES
llfloaterlandholdings.cpp
llfloaterlandmark.cpp
llfloatermap.cpp
+ llfloatermemleak.cpp
llfloatermute.cpp
llfloaternamedesc.cpp
llfloaternewim.cpp
@@ -549,6 +550,7 @@ set(viewer_HEADER_FILES
llfloaterlandholdings.h
llfloaterlandmark.h
llfloatermap.h
+ llfloatermemleak.h
llfloatermute.h
llfloaternamedesc.h
llfloaternewim.h
@@ -1312,10 +1314,21 @@ if (WINDOWS)
-E
copy_if_different
${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg
- ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/message_template.msg
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg
COMMENT "Copying message_template.msg to the runtime folder."
)
+ add_custom_command(
+ TARGET secondlife-bin PRE_BUILD
+ COMMAND ${CMAKE_COMMAND}
+ ARGS
+ -E
+ copy_if_different
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml
+ COMMENT "Copying message.xml to the runtime folder."
+ )
+
add_dependencies(secondlife-bin copy_win_libs)
if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
@@ -1389,25 +1402,12 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
if (LINUX)
add_custom_command(
- OUTPUT secondlife-stripped-globalsyms
+ OUTPUT secondlife-stripped
COMMAND strip
- ARGS --strip-debug -o secondlife-stripped-globalsyms secondlife-bin
+ ARGS --strip-debug -o secondlife-stripped secondlife-bin
DEPENDS secondlife-bin
)
- add_custom_command(
- OUTPUT secondlife-stripped
- COMMAND objcopy
- ARGS
- --keep-global-symbols
- ${CMAKE_CURRENT_SOURCE_DIR}/linux_tools/exposed-symbols.txt
- secondlife-stripped-globalsyms
- secondlife-stripped
- DEPENDS
- secondlife-stripped-globalsyms
- ${CMAKE_CURRENT_SOURCE_DIR}/linux_tools/exposed-symbols.txt
- )
-
set(product SecondLife-${ARCH}-${viewer_VERSION})
add_custom_command(
@@ -1483,6 +1483,7 @@ if (DARWIN)
secondlife-bin
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
+ add_dependencies(package mac-updater mac-crash-logger)
endif (PACKAGE)
endif (DARWIN)
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4c47cb45b2..fd4f293d66 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -670,6 +670,17 @@
<key>Value</key>
<string>http://www.secondlife.com</string>
</map>
+ <key>BlockAvatarAppearanceMessages</key>
+ <map>
+ <key>Comment</key>
+ <string>Ignore's appearance messages (for simulating Ruth)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>BrowserProxyAddress</key>
<map>
<key>Comment</key>
@@ -888,7 +899,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>3</integer>
+ <integer>8</integer>
</map>
<key>ButtonFlashRate</key>
<map>
@@ -899,7 +910,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>2.0</real>
+ <real>1.25</real>
</map>
<key>ButtonHPad</key>
<map>
@@ -4944,17 +4955,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>NoQuickTime</key>
- <map>
- <key>Comment</key>
- <string>Disable quicktime playback.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>NoVerifySSLCert</key>
<map>
<key>Comment</key>
@@ -5701,6 +5701,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderAttachedLights</key>
+ <map>
+ <key>Comment</key>
+ <string>Render lighted prims that are attached to avatars</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderAttachedParticles</key>
+ <map>
+ <key>Comment</key>
+ <string>Render particle systems that are attached to avatars</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>RenderAvatarCloth</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 032d9bfdc3..0a1295874d 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -1,4 +1,4 @@
-version 16
+version 17
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -394,48 +394,20 @@ list ATI_Radeon_X1600
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_X1700
Disregard128DefaultDrawDistance 1 0
-
list ATI_Mobility_Radeon_X1xxx
Disregard128DefaultDrawDistance 1 0
-
-
-
-// Avatar hardware skinning causes
-// invisible avatars on x2600... so I masked
-// out other possible bad ones till it's fixed in 8.2
-
list ATI_Radeon_HD_2300
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_HD_2400
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2600
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_2900
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_3800
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-
list ATI_ASUS_AH24xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
Disregard128DefaultDrawDistance 1 0
-list ATI_ASUS_AH26xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_ASUS_EAH24xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_ASUS_EAH26xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_ASUS_EAH38xx
+
+
+// Avatar hardware skinning causes invisible avatars
+// on various ATI chipsets on drivers before 8.2
+
+list ATIOldDriver
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 88570e3e09..3eaa781206 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -1,4 +1,4 @@
-version 16
+version 17
// NOTE: This is mostly identical to featuretable_mac.txt with a few differences
// Should be combined into one table
@@ -45,6 +45,7 @@ RenderUseImpostors 1 1
RenderVBOEnable 1 1
RenderVolumeLODFactor 1 2.0
RenderWaterReflections 1 1
+UseStartScreen 1 1
UseOcclusion 1 1
VertexShaderEnable 1 1
WindLightUseAtmosShaders 1 1
@@ -241,25 +242,108 @@ RenderVBOEnable 1 0
list Intel
RenderAnisotropic 1 0
RenderLightingDetail 1 0
-RenderTerrainDetail 1 0
-RenderVBOEnable 1 0
+// Avoid some Intel crashes on Linux
RenderCubeMap 0 0
-
list GeForce2
RenderAnisotropic 1 0
RenderLightingDetail 1 0
RenderMaxPartCount 1 2048
RenderTerrainDetail 1 0
+RenderVBOEnable 1 1
-list Intel_965
+list SiS
UseOcclusion 0 0
-list ATI
+
+list Intel_830M
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_845G
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_855GM
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_865G
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_900
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_915GM
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_915G
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_945GM
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_945G
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_950
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_965
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
UseOcclusion 0 0
-WindLightUseAtmosShaders 0 0
+
+list Intel_G33
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_Bear_Lake
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_Broadwater
+RenderTerrainDetail 1 0
RenderVBOEnable 1 0
+list Intel_Brookdale
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_Montara
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+list Intel_Springdale
+RenderTerrainDetail 1 0
+RenderVBOEnable 1 0
+
+
+list ATI_FireGL_5200
+RenderVBOEnable 1 0
+WindLightUseAtmosShaders 0 0
+
+
+list ATI_Mobility_Radeon_7xxx
+RenderVBOEnable 0 0
+
+list ATI_Radeon_7xxx
+RenderVBOEnable 0 0
+
+list ATI_All-in-Wonder_Radeon
+RenderVBOEnable 0 0
+
+list ATI_All-in-Wonder_7500
+RenderVBOEnable 0 0
+
+
list ATI_Mobility_Radeon_9800
RenderAvatarCloth 0 0
VertexShaderEnable 0 0
@@ -302,58 +386,35 @@ list ATI_Radeon_X700
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_X1300
Disregard128DefaultDrawDistance 1 0
+UseStartScreen 0 0
list ATI_Radeon_X1400
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_X1500
Disregard128DefaultDrawDistance 1 0
+UseStartScreen 0 0
list ATI_Radeon_X1600
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_X1700
Disregard128DefaultDrawDistance 1 0
list ATI_Mobility_Radeon_X1xxx
Disregard128DefaultDrawDistance 1 0
-
-
-
-
-// Avatar hardware skinning causes
-// invisible avatars on HD 2400... so I masked
-// out other possible bad ones till it's fixed
-
list ATI_Radeon_HD_2300
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
Disregard128DefaultDrawDistance 1 0
list ATI_Radeon_HD_2400
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
Disregard128DefaultDrawDistance 1 0
-list ATI_Radeon_HD_2600
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_2900
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_Radeon_HD_3800
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-
list ATI_ASUS_AH24xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
Disregard128DefaultDrawDistance 1 0
-list ATI_ASUS_AH26xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_ASUS_EAH24xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_ASUS_EAH26xx
-RenderAvatarVP 0 0
-RenderAvatarCloth 0 0
-list ATI_ASUS_EAH38xx
+
+
+// Avatar hardware skinning causes invisible avatars
+// on various ATI chipsets on drivers before 8.2
+
+list ATIOldDriver
RenderAvatarVP 0 0
RenderAvatarCloth 0 0
+// Avoid driver crashes with some features on Linux with old ATI drivers
+UseOcclusion 0 0
+WindLightUseAtmosShaders 0 0
/// Tweaked NVIDIA
@@ -387,6 +448,8 @@ Disregard128DefaultDrawDistance 1 0
list NVIDIA_GeForce_6600
Disregard128DefaultDrawDistance 1 0
+list NVIDIA_G73
+Disregard128DefaultDrawDistance 1 0
list NVIDIA_GeForce_Go_6100
RenderVBOEnable 1 0
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index cffd4410c3..edf8967f46 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -126,11 +126,8 @@
#include "roles_constants.h"
#include "llviewercontrol.h"
#include "llappviewer.h"
-#include "llvoiceclient.h"
-
-// Ventrella
+#include "llviewerjoystick.h"
#include "llfollowcam.h"
-// end Ventrella
extern LLMenuBarGL* gMenuBarView;
@@ -176,7 +173,7 @@ const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f;
const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f;
-const F32 MAX_CAMERA_SMOOTH_DISTANCE = 20.0f;
+const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f;
const F32 HEAD_BUFFER_SIZE = 0.3f;
const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f;
@@ -1952,6 +1949,11 @@ void LLAgent::cameraPanLeft(F32 meters)
mFocusTargetGlobal += meters * left_axis;
mFocusGlobal = mFocusTargetGlobal;
+
+ // effectively disable smoothing for camera pan, which causes some residents unhappiness
+ mCameraSmoothingLastPositionGlobal += meters * left_axis;
+ mCameraSmoothingLastPositionAgent += meters * left_axis;
+
cameraZoomIn(1.f);
updateFocusOffset();
}
@@ -1966,6 +1968,11 @@ void LLAgent::cameraPanUp(F32 meters)
mFocusTargetGlobal += meters * up_axis;
mFocusGlobal = mFocusTargetGlobal;
+
+ // effectively disable smoothing for camera pan, which causes some residents unhappiness
+ mCameraSmoothingLastPositionGlobal += meters * up_axis;
+ mCameraSmoothingLastPositionAgent += meters * up_axis;
+
cameraZoomIn(1.f);
updateFocusOffset();
}
@@ -3226,9 +3233,9 @@ void LLAgent::updateCamera()
if (cameraThirdPerson()) // only smooth in third person mode
{
- F32 smoothing = llclampf(1.f - pow(2.f, -4.f * gSavedSettings.getF32("CameraPositionSmoothing") / gFPSClamped));
- // we use average FPS instead of LLCriticalDamp b/c exact frame time is jittery
-
+ const F32 SMOOTHING_HALF_LIFE = 0.02f;
+
+ F32 smoothing = LLCriticalDamp::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, FALSE);
if (!mFocusObject) // we differentiate on avatar mode
{
@@ -3238,7 +3245,7 @@ void LLAgent::updateCamera()
LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent;
if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
{
- camera_pos_agent = lerp(camera_pos_agent, mCameraSmoothingLastPositionAgent, smoothing);
+ camera_pos_agent = lerp(mCameraSmoothingLastPositionAgent, camera_pos_agent, smoothing);
camera_pos_global = camera_pos_agent + agent_pos;
}
}
@@ -3247,7 +3254,7 @@ void LLAgent::updateCamera()
LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal;
if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
{
- camera_pos_global = lerp(camera_pos_global, mCameraSmoothingLastPositionGlobal, smoothing);
+ camera_pos_global = lerp(mCameraSmoothingLastPositionGlobal, camera_pos_global, smoothing);
}
}
}
@@ -3291,19 +3298,6 @@ void LLAgent::updateCamera()
setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent);
}
- // Send the camera position to the spatialized voice system.
- if(gVoiceClient && getRegion())
- {
- LLMatrix3 rot;
- rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis());
-
- // MBW -- XXX -- Setting velocity to 0 for now. May figure it out later...
- gVoiceClient->setCameraPosition(
- getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin()),// position
- LLVector3::zero, // velocity
- rot); // rotation matrix
- }
-
// update the travel distance stat
// this isn't directly related to the camera
// but this seemed like the best place to do this
@@ -3506,20 +3500,24 @@ LLVector3d LLAgent::calcFocusPositionTargetGlobal()
}
else
{
- // ...offset from avatar
- LLVector3d focus_offset;
- focus_offset.setVec(gSavedSettings.getVector3("FocusOffsetDefault"));
-
- LLQuaternion agent_rot = mFrameAgent.getQuaternion();
- if (!mAvatarObject.isNull() && mAvatarObject->getParent())
- {
- agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation();
- }
+ return getPositionGlobal() + calcThirdPersonFocusOffset();
+ }
+}
- focus_offset = focus_offset * agent_rot;
+LLVector3d LLAgent::calcThirdPersonFocusOffset()
+{
+ // ...offset from avatar
+ LLVector3d focus_offset;
+ focus_offset.setVec(gSavedSettings.getVector3("FocusOffsetDefault"));
- return getPositionGlobal() + focus_offset;
+ LLQuaternion agent_rot = mFrameAgent.getQuaternion();
+ if (!mAvatarObject.isNull() && mAvatarObject->getParent())
+ {
+ agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation();
}
+
+ focus_offset = focus_offset * agent_rot;
+ return focus_offset;
}
void LLAgent::setupSitCamera()
@@ -3947,6 +3945,11 @@ void LLAgent::resetCamera()
//-----------------------------------------------------------------------------
void LLAgent::changeCameraToMouselook(BOOL animate)
{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
// visibility changes at end of animation
gViewerWindow->getWindow()->resetBusyCount();
@@ -3973,7 +3976,7 @@ void LLAgent::changeCameraToMouselook(BOOL animate)
if( mCameraMode != CAMERA_MODE_MOUSELOOK )
{
- gViewerWindow->setKeyboardFocus( NULL );
+ gFocusMgr.setKeyboardFocus( NULL );
mLastCameraMode = mCameraMode;
mCameraMode = CAMERA_MODE_MOUSELOOK;
@@ -4002,6 +4005,11 @@ void LLAgent::changeCameraToMouselook(BOOL animate)
//-----------------------------------------------------------------------------
void LLAgent::changeCameraToDefault()
{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
if (LLFollowCamMgr::getActiveFollowCamParams())
{
changeCameraToFollow();
@@ -4019,6 +4027,11 @@ void LLAgent::changeCameraToDefault()
//-----------------------------------------------------------------------------
void LLAgent::changeCameraToFollow(BOOL animate)
{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
if( mCameraMode != CAMERA_MODE_FOLLOW )
{
if (mCameraMode == CAMERA_MODE_MOUSELOOK)
@@ -4077,7 +4090,10 @@ void LLAgent::changeCameraToFollow(BOOL animate)
//-----------------------------------------------------------------------------
void LLAgent::changeCameraToThirdPerson(BOOL animate)
{
-//printf( "changeCameraToThirdPerson\n" );
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
gViewerWindow->getWindow()->resetBusyCount();
@@ -4159,6 +4175,11 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate)
//-----------------------------------------------------------------------------
void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate)
{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
setControlFlags(AGENT_CONTROL_STAND_UP); // force stand up
gViewerWindow->getWindow()->resetBusyCount();
@@ -4194,8 +4215,8 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani
mbFlagsDirty = TRUE;
}
- gViewerWindow->setKeyboardFocus( NULL );
- gViewerWindow->setMouseCapture( NULL );
+ gFocusMgr.setKeyboardFocus( NULL );
+ gFocusMgr.setMouseCapture( NULL );
LLVOAvatar::onCustomizeStart();
}
@@ -4475,7 +4496,7 @@ void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
//RN: when focused on the avatar, we're not "looking" at it
// looking implies intent while focusing on avatar means
// you're just walking around with a camera on you...eesh.
- if (focus_on_avatar && !mFocusOnAvatar)
+ if (!mFocusOnAvatar && focus_on_avatar)
{
setFocusGlobal(LLVector3d::zero);
mCameraFOVZoomFactor = 0.f;
@@ -4499,6 +4520,12 @@ void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
}
}
}
+ // unlocking camera from avatar
+ else if (mFocusOnAvatar && !focus_on_avatar)
+ {
+ // keep camera focus point consistent, even though it is now unlocked
+ setFocusGlobal(getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID());
+ }
mFocusOnAvatar = focus_on_avatar;
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index ea9138fdd1..db7fafbba8 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -151,7 +151,9 @@ public:
void sendReliableMessage();
LLVector3d calcCameraPositionTargetGlobal(BOOL *hit_limit = NULL); // Calculate the camera position target
- LLVector3d calcFocusPositionTargetGlobal(); // target for this mode
+ LLVector3d calcFocusPositionTargetGlobal();
+ LLVector3d calcThirdPersonFocusOffset();
+ // target for this mode
LLVector3d getCameraPositionGlobal() const;
const LLVector3 &getCameraPositionAgent() const;
F32 calcCameraFOVZoomFactor();
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 76d5bcec34..211182f2b5 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -115,6 +115,7 @@
#include "llcontainerview.h"
#include "llfloaterstats.h"
#include "llhoverview.h"
+#include "llfloatermemleak.h"
#include "llsdserialize.h"
@@ -550,7 +551,8 @@ LLAppViewer::LLAppViewer() :
mQuitRequested(false),
mLogoutRequestSent(false),
mYieldTime(-1),
- mMainloopTimeout(NULL)
+ mMainloopTimeout(NULL),
+ mAgentRegionLastAlive(false)
{
if(NULL != sInstance)
{
@@ -616,9 +618,11 @@ bool LLAppViewer::init()
// *FIX: The following code isn't grouped into functions yet.
//
- // Various introspection concerning the libs we're using.
+ // Various introspection concerning the libs we're using - particularly
+ // the libs involved in getting to a full login screen.
//
- LL_DEBUGS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;
+ LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL;
+ LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL;
// Get the single value from the crash settings file, if it exists
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
@@ -899,7 +903,13 @@ bool LLAppViewer::mainLoop()
{
debugTime.reset();
}
+
#endif
+ //memory leaking simulation
+ if(LLFloaterMemLeak::getInstance())
+ {
+ LLFloaterMemLeak::getInstance()->idle() ;
+ }
if (!LLApp::isExiting())
{
@@ -1056,6 +1066,12 @@ bool LLAppViewer::mainLoop()
catch(std::bad_alloc)
{
llwarns << "Bad memory allocation in LLAppViewer::mainLoop()!" << llendl ;
+
+ //stop memory leaking simulation
+ if(LLFloaterMemLeak::getInstance())
+ {
+ LLFloaterMemLeak::getInstance()->stop() ;
+ }
}
}
@@ -1069,6 +1085,12 @@ bool LLAppViewer::mainLoop()
catch(std::bad_alloc)
{
llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ;
+
+ //stop memory leaking simulation
+ if(LLFloaterMemLeak::getInstance())
+ {
+ LLFloaterMemLeak::getInstance()->stop() ;
+ }
}
}
@@ -1244,6 +1266,7 @@ bool LLAppViewer::cleanup()
// Shut down the VFS's AFTER the decode manager cleans up (since it cleans up vfiles).
// Also after viewerwindow is deleted, since it may have image pointers (which have vfiles)
// Also after shutting down the messaging system since it has VFS dependencies
+
//
LLVFile::cleanupClass();
llinfos << "VFS cleaned up" << llendflush;
@@ -1951,7 +1974,7 @@ bool LLAppViewer::initConfiguration()
_spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
#elif LL_DARWIN
std::string command_str;
- command_str = "crashreporter.app/Contents/MacOS/crashreporter ";
+ command_str = "mac-crash-logger.app/Contents/MacOS/mac-crash-logger ";
command_str += "-previous";
// XXX -- We need to exit fullscreen mode for this to work.
// XXX -- system() also doesn't wait for completion. Hmm...
@@ -2590,6 +2613,38 @@ bool LLAppViewer::initCache()
}
}
+ // Delete old cache directory
+#ifdef LL_DARWIN
+ if (LL_VERSION_MAJOR >= 1 && LL_VERSION_MINOR >= 21)
+ {
+ if (gLastRunVersion != gCurrentVersion)
+ {
+ // NOTE: (Nyx) as of 1.21, cache for mac is moving to /library/caches/SecondLife from
+ // /library/application support/SecondLife/cache This should clear/delete the old dir.
+ std::string cache_dir = gDirUtilp->getOSUserAppDir();
+ std::string new_cache_dir = gDirUtilp->getOSCacheDir();
+ cache_dir = cache_dir + "/cache";
+ new_cache_dir = new_cache_dir + "/" + gSecondLife;
+ if (gDirUtilp->fileExists(cache_dir))
+ {
+ gDirUtilp->setCacheDir(cache_dir);
+ purgeCache();
+ gDirUtilp->setCacheDir(new_cache_dir);
+
+ std::string ds_store = cache_dir + "/.DS_Store";
+ if (gDirUtilp->fileExists(ds_store.c_str()))
+ {
+ LLFile::remove(ds_store.c_str());
+ }
+ if (LLFile::remove(cache_dir.c_str()) != 0)
+ {
+ llwarns << "could not delete old cache directory" << llendl;
+ }
+ }
+ }
+ }
+#endif
+
// Setup and verify the cache location
std::string cache_location = gSavedSettings.getString("CacheLocation");
std::string new_cache_location = gSavedSettings.getString("NewCacheLocation");
@@ -3528,6 +3583,23 @@ void LLAppViewer::idleNetwork()
gAssetStorage->checkForTimeouts();
gViewerThrottle.updateDynamicThrottle();
+
+
+ // Check that the circuit between the viewer and the agent's current
+ // region is still alive
+ LLViewerRegion *agent_region = gAgent.getRegion();
+ if (agent_region)
+ {
+ LLUUID this_region_id = agent_region->getRegionID();
+ bool this_region_alive = agent_region->isAlive();
+ if ((mAgentRegionLastAlive && !this_region_alive) // newly dead
+ && (mAgentRegionLastID == this_region_id)) // same region
+ {
+ forceDisconnect(LLTrans::getString("AgentLostConnection"));
+ }
+ mAgentRegionLastID = this_region_id;
+ mAgentRegionLastAlive = this_region_alive;
+ }
}
void LLAppViewer::disconnectViewer()
@@ -3678,4 +3750,3 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
}
}
-
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 66c4024c41..758b9cc3b4 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -206,6 +206,10 @@ private:
LLSD mSettingsFileList;
LLWatchdogTimeout* mMainloopTimeout;
+
+ // for tracking viewer<->region circuit death
+ bool mAgentRegionLastAlive;
+ LLUUID mAgentRegionLastID;
};
// consts from viewer.h
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 980ccd81fd..a40ee702c6 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -448,14 +448,18 @@ bool LLAppViewerLinux::initParseCommandLine(LLCommandLineParser& clp)
{
if (success >= 2 && locale->lang) // confident!
{
+ LL_INFOS("AppInit") << "Language " << ll_safe_string(locale->lang) << LL_ENDL;
+ LL_INFOS("AppInit") << "Location " << ll_safe_string(locale->country) << LL_ENDL;
+ LL_INFOS("AppInit") << "Variant " << ll_safe_string(locale->variant) << LL_ENDL;
+
LLControlVariable* c = gSavedSettings.getControl("SystemLanguage");
if(c)
{
c->setValue(std::string(locale->lang), false);
}
}
- FL_FreeLocale(&locale);
}
+ FL_FreeLocale(&locale);
return true;
}
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index a6d93e5652..4d0b96ba73 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -202,7 +202,7 @@ void LLAppViewerMacOSX::handleCrashReporting()
{
// Macintosh
std::string command_str;
- command_str += "open crashreporter.app";
+ command_str += "open mac-crash-logger.app";
clear_signals();
llinfos << "Launching crash reporter using: '" << command_str << "'" << llendl;
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index b88bcb758b..1d8f6a218c 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -395,14 +395,17 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp)
{
if (success >= 2 && locale->lang) // confident!
{
+ LL_INFOS("AppInit") << "Language: " << ll_safe_string(locale->lang) << LL_ENDL;
+ LL_INFOS("AppInit") << "Location: " << ll_safe_string(locale->country) << LL_ENDL;
+ LL_INFOS("AppInit") << "Variant: " << ll_safe_string(locale->variant) << LL_ENDL;
LLControlVariable* c = gSavedSettings.getControl("SystemLanguage");
if(c)
{
c->setValue(std::string(locale->lang), false);
}
}
- FL_FreeLocale(&locale);
}
+ FL_FreeLocale(&locale);
return true;
}
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index b8166a98f6..57f65fed38 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -172,7 +172,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 );
+ gFocusMgr.setMouseCapture( this );
return TRUE;
}
@@ -184,7 +184,7 @@ BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
if( hasMouseCapture() )
{
// Release the mouse
- gViewerWindow->setMouseCapture( NULL );
+ gFocusMgr.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 6f5dc1d3e7..b207c44e95 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -384,9 +384,14 @@ void LLDrawable::makeActive()
gPipeline.setActive(this, TRUE);
//all child objects must also be active
- for (U32 i = 0; i < getChildCount(); i++)
+ llassert_always(mVObjp);
+
+ LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLDrawable* drawable = getChild(i);
+ LLViewerObject* child = *iter;
+ LLDrawable* drawable = child->mDrawable;
if (drawable)
{
drawable->makeActive();
@@ -430,11 +435,13 @@ void LLDrawable::makeStatic(BOOL warning_enabled)
{
LL_WARNS_ONCE("Drawable") << "Drawable becomes static with active parent!" << LL_ENDL;
}
-
- S32 child_count = mVObjp->mChildList.size();
- for (S32 child_num = 0; child_num < child_count; child_num++)
+
+ LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLDrawable* child_drawable = mVObjp->mChildList[child_num]->mDrawable;
+ LLViewerObject* child = *iter;
+ LLDrawable* child_drawable = child->mDrawable;
if (child_drawable)
{
if (child_drawable->getParent() != this)
@@ -1179,11 +1186,23 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*
av = objparent->mDrawable;
LLSpatialGroup* group = av->getSpatialGroup();
- BOOL impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor();
- BOOL loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded();
-
+ BOOL impostor = FALSE;
+ BOOL loaded = FALSE;
+ if (objparent->isAvatar())
+ {
+ LLVOAvatar* avatarp = (LLVOAvatar*) objparent;
+ if (avatarp->isVisible())
+ {
+ impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor();
+ loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded();
+ }
+ else
+ {
+ return;
+ }
+ }
+
if (!group ||
- av->getSpatialGroup()->mDistance > LLVOAvatar::sRenderDistance ||
LLDrawable::getCurrentFrame() - av->mVisible > 1 ||
impostor ||
!loaded)
@@ -1214,9 +1233,16 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*
if (for_select)
{
results->push_back(mDrawable);
- for (U32 i = 0; i < mDrawable->getChildCount(); i++)
+ if (mDrawable->getVObj())
{
- results->push_back(mDrawable->getChild(i));
+ LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
+ {
+ LLViewerObject* child = *iter;
+ LLDrawable* drawable = child->mDrawable;
+ results->push_back(drawable);
+ }
}
}
else
@@ -1240,18 +1266,24 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in)
mDrawable->updateDistance(camera);
- for (U32 i = 0; i < mDrawable->getChildCount(); ++i)
+ if (mDrawable->getVObj())
{
- LLDrawable* child = mDrawable->getChild(i);
- if (!child)
+ LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- llwarns << "Corrupt drawable found while updating spatial bridge distance." << llendl;
- continue;
- }
+ LLViewerObject* child = *iter;
+ LLDrawable* drawable = child->mDrawable;
+ if (!drawable)
+ {
+ llwarns << "Corrupt drawable found while updating spatial bridge distance." << llendl;
+ continue;
+ }
- if (!child->isAvatar())
- {
- child->updateDistance(camera);
+ if (!drawable->isAvatar())
+ {
+ drawable->updateDistance(camera);
+ }
}
}
}
@@ -1287,12 +1319,18 @@ void LLSpatialBridge::cleanupReferences()
if (mDrawable)
{
mDrawable->setSpatialGroup(NULL);
- for (U32 i = 0; i < mDrawable->getChildCount(); i++)
+ if (mDrawable->getVObj())
{
- LLDrawable* drawable = mDrawable->getChild(i);
- if (drawable)
+ LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- drawable->setSpatialGroup(NULL);
+ LLViewerObject* child = *iter;
+ LLDrawable* drawable = child->mDrawable;
+ if (drawable)
+ {
+ drawable->setSpatialGroup(NULL);
+ }
}
}
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index d6f77f2ab4..238c956cb7 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -116,8 +116,6 @@ public:
virtual BOOL isSpatialBridge() const { return FALSE; }
virtual LLSpatialPartition* asPartition() { return NULL; }
LLDrawable* getParent() const { return mParent; }
- LLDrawable* getChild(U32 index) { return mVObjp->mChildList[index]->mDrawable; }
- U32 getChildCount() { return mVObjp ? mVObjp->mChildList.size() : 0; }
// must set parent through LLViewerObject:: ()
//BOOL setParent(LLDrawable *parent);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 6d81edd7ca..e068d90caf 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -104,8 +104,7 @@ BOOL gRenderAvatar = TRUE;
S32 LLDrawPoolAvatar::getVertexShaderLevel() const
{
- return sShaderLevel;
- //return (S32) LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
+ return (S32) LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
}
void LLDrawPoolAvatar::prerender()
@@ -586,6 +585,7 @@ void LLDrawPoolAvatar::renderForSelect()
return;
}
+ S32 curr_shader_level = getVertexShaderLevel();
S32 name = avatarp->mDrawable->getVObj()->mGLName;
LLColor4U color((U8)(name >> 16), (U8)(name >> 8), (U8)name);
@@ -602,7 +602,7 @@ void LLDrawPoolAvatar::renderForSelect()
}
sVertexProgram = &gAvatarPickProgram;
- if (sShaderLevel > 0)
+ if (curr_shader_level > 0)
{
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
}
@@ -611,7 +611,7 @@ void LLDrawPoolAvatar::renderForSelect()
glColor4ubv(color.mV);
- if (sShaderLevel > 0) // for hardware blending
+ if (curr_shader_level > 0) // for hardware blending
{
sRenderingSkinned = TRUE;
sVertexProgram->bind();
@@ -621,7 +621,7 @@ void LLDrawPoolAvatar::renderForSelect()
avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
- if (sShaderLevel > 0)
+ if (curr_shader_level > 0)
{
sRenderingSkinned = FALSE;
sVertexProgram->unbind();
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 11391ee6fb..2f25c757cb 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -851,7 +851,7 @@ LLImageGL* LLBumpImageList::getBrightnessDarknessImage(LLViewerImage* src_image,
bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
// Note: this may create an LLImageGL immediately
- src_image->setLoadedCallback( callback_func, 0, TRUE, new LLUUID(src_image->getID()) );
+ src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()) );
bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image
// bump_total++;
diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp
index ea3999f93f..9f22d2aa0f 100644
--- a/indra/newview/lldrawpoolwlsky.cpp
+++ b/indra/newview/lldrawpoolwlsky.cpp
@@ -78,7 +78,8 @@ LLDrawPoolWLSky::LLDrawPoolWLSky(void) :
LLDrawPoolWLSky::~LLDrawPoolWLSky()
{
//llinfos << "destructing wlsky draw pool." << llendl;
- sCloudNoiseTexture = 0;
+ sCloudNoiseTexture = NULL;
+ sCloudNoiseRawImage = NULL;
}
LLViewerImage *LLDrawPoolWLSky::getDebugTexture()
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 73d8036122..ecc40aa094 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -587,6 +587,10 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("ATI");
}
+ if (gGLManager.mATIOldDriver)
+ {
+ maskFeatures("ATIOldDriver");
+ }
if (gGLManager.mIsGFFX)
{
maskFeatures("GeForceFX");
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 9746b06500..2fe1781a96 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -39,6 +39,9 @@
#include "llui.h" // for tr()
#include "v3dmath.h"
+#include "llcurl.h"
+#include "llimagej2c.h"
+
#include "llviewertexteditor.h"
#include "llviewercontrol.h"
#include "llagent.h"
@@ -113,7 +116,7 @@ LLFloaterAbout::LLFloaterAbout()
support.append("\n\n");
}
- //*NOTE: Do not translate text like GPU, Graphics Card, etc -
+ // *NOTE: Do not translate text like GPU, Graphics Card, etc -
// Most PC users that know what these mean will be used to the english versions,
// and this info sometimes gets sent to support
@@ -144,6 +147,16 @@ LLFloaterAbout::LLFloaterAbout()
support.append( (const char*) glGetString(GL_VERSION) );
support.append("\n");
+ support.append("\n");
+
+ support.append("libcurl Version: ");
+ support.append( LLCurl::getVersionString() );
+ support.append("\n");
+
+ support.append("J2C Decoder Version: ");
+ support.append( LLImageJ2C::getEngineInfo() );
+ support.append("\n");
+
LLMediaManager *mgr = LLMediaManager::getInstance();
if (mgr)
{
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 417ac0e868..2d595bc492 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -38,6 +38,7 @@
#include "lldir.h"
#include "llvfile.h"
#include "llapr.h"
+#include "llstring.h"
#include "llagent.h"
#include "llbbox.h"
@@ -48,6 +49,7 @@
#include "lldrawpoolavatar.h"
#include "llrender.h"
#include "llface.h"
+#include "llfocusmgr.h"
#include "llkeyframemotion.h"
#include "lllineeditor.h"
#include "llsliderctrl.h"
@@ -451,7 +453,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
if (mPreviewRect.pointInRect(x, y))
{
bringToFront( x, y );
- gViewerWindow->setMouseCapture(this);
+ gFocusMgr.setMouseCapture(this);
gViewerWindow->hideCursor();
mLastMouseX = x;
mLastMouseY = y;
@@ -466,7 +468,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
//-----------------------------------------------------------------------------
BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask)
{
- gViewerWindow->setMouseCapture(FALSE);
+ gFocusMgr.setMouseCapture(FALSE);
gViewerWindow->showCursor();
return LLFloater::handleMouseUp(x, y, mask);
}
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index d02fd072e2..4218c4c65a 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -913,7 +913,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask )
if ( rgbAreaRect.pointInRect ( x, y ) )
{
- gViewerWindow->setMouseCapture(this);
+ gFocusMgr.setMouseCapture(this);
// mouse button down
setMouseDownInHueRegion ( TRUE );
@@ -932,7 +932,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask )
if ( lumAreaRect.pointInRect ( x, y ) )
{
- gViewerWindow->setMouseCapture(this);
+ gFocusMgr.setMouseCapture(this);
// mouse button down
setMouseDownInLumRegion ( TRUE );
@@ -1148,7 +1148,7 @@ handleMouseUp ( S32 x, S32 y, MASK mask )
if (hasMouseCapture())
{
- gViewerWindow->setMouseCapture(NULL);
+ gFocusMgr.setMouseCapture(NULL);
}
// dispatch to base class for the rest of things
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index 55d9aeead9..46727c3698 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -44,7 +44,6 @@
#include "llfloateravatarpicker.h"
#include "llviewerwindow.h"
#include "llbutton.h"
-#include "llcallingcard.h"
#include "llfloateravatarinfo.h"
#include "llinventorymodel.h"
#include "llnamelistctrl.h"
@@ -143,7 +142,7 @@ void LLPanelFriends::updateFriends(U32 changed_mask)
LLDynamicArray<LLUUID> selected_friends = getSelectedIDs();
if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE))
{
- refreshNames();
+ refreshNames(changed_mask);
}
else if(changed_mask & LLFriendObserver::POWERS)
{
@@ -185,7 +184,8 @@ BOOL LLPanelFriends::postBuild()
childSetCommitCallback("friend_list", onSelectName, this);
childSetDoubleClickCallback("friend_list", onClickIM);
- refreshNames();
+ U32 changed_mask = LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE;
+ refreshNames(changed_mask);
childSetAction("im_btn", onClickIM, this);
childSetAction("profile_btn", onClickProfile, this);
@@ -206,7 +206,6 @@ BOOL LLPanelFriends::postBuild()
return TRUE;
}
-
BOOL LLPanelFriends::addFriend(const LLUUID& agent_id)
{
LLAvatarTracker& at = LLAvatarTracker::instance();
@@ -264,7 +263,8 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id)
return have_name;
}
-// propagate actual relationship to UI
+// propagate actual relationship to UI.
+// Does not resort the UI list because it can be called frequently. JC
BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationship* info)
{
if (!info) return FALSE;
@@ -287,9 +287,7 @@ BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationsh
// enable this item, in case it was disabled after user input
itemp->setEnabled(TRUE);
- // changed item in place, need to request sort
- mFriendsList->sortItems();
-
+ // Do not resort, this function can be called frequently.
return have_name;
}
@@ -359,7 +357,7 @@ struct SortFriendsByID
}
};
-void LLPanelFriends::refreshNames()
+void LLPanelFriends::refreshNames(U32 changed_mask)
{
LLDynamicArray<LLUUID> selected_ids = getSelectedIDs();
S32 pos = mFriendsList->getScrollPos();
@@ -367,27 +365,67 @@ void LLPanelFriends::refreshNames()
// get all buddies we know about
LLAvatarTracker::buddy_map_t all_buddies;
LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
- // get all friends in list and sort by UUID
+
+ BOOL have_names = TRUE;
+
+ if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE))
+ {
+ have_names &= refreshNamesSync(all_buddies);
+ }
+
+ if(changed_mask & LLFriendObserver::ONLINE)
+ {
+ have_names &= refreshNamesPresence(all_buddies);
+ }
+
+ if (!have_names)
+ {
+ mEventTimer.start();
+ }
+ // Changed item in place, need to request sort and update columns
+ // because we might have changed data in a column on which the user
+ // has already sorted. JC
+ mFriendsList->sortItems();
+
+ // re-select items
+ mFriendsList->selectMultiple(selected_ids);
+ mFriendsList->setScrollPos(pos);
+}
+
+BOOL LLPanelFriends::refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies)
+{
+ mFriendsList->deleteAllItems();
+
+ BOOL have_names = TRUE;
+ LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
+
+ for(; buddy_it != all_buddies.end(); ++buddy_it)
+ {
+ have_names &= addFriend(buddy_it->first);
+ }
+
+ return have_names;
+}
+
+BOOL LLPanelFriends::refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies)
+{
std::vector<LLScrollListItem*> items = mFriendsList->getAllData();
std::sort(items.begin(), items.end(), SortFriendsByID());
- std::vector<LLScrollListItem*>::iterator item_it = items.begin();
- std::vector<LLScrollListItem*>::iterator item_end = items.end();
-
+ LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
+ std::vector<LLScrollListItem*>::const_iterator item_it = items.begin();
BOOL have_names = TRUE;
- LLAvatarTracker::buddy_map_t::iterator buddy_it;
- for (buddy_it = all_buddies.begin() ; buddy_it != all_buddies.end(); ++buddy_it)
+
+ while(true)
{
- // erase any items that reflect residents who are no longer buddies
- while(item_it != item_end && buddy_it->first > (*item_it)->getValue().asUUID())
+ if(item_it == items.end() || buddy_it == all_buddies.end())
{
- mFriendsList->deleteItems((*item_it)->getValue());
- ++item_it;
+ break;
}
- // update existing friends with new info
- if (item_it != item_end && buddy_it->first == (*item_it)->getValue().asUUID())
+ const LLUUID & buddy_uuid = buddy_it->first;
+ const LLUUID & item_uuid = (*item_it)->getValue().asUUID();
+ if(item_uuid == buddy_uuid)
{
const LLRelationship* info = buddy_it->second;
if (!info)
@@ -402,27 +440,23 @@ void LLPanelFriends::refreshNames()
// update existing item in UI
have_names &= updateFriendItem(buddy_it->first, info);
}
+
+ ++buddy_it;
++item_it;
}
- // add new friend to list
- else
+ else if(item_uuid < buddy_uuid)
{
- have_names &= addFriend(buddy_it->first);
+ ++item_it;
+ }
+ else //if(item_uuid > buddy_uuid)
+ {
+ ++buddy_it;
}
}
- if (!have_names)
- {
- mEventTimer.start();
- }
- // changed item in place, need to request sort and update columns
- mFriendsList->sortItems();
- // re-select items
- mFriendsList->selectMultiple(selected_ids);
- mFriendsList->setScrollPos(pos);
+ return have_names;
}
-
void LLPanelFriends::refreshUI()
{
BOOL single_selected = FALSE;
@@ -732,6 +766,8 @@ void LLPanelFriends::modifyRightsConfirmation(S32 option, void* user_data)
{
const LLRelationship* info = LLAvatarTracker::instance().getBuddyInfo(rights_it->first);
panelp->updateFriendItem(rights_it->first, info);
+ // Might have changed the column the user is sorted on.
+ panelp->mFriendsList->sortItems();
}
}
panelp->refreshUI();
diff --git a/indra/newview/llfloaterfriends.h b/indra/newview/llfloaterfriends.h
index 211c6cf487..d934faa616 100644
--- a/indra/newview/llfloaterfriends.h
+++ b/indra/newview/llfloaterfriends.h
@@ -38,6 +38,7 @@
#include "llstring.h"
#include "lluuid.h"
#include "lltimer.h"
+#include "llcallingcard.h"
class LLFriendObserver;
class LLRelationship;
@@ -96,8 +97,9 @@ private:
// protected members
typedef std::map<LLUUID, S32> rights_map_t;
- void reloadNames();
- void refreshNames();
+ void refreshNames(U32 changed_mask);
+ BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies);
+ BOOL refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies);
void refreshUI();
void refreshRightsChangeList();
void applyRightsToFriends();
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 50b8b39bd0..32dcf3ae0a 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -45,6 +45,7 @@
#include "lldrawpoolavatar.h"
#include "llrender.h"
#include "llface.h"
+#include "llfocusmgr.h"
#include "lltextbox.h"
#include "lltoolmgr.h"
#include "llui.h"
@@ -54,6 +55,7 @@
#include "pipeline.h"
#include "lluictrlfactory.h"
#include "llviewerimagelist.h"
+#include "llstring.h"
//static
S32 LLFloaterImagePreview::sUploadAmount = 10;
@@ -426,7 +428,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask)
if (mPreviewRect.pointInRect(x, y))
{
bringToFront( x, y );
- gViewerWindow->setMouseCapture(this);
+ gFocusMgr.setMouseCapture(this);
gViewerWindow->hideCursor();
mLastMouseX = x;
mLastMouseY = y;
@@ -441,7 +443,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask)
//-----------------------------------------------------------------------------
BOOL LLFloaterImagePreview::handleMouseUp(S32 x, S32 y, MASK mask)
{
- gViewerWindow->setMouseCapture(FALSE);
+ gFocusMgr.setMouseCapture(FALSE);
gViewerWindow->showCursor();
return LLFloater::handleMouseUp(x, y, mask);
}
diff --git a/indra/newview/llfloatermemleak.cpp b/indra/newview/llfloatermemleak.cpp
new file mode 100644
index 0000000000..62401dbc96
--- /dev/null
+++ b/indra/newview/llfloatermemleak.cpp
@@ -0,0 +1,265 @@
+/**
+ * @file llfloatermemleak.cpp
+ * @brief LLFloatermemleak class definition
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatermemleak.h"
+
+#include "lluictrlfactory.h"
+#include "llbutton.h"
+#include "llspinctrl.h"
+#include "llresmgr.h"
+
+#include "llmath.h"
+#include "llviewerwindow.h"
+
+LLFloaterMemLeak* LLFloaterMemLeak::sInstance = NULL;
+U32 LLFloaterMemLeak::sMemLeakingSpeed = 0 ; //bytes leaked per frame
+U32 LLFloaterMemLeak::sMaxLeakedMem = 0 ; //maximum allowed leaked memory
+U32 LLFloaterMemLeak::sTotalLeaked = 0 ;
+S32 LLFloaterMemLeak::sStatus = LLFloaterMemLeak::STOP ;
+BOOL LLFloaterMemLeak::sbAllocationFailed = FALSE ;
+
+LLFloaterMemLeak::LLFloaterMemLeak() : LLFloater("Memory Leaking Simulation Floater")
+{
+}
+
+LLFloaterMemLeak::~LLFloaterMemLeak()
+{
+ release() ;
+
+ sMemLeakingSpeed = 0 ; //bytes leaked per frame
+ sMaxLeakedMem = 0 ; //maximum allowed leaked memory
+ sInstance = NULL ;
+}
+
+void LLFloaterMemLeak::release()
+{
+ for(S32 i = 0 ; i < (S32)mLeakedMem.size() ; i++)
+ {
+ delete[] mLeakedMem[i] ;
+ }
+ mLeakedMem.clear() ;
+
+ sStatus = STOP ;
+ sTotalLeaked = 0 ;
+ sbAllocationFailed = FALSE ;
+}
+
+void LLFloaterMemLeak::stop()
+{
+ sStatus = STOP ;
+ sbAllocationFailed = TRUE ;
+}
+
+void LLFloaterMemLeak::idle()
+{
+ if(STOP == sStatus)
+ {
+ return ;
+ }
+
+ sbAllocationFailed = FALSE ;
+
+ if(RELEASE == sStatus)
+ {
+ release() ;
+ return ;
+ }
+
+ char* p = NULL ;
+ if(sMemLeakingSpeed > 0 && sTotalLeaked < sMaxLeakedMem)
+ {
+ p = new char[sMemLeakingSpeed] ;
+
+ if(p)
+ {
+ mLeakedMem.push_back(p) ;
+ sTotalLeaked += sMemLeakingSpeed ;
+ }
+ }
+ if(!p)
+ {
+ sStatus = STOP ;
+ sbAllocationFailed = TRUE ;
+ }
+}
+
+//----------------------
+void LLFloaterMemLeak::onChangeLeakingSpeed(LLUICtrl* ctrl, void* userData)
+{
+ LLFloaterMemLeak *mem_leak = (LLFloaterMemLeak *)userData;
+ if (mem_leak)
+ {
+ F32 tmp ;
+ tmp = mem_leak->childGetValue("leak_speed").asReal();
+
+ if(tmp > (F32)0xFFFFFFFF)
+ {
+ sMemLeakingSpeed = 0xFFFFFFFF ;
+ }
+ else
+ {
+ sMemLeakingSpeed = (U32)tmp ;
+ }
+ }
+}
+
+void LLFloaterMemLeak::onChangeMaxMemLeaking(LLUICtrl* ctrl, void* userData)
+{
+ LLFloaterMemLeak *mem_leak = (LLFloaterMemLeak *)userData;
+ if (mem_leak)
+ {
+ F32 tmp ;
+ tmp = mem_leak->childGetValue("max_leak").asReal();
+ if(tmp > (F32)0xFFF)
+ {
+ sMaxLeakedMem = 0xFFFFFFFF ;
+ }
+ else
+ {
+ sMaxLeakedMem = ((U32)tmp) << 20 ;
+ }
+ }
+}
+
+void LLFloaterMemLeak::onClickStart(void* userData)
+{
+ sStatus = START ;
+}
+
+void LLFloaterMemLeak::onClickStop(void* userData)
+{
+ sStatus = STOP ;
+}
+
+void LLFloaterMemLeak::onClickRelease(void* userData)
+{
+ sStatus = RELEASE ;
+}
+
+void LLFloaterMemLeak::onClickClose(void* userData)
+{
+ if (sInstance)
+ {
+ sInstance->setVisible(FALSE);
+ }
+}
+
+//----------------------------------------------
+
+BOOL LLFloaterMemLeak::postBuild(void)
+{
+ childSetCommitCallback("leak_speed", onChangeLeakingSpeed, this);
+ childSetCommitCallback("max_leak", onChangeMaxMemLeaking, this);
+
+ childSetAction("start_btn", onClickStart, this);
+ childSetAction("stop_btn", onClickStop, this);
+ childSetAction("release_btn", onClickRelease, this);
+ childSetAction("close_btn", onClickClose, this);
+
+ return TRUE ;
+}
+
+void LLFloaterMemLeak::draw()
+{
+ //show total memory leaked
+ if(sTotalLeaked > 0)
+ {
+ std::string bytes_string;
+ LLResMgr::getInstance()->getIntegerString(bytes_string, sTotalLeaked >> 10 );
+ childSetTextArg("total_leaked_label", "[SIZE]", bytes_string);
+ }
+ else
+ {
+ childSetTextArg("total_leaked_label", "[SIZE]", LLStringExplicit("0"));
+ }
+
+ if(sbAllocationFailed)
+ {
+ childSetTextArg("note_label_1", "[NOTE1]", LLStringExplicit("Memory leaking simulation stops. Reduce leaking speed or"));
+ childSetTextArg("note_label_2", "[NOTE2]", LLStringExplicit("increase max leaked memory, then press Start to continue."));
+ }
+ else
+ {
+ childSetTextArg("note_label_1", "[NOTE1]", LLStringExplicit(""));
+ childSetTextArg("note_label_2", "[NOTE2]", LLStringExplicit(""));
+ }
+
+ LLFloater::draw();
+}
+
+// static instance of it
+LLFloaterMemLeak* LLFloaterMemLeak::instance()
+{
+ if (!sInstance)
+ {
+ sInstance = new LLFloaterMemLeak();
+ LLUICtrlFactory::getInstance()->buildFloater(sInstance, "floater_mem_leaking.xml", NULL, FALSE);
+
+ if(sInstance)
+ {
+ F32 a, b ;
+ a = sInstance->childGetValue("leak_speed").asReal();
+ if(a > (F32)(0xFFFFFFFF))
+ {
+ sMemLeakingSpeed = 0xFFFFFFFF ;
+ }
+ else
+ {
+ sMemLeakingSpeed = (U32)a ;
+ }
+ b = sInstance->childGetValue("max_leak").asReal();
+ if(b > (F32)0xFFF)
+ {
+ sMaxLeakedMem = 0xFFFFFFFF ;
+ }
+ else
+ {
+ sMaxLeakedMem = ((U32)b) << 20 ;
+ }
+
+ sbAllocationFailed = FALSE ;
+ }
+ }
+ return sInstance ;
+}
+
+void LLFloaterMemLeak::show(void*)
+{
+ instance()->open();
+}
+
+LLFloaterMemLeak* LLFloaterMemLeak::getInstance()
+{
+ return sInstance ;
+}
+
diff --git a/indra/newview/llfloatermemleak.h b/indra/newview/llfloatermemleak.h
new file mode 100644
index 0000000000..d97cdc771b
--- /dev/null
+++ b/indra/newview/llfloatermemleak.h
@@ -0,0 +1,89 @@
+/**
+ * @file llfloatermemleak.h
+ * @brief memory leaking simulation window, debug use only
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERMEMLEAK_H
+#define LL_LLFLOATERMEMLEAK_H
+
+#include "llfloater.h"
+
+class LLFloaterMemLeak : public LLFloater
+{
+public:
+ LLFloaterMemLeak();
+ virtual ~LLFloaterMemLeak();
+
+ /// initialize all the callbacks for the menu
+ //void initCallbacks(void);
+ virtual BOOL postBuild() ;
+ virtual void draw() ;
+
+ /// one and one instance only
+ static LLFloaterMemLeak* instance();
+
+ static void onChangeLeakingSpeed(LLUICtrl* ctrl, void* userData);
+ static void onChangeMaxMemLeaking(LLUICtrl* ctrl, void* userData);
+ static void onClickStart(void* userData);
+ static void onClickStop(void* userData);
+ static void onClickRelease(void* userData);
+ static void onClickClose(void* userData);
+
+ /// show off our menu
+ static void show(void*);
+
+public:
+ static LLFloaterMemLeak* getInstance() ;
+ void idle() ;
+ void stop() ;
+
+private:
+ void release() ;
+
+private:
+ enum
+ {
+ RELEASE = -1 ,
+ STOP,
+ START
+ } ;
+
+ // one instance on the inside
+ static LLFloaterMemLeak* sInstance;
+
+ static U32 sMemLeakingSpeed ; //bytes leaked per frame
+ static U32 sMaxLeakedMem ; //maximum allowed leaked memory
+ static U32 sTotalLeaked ;
+ static S32 sStatus ; //0: stop ; >0: start ; <0: release
+ static BOOL sbAllocationFailed ;
+
+ std::vector<char*> mLeakedMem ;
+};
+
+#endif // LL_LLFLOATERMEMLEAK_H
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index a95cafa7e4..f53482a476 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -46,6 +46,7 @@
#include "llviewercontrol.h"
#include "llviewermenufile.h" // upload_new_resource()
#include "lluictrlfactory.h"
+#include "llstring.h"
// linden includes
#include "llassetstorage.h"
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index d193685432..65e5dc2bf9 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -1011,7 +1011,7 @@ void LLFloaterTools::setObjectType( void* data )
LLPCode pcode = *(LLPCode*) data;
LLToolPlacer::setObjectType( pcode );
gSavedSettings.setBOOL("CreateToolCopySelection", FALSE);
- gViewerWindow->setMouseCapture(NULL);
+ gFocusMgr.setMouseCapture(NULL);
}
// static
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 2d0723f1eb..5ed50c0c2a 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -170,7 +170,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
F32 score;
std::string name_buf;
std::string owner_buf;
- F32 mono_score;
+ F32 mono_score = 0.f;
msg->getU32Fast(_PREHASH_ReportData, _PREHASH_TaskLocalID, task_local_id, block);
msg->getUUIDFast(_PREHASH_ReportData, _PREHASH_TaskID, task_id, block);
@@ -206,15 +206,16 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data)
element["columns"][3]["column"] = "time";
element["columns"][3]["value"] = formatted_time((time_t)time_stamp);
element["columns"][3]["font"] = "SANSSERIF";
-
+
if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS)
{
- msg->getF32Fast(_PREHASH_ReportData, "MonoScore", mono_score, block);
+ // Not in the message template, needs to be checked against number of blocks
+ //msg->getF32Fast(_PREHASH_ReportData, "MonoScore", mono_score, block);
element["columns"][4]["column"] = "Mono Time";
element["columns"][4]["value"] = llformat("%0.3f", mono_score);
element["columns"][4]["font"] = "SANSSERIF";
}
-
+
list->addElement(element);
mObjectListData.append(element);
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 2739a30031..016909cf7f 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -609,7 +609,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 );
+ gFocusMgr.setMouseCapture( this );
if (!mIsSelected)
{
@@ -680,7 +680,7 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )
// Release keyboard focus, so that if stuff is dropped into the
// world, pressing the delete key won't blow away the inventory
// item.
- gViewerWindow->setKeyboardFocus(NULL);
+ gFocusMgr.setKeyboardFocus(NULL);
return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask );
}
@@ -747,7 +747,7 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
if( hasMouseCapture() )
{
getRoot()->setShowSelectionContext(FALSE);
- gViewerWindow->setMouseCapture( NULL );
+ gFocusMgr.setMouseCapture( NULL );
}
return TRUE;
}
@@ -2585,9 +2585,9 @@ LLFolderView::~LLFolderView( void )
LLView::deleteViewByHandle(mPopupMenuHandle);
- if(gViewerWindow->hasTopCtrl(mRenamer))
+ if(mRenamer == gFocusMgr.getTopCtrl())
{
- gViewerWindow->setTopCtrl(NULL);
+ gFocusMgr.setTopCtrl(NULL);
}
mAutoOpenItems.removeAllNodes();
@@ -3132,9 +3132,9 @@ void LLFolderView::draw()
{
closeAutoOpenedFolders();
}
- if(gViewerWindow->hasKeyboardFocus(this) && !getVisible())
+ if(this == gFocusMgr.getKeyboardFocus() && !getVisible())
{
- gViewerWindow->setKeyboardFocus( NULL );
+ gFocusMgr.setKeyboardFocus( NULL );
}
// while dragging, update selection rendering to reflect single/multi drag status
@@ -3199,7 +3199,7 @@ void LLFolderView::finishRenamingItem( void )
mRenamer->setFocus( FALSE );
mRenamer->setVisible( FALSE );
mRenamer->setCommitOnFocusLost( TRUE );
- gViewerWindow->setTopCtrl( NULL );
+ gFocusMgr.setTopCtrl( NULL );
if( mRenameItem )
{
@@ -3211,13 +3211,12 @@ void LLFolderView::finishRenamingItem( void )
scrollToShowSelection();
}
-void LLFolderView::revertRenamingItem( void )
+void LLFolderView::closeRenamer( void )
{
- mRenamer->setCommitOnFocusLost( FALSE );
+ // will commit current name (which could be same as original name)
mRenamer->setFocus( FALSE );
mRenamer->setVisible( FALSE );
- mRenamer->setCommitOnFocusLost( TRUE );
- gViewerWindow->setTopCtrl( NULL );
+ gFocusMgr.setTopCtrl( NULL );
if( mRenameItem )
{
@@ -3274,11 +3273,11 @@ void LLFolderView::removeSelectedItems( void )
// change selection on successful delete
if (new_selection)
{
- setSelectionFromRoot(new_selection, new_selection->isOpen(), gViewerWindow->childHasKeyboardFocus(this));
+ setSelectionFromRoot(new_selection, new_selection->isOpen(), gFocusMgr.childHasKeyboardFocus(this));
}
else
{
- setSelectionFromRoot(NULL, gViewerWindow->childHasKeyboardFocus(this));
+ setSelectionFromRoot(NULL, gFocusMgr.childHasKeyboardFocus(this));
}
}
}
@@ -3304,11 +3303,11 @@ void LLFolderView::removeSelectedItems( void )
}
if (new_selection)
{
- setSelectionFromRoot(new_selection, new_selection->isOpen(), gViewerWindow->childHasKeyboardFocus(this));
+ setSelectionFromRoot(new_selection, new_selection->isOpen(), gFocusMgr.childHasKeyboardFocus(this));
}
else
{
- setSelectionFromRoot(NULL, gViewerWindow->childHasKeyboardFocus(this));
+ setSelectionFromRoot(NULL, gFocusMgr.childHasKeyboardFocus(this));
}
for(S32 i = 0; i < count; ++i)
@@ -3626,7 +3625,7 @@ void LLFolderView::startRenamingSelectedItem( void )
// set focus will fail unless item is visible
mRenamer->setFocus( TRUE );
mRenamer->setLostTopCallback(onRenamerLost);
- gViewerWindow->setTopCtrl( mRenamer );
+ gFocusMgr.setTopCtrl( mRenamer );
}
}
@@ -3687,19 +3686,11 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
break;
case KEY_ESCAPE:
- // mark flag don't commit
if( mRenameItem && mRenamer->getVisible() )
{
- revertRenamingItem();
+ closeRenamer();
handled = TRUE;
}
- else
- {
- if( gViewerWindow->childHasKeyboardFocus( this ) )
- {
- gViewerWindow->setKeyboardFocus( NULL );
- }
- }
mSearchString.clear();
break;
@@ -4107,9 +4098,9 @@ BOOL LLFolderView::handleScrollWheel(S32 x, S32 y, S32 clicks)
void LLFolderView::deleteAllChildren()
{
- if(gViewerWindow->hasTopCtrl(mRenamer))
+ if(mRenamer == gFocusMgr.getTopCtrl())
{
- gViewerWindow->setTopCtrl(NULL);
+ gFocusMgr.setTopCtrl(NULL);
}
LLView::deleteViewByHandle(mPopupMenuHandle);
mPopupMenuHandle = LLHandle<LLView>();
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 32b0580a5c..841146db5a 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -880,7 +880,7 @@ protected:
static void onRenamerLost( LLUICtrl* renamer, void* user_data);
void finishRenamingItem( void );
- void revertRenamingItem( void );
+ void closeRenamer( void );
protected:
LLHandle<LLView> mPopupMenuHandle;
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index da9441e108..80e62aff8f 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -961,6 +961,21 @@ void LLHUDText::renderAllHUD()
}
}
+void LLHUDText::shiftAll(const LLVector3& offset)
+{
+ TextObjectIterator text_it;
+ for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it)
+ {
+ LLHUDText *textp = text_it->get();
+ textp->shift(offset);
+ }
+}
+
+void LLHUDText::shift(const LLVector3& offset)
+{
+ mPositionAgent += offset;
+}
+
//static
void LLHUDText::addPickable(std::set<LLViewerObject*> &pick_list)
{
diff --git a/indra/newview/llhudtext.h b/indra/newview/llhudtext.h
index bb96c356bb..b46a1635dd 100644
--- a/indra/newview/llhudtext.h
+++ b/indra/newview/llhudtext.h
@@ -121,6 +121,9 @@ public:
BOOL getHidden() const { return mHidden; }
void setHidden( BOOL hide ) { mHidden = hide; }
void setOnHUDAttachment(BOOL on_hud) { mOnHUDAttachment = on_hud; }
+ void shift(const LLVector3& offset);
+
+ static void shiftAll(const LLVector3& offset);
static void renderAllHUD();
static void addPickable(std::set<LLViewerObject*> &pick_list);
static void reshape();
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 40da1a4f3c..328cb85c1f 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -2173,11 +2173,17 @@ void LLFloaterIMPanel::chatFromLogFile(LLLogChat::ELogLineType type, std::string
{
case LLLogChat::LOG_EMPTY:
// add warning log enabled message
- message = LLFloaterChat::getInstance()->getUIString("IM_logging_string");
+ if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
+ {
+ message = LLFloaterChat::getInstance()->getUIString("IM_logging_string");
+ }
break;
case LLLogChat::LOG_END:
// add log end message
- message = LLFloaterChat::getInstance()->getUIString("IM_logging_string");
+ if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
+ {
+ message = LLFloaterChat::getInstance()->getUIString("IM_logging_string");
+ }
break;
case LLLogChat::LOG_LINE:
// just add normal lines from file
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index c05eea7bd8..9aa7f54fa9 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -56,6 +56,7 @@
#include "llcallbacklist.h"
#include "llpreview.h"
#include "llviewercontrol.h"
+#include "llvoavatar.h"
#include "llsdutil.h"
#include <deque>
@@ -3064,6 +3065,45 @@ void LLInventoryModel::dumpInventory()
/// LLInventoryCollectFunctor implementations
///----------------------------------------------------------------------------
+// static
+bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(LLInventoryItem* item)
+{
+ if (!item)
+ return false;
+
+ bool allowed = false;
+ LLVOAvatar* my_avatar = NULL;
+
+ switch(item->getType())
+ {
+ case LLAssetType::AT_CALLINGCARD:
+ // not allowed
+ break;
+
+ case LLAssetType::AT_OBJECT:
+ my_avatar = gAgent.getAvatarObject();
+ if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID()))
+ {
+ allowed = true;
+ }
+ break;
+
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_CLOTHING:
+ if(!gAgent.isWearingItem(item->getUUID()))
+ {
+ allowed = true;
+ }
+ break;
+
+ default:
+ allowed = true;
+ break;
+ }
+
+ return allowed;
+}
+
bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
if(mType == LLAssetType::AT_CATEGORY)
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 8d554e2673..85eb46404b 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -484,6 +484,8 @@ class LLInventoryCollectFunctor
public:
virtual ~LLInventoryCollectFunctor(){};
virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
+
+ static bool itemTransferCommonlyAllowed(LLInventoryItem* item);
};
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index cb7af207d2..d129687a11 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -40,11 +40,24 @@ const S32 LOG_RECALL_SIZE = 2048;
//static
std::string LLLogChat::makeLogFileName(std::string filename)
{
+ filename = cleanFileName(filename);
filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS,filename);
filename += ".txt";
return filename;
}
+std::string LLLogChat::cleanFileName(std::string filename)
+{
+ std::string invalidChars = "\"\'\\/?*:<>|";
+ S32 position = filename.find_first_of(invalidChars);
+ while (position != filename.npos)
+ {
+ filename[position] = '_';
+ position = filename.find_first_of(invalidChars, position);
+ }
+ return filename;
+}
+
std::string LLLogChat::timestamp(bool withdate)
{
time_t utc_time;
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index 45279fd6ae..28e073de4c 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -48,6 +48,8 @@ public:
static void loadHistory(std::string filename,
void (*callback)(ELogLineType,std::string,void*),
void* userdata);
+private:
+ static std::string cleanFileName(std::string filename);
};
#endif
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index ca0812c8a0..f1a0fd4c67 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -448,6 +448,19 @@ BOOL LLManipRotate::handleMouseUp(S32 x, S32 y, MASK mask)
if( hasMouseCapture() )
{
+ for (LLObjectSelection::iterator iter = mObjectSelection->begin();
+ iter != mObjectSelection->end(); iter++)
+ {
+ LLSelectNode* selectNode = *iter;
+ LLViewerObject* object = selectNode->getObject();
+
+ // have permission to move and object is root of selection or individually selected
+ if (object->permMove() && (object->isRootEdit() || selectNode->mIndividualSelection))
+ {
+ object->mUnselectedChildrenPositions.clear() ;
+ }
+ }
+
mManipPart = LL_NO_PART;
// Might have missed last update due to timing.
@@ -544,16 +557,12 @@ void LLManipRotate::drag( S32 x, S32 y )
}
LLQuaternion new_rot = selectNode->mSavedRotation * mRotation;
- std::vector<LLVector3> child_positions;
+ std::vector<LLVector3>& child_positions = object->mUnselectedChildrenPositions ;
std::vector<LLQuaternion> child_rotations;
if (object->isRootEdit() && selectNode->mIndividualSelection)
{
- for (U32 i = 0; i < object->mChildList.size(); i++)
- {
- LLViewerObject* childp = object->mChildList[i];
- child_positions.push_back(childp->getPositionEdit());
- child_rotations.push_back(childp->getRotationEdit());
- }
+ object->saveUnselectedChildrenRotation(child_rotations) ;
+ object->saveUnselectedChildrenPosition(child_positions) ;
}
if (object->getParent() && object->mDrawable.notNull())
@@ -575,17 +584,7 @@ void LLManipRotate::drag( S32 x, S32 y )
{
//RN: must do non-damped updates on these objects so relative rotation appears constant
// instead of having two competing slerps making the child objects appear to "wobble"
- for (U32 i = 0; i < object->mChildList.size(); i++)
- {
- LLViewerObject* childp = object->mChildList[i];
- LLVector3 child_offset = ((child_positions[i] - object->getPositionEdit()) * ~object->getRotationEdit()) - childp->getPosition();
- if (!childp->isSelected() && childp->mDrawable.notNull())
- {
- childp->setRotation(child_rotations[i] * ~object->getRotationEdit());
- childp->setPosition((child_positions[i] - object->getPositionEdit()) * ~object->getRotationEdit());
- rebuild(childp);
- }
- }
+ object->resetChildrenRotationAndPosition(child_rotations, child_positions) ;
}
}
}
@@ -667,28 +666,8 @@ void LLManipRotate::drag( S32 x, S32 y )
if (object->isRootEdit() && selectNode->mIndividualSelection)
{
// only offset by parent's translation as we've already countered parent's rotation
- LLVector3 child_offset;
- if (object->isAttachment() && object->mDrawable.notNull())
- {
- LLXform* attachment_point_xform = object->mDrawable->getXform()->getParent();
- LLQuaternion parent_rotation = object->getRotation() * attachment_point_xform->getWorldRotation();
- child_offset = LLVector3(old_position - new_position) * ~parent_rotation;
- }
- else
- {
- child_offset = LLVector3(old_position - new_position) * ~object->getRenderRotation();
- }
-
rebuild(object);
- for (U32 i = 0; i < object->mChildList.size(); i++)
- {
- LLViewerObject* childp = object->mChildList[i];
- if (!childp->isSelected() && childp->mDrawable.notNull())
- {
- childp->setPosition(childp->getPosition() + child_offset);
- rebuild(childp);
- }
- }
+ object->resetChildrenPosition(old_position - new_position) ;
}
}
}
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 5859d4c75f..68e59ce9e0 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -1003,9 +1003,11 @@ void LLManipScale::dragCorner( S32 x, S32 y )
if (selectNode->mIndividualSelection)
{
// counter-translate child objects if we are moving the root as an individual
- for (U32 child_num = 0; child_num < cur->mChildList.size(); child_num++)
+ LLViewerObject::const_child_list_t& child_list = cur->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLViewerObject* childp = cur->mChildList[child_num];
+ LLViewerObject* childp = *iter;
if (cur->isAttachment())
{
@@ -1301,9 +1303,11 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto
if (cur->isRootEdit() && selectNode->mIndividualSelection)
{
// counter-translate child objects if we are moving the root as an individual
- for (U32 child_num = 0; child_num < cur->mChildList.size(); child_num++)
+ LLViewerObject::const_child_list_t& child_list = cur->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLViewerObject* childp = cur->mChildList[child_num];
+ LLViewerObject* childp = *iter;
if (!getUniform())
{
LLVector3 child_pos = childp->getPosition() - (delta_pos * ~cur->getRotationEdit());
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 7785b5a078..ac82295008 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -677,19 +677,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
if (selectNode->mIndividualSelection)
{
send_update = FALSE;
- LLVector3 child_offset = (old_position_local - new_position_local) * ~object->getRotation();
-
+
// counter-translate child objects if we are moving the root as an individual
- for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++)
- {
- LLViewerObject* childp = object->mChildList[child_num];
-
- if (!childp->isSelected())
- {
- childp->setPosition(childp->getPosition() + child_offset);
- rebuild(childp);
- }
- }
+ object->resetChildrenPosition(old_position_local - new_position_local, TRUE) ;
}
}
else
@@ -743,18 +733,8 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
if (selectNode->mIndividualSelection)
{
- LLVector3 parent_offset = (new_position_agent - old_position_agent) * ~object->getRotation();
-
// counter-translate child objects if we are moving the root as an individual
- for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++)
- {
- LLViewerObject* childp = object->mChildList[child_num];
- if (!childp->isSelected())
- {
- childp->setPosition(childp->getPosition() - parent_offset);
- rebuild(childp);
- }
- }
+ object->resetChildrenPosition(old_position_agent - new_position_agent, TRUE) ;
send_update = FALSE;
}
else if (old_position_global != new_position_global)
diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp
index 75f05f6d0c..a5a4db8dc4 100644
--- a/indra/newview/llmemoryview.cpp
+++ b/indra/newview/llmemoryview.cpp
@@ -121,6 +121,7 @@ static const struct mtv_display_info mtv_display_table[] =
{ LLMemType::MTYPE_SPACE_PARTITION, "Space Partition", &LLColor4::blue2 },
{ LLMemType::MTYPE_VERTEX_DATA, "Vertex Buffer", &LLColor4::blue3 },
{ LLMemType::MTYPE_AVATAR, "Avatar", &LLColor4::purple1 },
+ { LLMemType::MTYPE_AVATAR_MESH, "Avatar Mesh", &LLColor4::purple2 },
{ LLMemType::MTYPE_ANIMATION, "Animation", &LLColor4::purple3 },
{ LLMemType::MTYPE_REGIONS, "Regions", &LLColor4::blue1 },
{ LLMemType::MTYPE_VOLUME, "Volume", &LLColor4::pink1 },
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 3a33f62c38..47948281ab 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -279,7 +279,7 @@ void LLNetMap::draw()
gGL.color4f(0.8f, 0.8f, 0.8f, 1.f);
}
- if (!regionp->mAlive)
+ if (!regionp->isAlive())
{
gGL.color4f(1.f, 0.5f, 0.5f, 1.f);
}
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index a70ca9444f..c4c7749b8a 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -441,7 +441,8 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
llinfos << "LLPanelGroupGeneral::apply" << llendl;
// Check to make sure mature has been set
- if(mComboMature->getCurrentIndex() == DECLINE_TO_STATE)
+ if(mComboMature &&
+ mComboMature->getCurrentIndex() == DECLINE_TO_STATE)
{
LLStringUtil::format_map_t args;
gViewerWindow->alertXml("SetGroupMature", &callbackConfirmMatureApply,
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index b181aff62d..d3fb041bad 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -1546,7 +1546,7 @@ void LLPanelObject::getVolumeParams(LLVolumeParams& volume_params)
}
// BUG: Make work with multiple objects
-void LLPanelObject::sendRotation()
+void LLPanelObject::sendRotation(BOOL btn_down)
{
if (mObject.isNull()) return;
@@ -1570,16 +1570,34 @@ void LLPanelObject::sendRotation()
{
rotation = rotation * ~mRootObject->getRotationRegion();
}
+ std::vector<LLVector3>& child_positions = mObject->mUnselectedChildrenPositions ;
+ std::vector<LLQuaternion> child_rotations;
+ if (mObject->isRootEdit())
+ {
+ mObject->saveUnselectedChildrenRotation(child_rotations) ;
+ mObject->saveUnselectedChildrenPosition(child_positions) ;
+ }
- mObject->setRotation(rotation, TRUE );
+ mObject->setRotation(rotation);
+ LLManip::rebuild(mObject) ;
+
+ // for individually selected roots, we need to counterrotate all the children
+ if (mObject->isRootEdit())
+ {
+ mObject->resetChildrenRotationAndPosition(child_rotations, child_positions) ;
+ }
- LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION);
+ if(!btn_down)
+ {
+ child_positions.clear() ;
+ LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION);
+ }
}
}
// BUG: Make work with multiple objects
-void LLPanelObject::sendScale()
+void LLPanelObject::sendScale(BOOL btn_down)
{
if (mObject.isNull()) return;
@@ -1599,7 +1617,11 @@ void LLPanelObject::sendScale()
}
mObject->setScale(newscale, TRUE);
- LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION);
+
+ if(!btn_down)
+ {
+ LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION);
+ }
LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, !dont_stretch_textures);
// llinfos << "scale sent" << llendl;
@@ -1611,7 +1633,7 @@ void LLPanelObject::sendScale()
}
-void LLPanelObject::sendPosition()
+void LLPanelObject::sendPosition(BOOL btn_down)
{
if (mObject.isNull()) return;
@@ -1654,7 +1676,7 @@ void LLPanelObject::sendPosition()
LLVector3d delta = new_pos_global - old_pos_global;
// moved more than 1/2 millimeter
if (delta.magVec() >= 0.0005f)
- {
+ {
if (mRootObject != mObject)
{
newpos = newpos - mRootObject->getPositionRegion();
@@ -1664,8 +1686,21 @@ void LLPanelObject::sendPosition()
else
{
mObject->setPositionEdit(newpos);
+ }
+
+ LLManip::rebuild(mObject) ;
+
+ // for individually selected roots, we need to counter-translate all unselected children
+ if (mObject->isRootEdit())
+ {
+ // only offset by parent's translation
+ mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ;
+ }
+
+ if(!btn_down)
+ {
+ LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
}
- LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
LLSelectMgr::getInstance()->updateSelectionCenter();
}
@@ -1846,21 +1881,24 @@ void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data)
void LLPanelObject::onCommitPosition( LLUICtrl* ctrl, void* userdata )
{
LLPanelObject* self = (LLPanelObject*) userdata;
- self->sendPosition();
+ BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+ self->sendPosition(btn_down);
}
// static
void LLPanelObject::onCommitScale( LLUICtrl* ctrl, void* userdata )
{
LLPanelObject* self = (LLPanelObject*) userdata;
- self->sendScale();
+ BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+ self->sendScale(btn_down);
}
// static
void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata )
{
LLPanelObject* self = (LLPanelObject*) userdata;
- self->sendRotation();
+ BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ;
+ self->sendRotation(btn_down);
}
// static
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index 87c9ce04a0..dd94922e10 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -87,9 +87,9 @@ public:
protected:
void getState();
- void sendRotation();
- void sendScale();
- void sendPosition();
+ void sendRotation(BOOL btn_down);
+ void sendScale(BOOL btn_down);
+ void sendPosition(BOOL btn_down);
void sendIsPhysical();
void sendIsTemporary();
void sendIsPhantom();
@@ -180,7 +180,7 @@ protected:
LLUUID mSculptTextureRevert; // so we can revert the sculpt texture on cancel
U8 mSculptTypeRevert; // so we can revert the sculpt type on cancel
-
+
LLPointer<LLViewerObject> mObject;
LLPointer<LLViewerObject> mRootObject;
};
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index fef4726b12..5ee54156b7 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -679,7 +679,9 @@ const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index)
// LLPolyMesh()
//-----------------------------------------------------------------------------
LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh)
-{
+{
+ LLMemType mt(LLMemType::MTYPE_AVATAR_MESH);
+
llassert(shared_data);
mSharedData = shared_data;
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 6f2c57c055..55bad7fc7d 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -311,9 +311,7 @@ void LLPreviewTexture::saveAs()
mLoadingFullImage = TRUE;
getWindow()->incBusyCount();
mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave,
- 0,
- TRUE,
- new LLUUID( mItemUUID ) );
+ 0, TRUE, FALSE, new LLUUID( mItemUUID ) );
}
}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 2f11dad010..cf11336377 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -845,9 +845,12 @@ void LLSelectMgr::highlightObjectAndFamily(LLViewerObject* objectp)
highlightObjectOnly(root_obj);
- for(U32 i = 0; i < root_obj->mChildList.size(); i++)
+ LLViewerObject::const_child_list_t& child_list = root_obj->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- highlightObjectOnly(root_obj->mChildList[i]);
+ LLViewerObject* child = *iter;
+ highlightObjectOnly(child);
}
}
@@ -872,8 +875,9 @@ void LLSelectMgr::highlightObjectAndFamily(const std::vector<LLViewerObject*>& o
LLViewerObject* root = (LLViewerObject*)object->getRoot();
mRectSelectedObjects.insert(root);
- for (LLViewerObject::child_list_t::const_iterator iter2 = root->mChildList.begin();
- iter2 != root->mChildList.end(); ++iter2)
+ LLViewerObject::const_child_list_t& child_list = root->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter2 = child_list.begin();
+ iter2 != child_list.end(); iter2++)
{
LLViewerObject* child = *iter2;
mRectSelectedObjects.insert(child);
@@ -902,10 +906,11 @@ void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp)
unhighlightObjectOnly(root_obj);
- for (LLViewerObject::child_list_t::iterator iter2 = root_obj->mChildList.begin();
- iter2 != root_obj->mChildList.end(); ++iter2)
+ LLViewerObject::const_child_list_t& child_list = root_obj->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLViewerObject* child = *iter2;
+ LLViewerObject* child = *iter;
unhighlightObjectOnly(child);
}
}
@@ -1005,10 +1010,11 @@ void LLSelectMgr::addGridObject(LLViewerObject* objectp)
LLSelectNode* nodep = new LLSelectNode(objectp, FALSE);
mGridObjects.addNodeAtEnd(nodep);
- for (LLViewerObject::child_list_t::iterator iter2 = objectp->mChildList.begin();
- iter2 != objectp->mChildList.end(); ++iter2)
+ LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLViewerObject* child = *iter2;
+ LLViewerObject* child = *iter;
nodep = new LLSelectNode(child, FALSE);
mGridObjects.addNodeAtEnd(nodep);
}
@@ -4719,8 +4725,9 @@ void LLSelectMgr::updateSilhouettes()
}
else
{
- for (LLViewerObject::child_list_t::iterator iter = objectp->mChildList.begin();
- iter != objectp->mChildList.end(); ++iter)
+ LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
LLViewerObject* child_objectp = *iter;
@@ -5412,8 +5419,9 @@ S32 get_family_count(LLViewerObject *parent)
llwarns << "Trying to get_family_count on null parent!" << llendl;
}
S32 count = 1; // for this object
- for (LLViewerObject::child_list_t::iterator iter = parent->mChildList.begin();
- iter != parent->mChildList.end(); ++iter)
+ LLViewerObject::const_child_list_t& child_list = parent->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
LLViewerObject* child = *iter;
diff --git a/indra/newview/llsky.h b/indra/newview/llsky.h
index e9e9999ff9..35d669152e 100644
--- a/indra/newview/llsky.h
+++ b/indra/newview/llsky.h
@@ -117,9 +117,6 @@ protected:
F32 mSunPhase;
LLColor4 mFogColor; // Color to use for fog and haze
- F32 mHaze; // a multiplier to scale the lighting
- F32 mDomeRadius; // sky dome size
-
LLVector3 mLastSunDirection;
};
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index d24c738f2c..59b25acca4 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -188,7 +188,7 @@
//
// exported globals
//
-BOOL gAgentMovementCompleted = FALSE;
+bool gAgentMovementCompleted = false;
std::string SCREEN_HOME_FILENAME = "screen_home.bmp";
std::string SCREEN_LAST_FILENAME = "screen_last.bmp";
@@ -214,7 +214,7 @@ static std::string sInitialOutfitGender; // "male" or "female"
static bool gUseCircuitCallbackCalled = false;
-S32 LLStartUp::gStartupState = STATE_FIRST;
+EStartupState LLStartUp::gStartupState = STATE_FIRST;
//
@@ -225,7 +225,7 @@ void login_show();
void login_callback(S32 option, void* userdata);
std::string load_password_from_disk();
void save_password_to_disk(const char* hashed_password);
-BOOL is_hex_string(U8* str, S32 len);
+bool is_hex_string(U8* str, S32 len);
void show_first_run_dialog();
void first_run_dialog_callback(S32 option, void* userdata);
void set_startup_status(const F32 frac, const std::string& string, const std::string& msg);
@@ -301,9 +301,9 @@ void update_texture_fetch()
static std::vector<std::string> sAuthUris;
static S32 sAuthUriNum = -1;
-// Returns FALSE to skip other idle processing. Should only return
-// TRUE when all initialization done.
-BOOL idle_startup()
+// Returns false to skip other idle processing. Should only return
+// true when all initialization done.
+bool idle_startup()
{
LLMemType mt1(LLMemType::MTYPE_STARTUP);
@@ -341,12 +341,12 @@ BOOL idle_startup()
static S32 agent_location_id = START_LOCATION_ID_LAST;
static S32 location_which = START_LOCATION_ID_LAST;
- static BOOL show_connect_box = TRUE;
+ static bool show_connect_box = true;
static BOOL remember_password = TRUE;
- static BOOL stipend_since_login = FALSE;
+ static bool stipend_since_login = false;
- static BOOL samename = FALSE;
+ static bool samename = false;
// HACK: These are things from the main loop that usually aren't done
// until initialization is complete, but need to be done here for things
@@ -443,6 +443,18 @@ BOOL idle_startup()
LLFILE* found_template = NULL;
found_template = LLFile::fopen(message_template_path, "r"); /* Flawfinder: ignore */
+
+ #if LL_WINDOWS
+ // On the windows dev builds, unpackaged, the message_template.msg
+ // file will be located in
+ // indra/build-vc**/newview/<config>/app_settings.
+ if (!found_template)
+ {
+ message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", "message_template.msg");
+ found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */
+ }
+ #endif
+
if (found_template)
{
fclose(found_template);
@@ -468,7 +480,24 @@ BOOL idle_startup()
std::string msg = llformat("Unable to start networking, error %d", gMessageSystem->getErrorCode());
LLAppViewer::instance()->earlyExit(msg);
}
- LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+
+ #if LL_WINDOWS
+ // On the windows dev builds, unpackaged, the message.xml file will
+ // be located in indra/build-vc**/newview/<config>/app_settings.
+ std::string message_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message.xml");
+
+ if (!LLFile::isfile(message_path.c_str()))
+ {
+ LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", ""));
+ }
+ else
+ {
+ LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+ }
+ #else
+ LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
+ #endif
+
}
else
{
@@ -558,7 +587,7 @@ BOOL idle_startup()
#else
void* window_handle = NULL;
#endif
- BOOL init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle);
+ bool init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle);
if(!init)
{
LL_WARNS("AppInit") << "Unable to initialize audio engine" << LL_ENDL;
@@ -584,7 +613,7 @@ BOOL idle_startup()
lastname = gLoginHandler.mLastName;
web_login_key = gLoginHandler.mWebLoginKey;
- show_connect_box = FALSE;
+ show_connect_box = false;
}
else if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
{
@@ -599,9 +628,9 @@ BOOL idle_startup()
remember_password = gSavedSettings.getBOOL("RememberPassword");
#ifdef USE_VIEWER_AUTH
- show_connect_box = TRUE;
+ show_connect_box = true;
#else
- show_connect_box = FALSE;
+ show_connect_box = false;
#endif
gSavedSettings.setBOOL("AutoLogin", TRUE);
}
@@ -614,9 +643,9 @@ BOOL idle_startup()
remember_password = TRUE;
#ifdef USE_VIEWER_AUTH
- show_connect_box = TRUE;
+ show_connect_box = true;
#else
- show_connect_box = FALSE;
+ show_connect_box = false;
#endif
}
else
@@ -627,7 +656,7 @@ BOOL idle_startup()
lastname = gSavedSettings.getString("LastName");
password = load_password_from_disk();
remember_password = gSavedSettings.getBOOL("RememberPassword");
- show_connect_box = TRUE;
+ show_connect_box = true;
}
@@ -1058,11 +1087,11 @@ BOOL idle_startup()
{
LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL;
std::ostringstream emsg;
- BOOL quit = FALSE;
+ bool quit = false;
std::string login_response;
std::string reason_response;
std::string message_response;
- BOOL successful_login = FALSE;
+ bool successful_login = false;
LLUserAuth::UserAuthcode error = LLUserAuth::getInstance()->authResponse();
// reset globals
gAcceptTOS = FALSE;
@@ -1074,7 +1103,7 @@ BOOL idle_startup()
if(login_response == "true")
{
// Yay, login!
- successful_login = TRUE;
+ successful_login = true;
}
else if(login_response == "indeterminate")
{
@@ -1131,11 +1160,11 @@ BOOL idle_startup()
message_response);
tos_dialog->startModal();
// LLFloaterTOS deletes itself.
- return FALSE;
+ return false;
}
else
{
- quit = TRUE;
+ quit = true;
}
}
if(reason_response == "critical")
@@ -1148,11 +1177,11 @@ BOOL idle_startup()
message_response);
tos_dialog->startModal();
// LLFloaterTOS deletes itself.
- return FALSE;
+ return false;
}
else
{
- quit = TRUE;
+ quit = true;
}
}
if(reason_response == "key")
@@ -1168,11 +1197,11 @@ BOOL idle_startup()
{
update_app(TRUE, auth_message);
LLStartUp::setStartupState( STATE_UPDATE_CHECK );
- return FALSE;
+ return false;
}
else
{
- quit = TRUE;
+ quit = true;
}
}
if(reason_response == "optional")
@@ -1184,7 +1213,7 @@ BOOL idle_startup()
update_app(FALSE, auth_message);
LLStartUp::setStartupState( STATE_UPDATE_CHECK );
gSkipOptionalUpdate = TRUE;
- return FALSE;
+ return false;
}
}
}
@@ -1216,7 +1245,7 @@ BOOL idle_startup()
{
LLUserAuth::getInstance()->reset();
LLAppViewer::instance()->forceQuit();
- return FALSE;
+ return false;
}
if(successful_login)
@@ -1358,7 +1387,7 @@ BOOL idle_startup()
it = options[0].find("stipend_since_login");
if(it != no_flag)
{
- if((*it).second == "Y") stipend_since_login = TRUE;
+ if((*it).second == "Y") stipend_since_login = true;
}
it = options[0].find("gendered");
if(it != no_flag)
@@ -1443,7 +1472,7 @@ BOOL idle_startup()
gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);
reset_login();
gSavedSettings.setBOOL("AutoLogin", FALSE);
- show_connect_box = TRUE;
+ show_connect_box = true;
}
// Pass the user information to the voice chat server interface.
@@ -1463,7 +1492,7 @@ BOOL idle_startup()
gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);
reset_login();
gSavedSettings.setBOOL("AutoLogin", FALSE);
- show_connect_box = TRUE;
+ show_connect_box = true;
// Don't save an incorrect password to disk.
save_password_to_disk(NULL);
}
@@ -2002,7 +2031,7 @@ BOOL idle_startup()
llinfos << "Requesting Agent Data" << llendl;
gAgent.sendAgentDataUpdateRequest();
- BOOL shown_at_exit = gSavedSettings.getBOOL("ShowInventory");
+ bool shown_at_exit = gSavedSettings.getBOOL("ShowInventory");
// Create the inventory views
llinfos << "Creating Inventory Views" << llendl;
@@ -2113,8 +2142,8 @@ BOOL idle_startup()
const BOOL no_inform_server = FALSE;
const BOOL no_deactivate_similar = FALSE;
gGestureManager.activateGestureWithAsset(item_id, asset_id,
- no_inform_server,
- no_deactivate_similar);
+ no_inform_server,
+ no_deactivate_similar);
// We need to fetch the inventory items for these gestures
// so we have the names to populate the UI.
item_ids.push_back(item_id);
@@ -2536,9 +2565,9 @@ void save_password_to_disk(const char* hashed_password)
}
}
-BOOL is_hex_string(U8* str, S32 len)
+bool is_hex_string(U8* str, S32 len)
{
- BOOL rv = TRUE;
+ bool rv = true;
U8* c = str;
while(rv && len--)
{
@@ -2563,7 +2592,7 @@ BOOL is_hex_string(U8* str, S32 len)
++c;
break;
default:
- rv = FALSE;
+ rv = false;
break;
}
}
@@ -2683,7 +2712,7 @@ void update_app(BOOL mandatory, const std::string& auth_msg)
void update_dialog_callback(S32 option, void *userdata)
{
std::string update_exe_path;
- BOOL mandatory = userdata != NULL;
+ bool mandatory = userdata != NULL;
#if !LL_RELEASE_FOR_DOWNLOAD
if (option == 2)
@@ -2805,7 +2834,7 @@ void update_dialog_callback(S32 option, void *userdata)
update_exe_path = "'";
update_exe_path += gDirUtilp->getAppRODataDir();
- update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -url \"";
+ update_exe_path += "/mac-updater.app/Contents/MacOS/mac-updater' -url \"";
update_exe_path += update_url.asString();
update_exe_path += "\" -name \"";
update_exe_path += LLAppViewer::instance()->getSecondLifeTitle();
@@ -3709,9 +3738,45 @@ void release_start_screen()
// static
-void LLStartUp::setStartupState( S32 state )
+std::string LLStartUp::startupStateToString(EStartupState state)
+{
+#define RTNENUM(E) case E: return #E
+ switch(state){
+ RTNENUM( STATE_FIRST );
+ RTNENUM( STATE_LOGIN_SHOW );
+ RTNENUM( STATE_LOGIN_WAIT );
+ RTNENUM( STATE_LOGIN_CLEANUP );
+ RTNENUM( STATE_UPDATE_CHECK );
+ RTNENUM( STATE_LOGIN_AUTH_INIT );
+ RTNENUM( STATE_LOGIN_AUTHENTICATE );
+ RTNENUM( STATE_LOGIN_NO_DATA_YET );
+ RTNENUM( STATE_LOGIN_DOWNLOADING );
+ RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
+ RTNENUM( STATE_WORLD_INIT );
+ RTNENUM( STATE_SEED_GRANTED_WAIT );
+ RTNENUM( STATE_SEED_CAP_GRANTED );
+ RTNENUM( STATE_WORLD_WAIT );
+ RTNENUM( STATE_AGENT_SEND );
+ RTNENUM( STATE_AGENT_WAIT );
+ RTNENUM( STATE_INVENTORY_SEND );
+ RTNENUM( STATE_MISC );
+ RTNENUM( STATE_PRECACHE );
+ RTNENUM( STATE_WEARABLES_WAIT );
+ RTNENUM( STATE_CLEANUP );
+ RTNENUM( STATE_STARTED );
+ default:
+ return llformat("(state #%d)", state);
+ }
+#undef RTNENUM
+}
+
+
+// static
+void LLStartUp::setStartupState( EStartupState state )
{
- LL_INFOS("AppInit") << "Startup state changing from " << gStartupState << " to " << state << LL_ENDL;
+ LL_INFOS("AppInit") << "Startup state changing from " <<
+ startupStateToString(gStartupState) << " to " <<
+ startupStateToString(state) << LL_ENDL;
gStartupState = state;
}
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index ea568395d4..3cfe1ca97f 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -35,7 +35,7 @@
#include "llimagegl.h"
// functions
-BOOL idle_startup();
+bool idle_startup();
std::string load_password_from_disk();
void release_start_screen();
void login_alert_done(S32 option, void* user_data);
@@ -44,7 +44,7 @@ void login_alert_done(S32 option, void* user_data);
extern std::string SCREEN_HOME_FILENAME;
extern std::string SCREEN_LAST_FILENAME;
-enum EStartupState{
+typedef enum {
STATE_FIRST, // Initial startup
STATE_BROWSER_INIT, // Initialize web browser for login screen
STATE_LOGIN_SHOW, // Show login screen
@@ -69,10 +69,10 @@ enum EStartupState{
STATE_WEARABLES_WAIT, // Wait for clothing to download
STATE_CLEANUP, // Final cleanup
STATE_STARTED // Up and running in-world
-};
+} EStartupState;
// exported symbols
-extern BOOL gAgentMovementCompleted;
+extern bool gAgentMovementCompleted;
extern LLPointer<LLImageGL> gStartImageGL;
extern std::string gInitialOutfit;
extern std::string gInitialOutfitGender; // "male" or "female"
@@ -85,8 +85,8 @@ public:
// going full screen
// Always use this to set gStartupState so changes are logged
- static void setStartupState( S32 state );
- static S32 getStartupState() { return gStartupState; };
+ static void setStartupState( EStartupState state );
+ static EStartupState getStartupState() { return gStartupState; };
static void multimediaInit();
// Initialize LLViewerMedia multimedia engine.
@@ -105,8 +105,9 @@ public:
// *HACK: On startup, if we were passed a secondlife://app/do/foo
// command URL, store it for later processing.
-protected:
- static S32 gStartupState; // Do not set directly, use LLStartup::setStartupState
+private:
+ static std::string startupStateToString(EStartupState state);
+ static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState
};
diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp
index 0f092b31c4..bff23590d3 100644
--- a/indra/newview/llstylemap.cpp
+++ b/indra/newview/llstylemap.cpp
@@ -73,3 +73,13 @@ const LLStyleSP &LLStyleMap::lookup(const LLUUID &source)
}
return (*this)[source];
}
+
+void LLStyleMap::update()
+{
+ for (style_map_t::iterator iter = begin(); iter != end(); ++iter)
+ {
+ LLStyleSP &style = iter->second;
+ // Update the link color in case it has been changed.
+ style->setColor(gSavedSettings.getColor4("HTMLLinkColor"));
+ }
+}
diff --git a/indra/newview/llstylemap.h b/indra/newview/llstylemap.h
index 4cff69fc73..fbf12a04a3 100644
--- a/indra/newview/llstylemap.h
+++ b/indra/newview/llstylemap.h
@@ -49,6 +49,9 @@ public:
// Just like the [] accessor but it will add the entry in if it doesn't exist.
const LLStyleSP &lookup(const LLUUID &source);
static LLStyleMap &instance();
+
+ // Forces refresh of the entries, call when something changes (e.g. link color).
+ void update();
};
#endif // LL_LLSTYLE_MAP_H
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 43f8391b55..d83a2ec944 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -459,14 +459,15 @@ void LLGLTexMemBar::draw()
//----------------------------------------------------------------------------
- text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d",
+ text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d mRaw:%d mAux:%d CB:%d",
gImageList.getNumImages(),
LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(),
LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount,
LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(),
LLLFSThread::sLocal->getPending(),
LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(),
- LLImageRaw::sRawImageCount);
+ LLImageRaw::sRawImageCount, LLViewerImage::sRawCount, LLViewerImage::sAuxCount,
+ gImageList.mCallbackList.size());
LLFontGL::sMonospace->renderUTF8(text, 0, 0, line_height*2,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index 22690b550a..11e90e9c84 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -135,12 +135,12 @@ void LLTool::setMouseCapture( BOOL b )
{
if( b )
{
- gViewerWindow->setMouseCapture(mComposite ? mComposite : this );
+ gFocusMgr.setMouseCapture(mComposite ? mComposite : this );
}
else
if( hasMouseCapture() )
{
- gViewerWindow->setMouseCapture( NULL );
+ gFocusMgr.setMouseCapture( NULL );
}
}
diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h
index 3cc7f24712..0113fe808c 100644
--- a/indra/newview/lltool.h
+++ b/indra/newview/lltool.h
@@ -62,6 +62,9 @@ public:
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen);
+
+ virtual EShowToolTip getShowToolTip() { return SHOW_ALWAYS; }; // tools should permit tips even when the mouse is down, as that's pretty normal for tools
+
// Return FALSE to allow context menu to be shown.
virtual void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const
{ *local_x = screen_x; *local_y = screen_y; }
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 109a11755b..fd6d3e77a4 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -42,6 +42,7 @@
#include "llfirstuse.h"
#include "llfloater.h"
#include "llfloatertools.h"
+#include "llfocusmgr.h"
#include "llgesturemgr.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
@@ -52,6 +53,7 @@
#include "llpreviewnotecard.h"
#include "llselectmgr.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llui.h"
#include "llviewerimagelist.h"
#include "llviewerinventory.h"
@@ -70,10 +72,6 @@
// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a
// bit from there to give some pad.
const S32 MAX_ITEMS = 42;
-const char* FOLDER_INCLUDES_ATTACHMENTS_BEING_WORN =
- "Cannot give folders that contain objects that are attached to you.\n"
- "Detach the object(s) and then try again.";
-
// syntactic sugar
#define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember))
@@ -127,41 +125,17 @@ protected:
};
bool LLDroppableItem::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
+ LLInventoryItem* item)
{
bool allowed = false;
if(item)
{
- LLVOAvatar* my_avatar = NULL;
- switch(item->getType())
- {
- case LLAssetType::AT_CALLINGCARD:
- // not allowed
- break;
-
- case LLAssetType::AT_OBJECT:
- my_avatar = gAgent.getAvatarObject();
- if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID()))
- {
- allowed = true;
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(!gAgent.isWearingItem(item->getUUID()))
- {
- allowed = true;
- }
- break;
+ allowed = itemTransferCommonlyAllowed(item);
- default:
- allowed = true;
- break;
- }
- if(mIsTransfer
+ if(allowed
+ && mIsTransfer
&& !item->getPermissions().allowOperationBy(PERM_TRANSFER,
- gAgent.getID()))
+ gAgent.getID()))
{
allowed = false;
}
@@ -182,45 +156,18 @@ public:
};
bool LLUncopyableItems::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
+ LLInventoryItem* item)
{
- BOOL uncopyable = FALSE;
+ bool uncopyable = false;
if(item)
{
- BOOL allowed = FALSE;
- LLVOAvatar* my_avatar = NULL;
- switch(item->getType())
- {
- case LLAssetType::AT_CALLINGCARD:
- // not allowed
- break;
-
- case LLAssetType::AT_OBJECT:
- my_avatar = gAgent.getAvatarObject();
- if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID()))
- {
- allowed = TRUE;
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(!gAgent.isWearingItem(item->getUUID()))
- {
- allowed = TRUE;
- }
- break;
-
- default:
- allowed = TRUE;
- break;
- }
- if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (itemTransferCommonlyAllowed(item) &&
+ !item->getPermissions().allowCopyBy(gAgent.getID()))
{
- uncopyable = TRUE;
+ uncopyable = true;
}
}
- return (uncopyable ? true : false);
+ return uncopyable;
}
class LLDropCopyableItems : public LLInventoryCollectFunctor
@@ -233,45 +180,21 @@ public:
bool LLDropCopyableItems::operator()(
- LLInventoryCategory* cat, LLInventoryItem* item)
+ LLInventoryCategory* cat,
+ LLInventoryItem* item)
{
- BOOL allowed = FALSE;
+ bool allowed = false;
if(item)
{
- LLVOAvatar* my_avatar = NULL;
- switch(item->getType())
- {
- case LLAssetType::AT_CALLINGCARD:
- // not allowed
- break;
-
- case LLAssetType::AT_OBJECT:
- my_avatar = gAgent.getAvatarObject();
- if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID()))
- {
- allowed = TRUE;
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(!gAgent.isWearingItem(item->getUUID()))
- {
- allowed = TRUE;
- }
- break;
-
- default:
- allowed = TRUE;
- break;
- }
- if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID()))
+ allowed = itemTransferCommonlyAllowed(item);
+ if(allowed &&
+ !item->getPermissions().allowCopyBy(gAgent.getID()))
{
// whoops, can't copy it - don't allow it.
- allowed = FALSE;
+ allowed = false;
}
}
- return (allowed ? true : false);
+ return allowed;
}
class LLGiveable : public LLInventoryCollectFunctor
@@ -289,48 +212,26 @@ protected:
bool LLGiveable::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
// All categories can be given.
- if(cat) return TRUE;
- BOOL allowed = FALSE;
+ if (cat)
+ return true;
+
+ bool allowed = false;
if(item)
{
- LLVOAvatar* my_avatar = NULL;
- switch(item->getType())
- {
- case LLAssetType::AT_CALLINGCARD:
- // not allowed
- break;
-
- case LLAssetType::AT_OBJECT:
- my_avatar = gAgent.getAvatarObject();
- if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID()))
- {
- allowed = TRUE;
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(!gAgent.isWearingItem(item->getUUID()))
- {
- allowed = TRUE;
- }
- break;
-
- default:
- allowed = TRUE;
- break;
- }
- if(!item->getPermissions().allowOperationBy(PERM_TRANSFER,
- gAgent.getID()))
+ allowed = itemTransferCommonlyAllowed(item);
+ if(allowed &&
+ !item->getPermissions().allowOperationBy(PERM_TRANSFER,
+ gAgent.getID()))
{
allowed = FALSE;
}
- if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID()))
+ if(allowed &&
+ !item->getPermissions().allowCopyBy(gAgent.getID()))
{
++mCountLosing;
}
}
- return (allowed ? true : false);
+ return allowed;
}
class LLCategoryFireAndForget : public LLInventoryFetchComboObserver
@@ -687,7 +588,7 @@ void LLToolDragAndDrop::beginMultiDrag(
mCursor = UI_CURSOR_NO;
if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
- // find cats in the cargo.
+ // find categories (i.e. inventory folders) in the cargo.
LLInventoryCategory* cat = NULL;
S32 count = llmin(cargo_ids.size(), types.size());
std::set<LLUUID> cat_ids;
@@ -736,7 +637,7 @@ void LLToolDragAndDrop::endDrag()
void LLToolDragAndDrop::onMouseCaptureLost()
{
- // Called whenever the drag ends or if mouse captue is simply lost
+ // Called whenever the drag ends or if mouse capture is simply lost
LLToolMgr::getInstance()->clearTransientTool();
mCargoTypes.clear();
mCargoIDs.clear();
@@ -756,11 +657,8 @@ BOOL LLToolDragAndDrop::handleMouseUp( S32 x, S32 y, MASK mask )
return TRUE;
}
-BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask )
+ECursorType LLToolDragAndDrop::acceptanceToCursor( EAcceptance acceptance )
{
- EAcceptance acceptance = ACCEPT_NO;
- dragOrDrop( x, y, mask, FALSE, &acceptance );
-
switch( acceptance )
{
case ACCEPT_YES_MULTI:
@@ -773,8 +671,16 @@ BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask )
mCursor = UI_CURSOR_ARROWDRAG;
}
break;
- case ACCEPT_YES_SINGLE:
- mCursor = UI_CURSOR_ARROWDRAG;
+ case ACCEPT_YES_SINGLE:
+ if (mCargoIDs.size() > 1)
+ {
+ mToolTipMsg = LLTrans::getString("TooltipMustSingleDrop");
+ mCursor = UI_CURSOR_NO;
+ }
+ else
+ {
+ mCursor = UI_CURSOR_ARROWDRAG;
+ }
break;
case ACCEPT_NO_LOCKED:
@@ -796,7 +702,15 @@ BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask )
}
break;
case ACCEPT_YES_COPY_SINGLE:
- mCursor = UI_CURSOR_ARROWCOPY;
+ if (mCargoIDs.size() > 1)
+ {
+ mToolTipMsg = LLTrans::getString("TooltipMustSingleDrop");
+ mCursor = UI_CURSOR_NO;
+ }
+ else
+ {
+ mCursor = UI_CURSOR_ARROWCOPY;
+ }
break;
case ACCEPT_POSTPONED:
break;
@@ -804,7 +718,17 @@ BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask )
llassert( FALSE );
}
- gViewerWindow->getWindow()->setCursor( mCursor );
+ return mCursor;
+}
+
+BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask )
+{
+ EAcceptance acceptance = ACCEPT_NO;
+ dragOrDrop( x, y, mask, FALSE, &acceptance );
+
+ ECursorType cursor = acceptanceToCursor(acceptance);
+ gViewerWindow->getWindow()->setCursor( cursor );
+
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolDragAndDrop" << llendl;
return TRUE;
}
@@ -826,7 +750,7 @@ BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, std::string& msg, LLRect *st
if (!mToolTipMsg.empty())
{
msg = mToolTipMsg;
- //*stick_rect_screen = gViewerWindow->getWindowRect();
+ //*sticky_rect_screen = gViewerWindow->getWindowRect();
return TRUE;
}
return FALSE;
@@ -845,11 +769,11 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
BOOL handled = FALSE;
- LLView* top_view = gViewerWindow->getTopCtrl();
+ LLView* top_view = gFocusMgr.getTopCtrl();
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
- mToolTipMsg.assign("");
+ mToolTipMsg.clear();
if(top_view)
{
@@ -884,17 +808,15 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
// all objects passed, go ahead and perform drop if necessary
if (handled && drop && (U32)*acceptance >= ACCEPT_YES_COPY_SINGLE)
{
- // drop all items
- if ((U32)*acceptance >= ACCEPT_YES_COPY_MULTI)
- {
- mCurItemIndex = 0;
- }
- // drop just last item
- else
+ if ((U32)*acceptance < ACCEPT_YES_COPY_MULTI &&
+ mCargoIDs.size() > 1)
{
- mCurItemIndex = mCargoIDs.size() - 1;
+ // tried to give multi-cargo to a single-acceptor - refuse and return.
+ *acceptance = ACCEPT_NO;
+ return;
}
- for (; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
+
+ for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
LLInventoryObject* cargo = locateInventory(item, cat);
@@ -943,30 +865,26 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
// all objects passed, go ahead and perform drop if necessary
if (handled && drop && (U32)*acceptance > ACCEPT_NO_LOCKED)
{
- // drop all items
- if ((U32)*acceptance >= ACCEPT_YES_COPY_MULTI)
+ if ((U32)*acceptance < ACCEPT_YES_COPY_MULTI &&
+ mCargoIDs.size() > 1)
{
- mCurItemIndex = 0;
- }
- // drop just last item
- else
- {
- mCurItemIndex = mCargoIDs.size() - 1;
+ // tried to give multi-cargo to a single-acceptor - refuse and return.
+ *acceptance = ACCEPT_NO;
+ return;
}
- for (; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
+
+ for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
LLInventoryObject* cargo = locateInventory(item, cat);
if (cargo)
{
- //S32 local_x, local_y;
-
EAcceptance item_acceptance;
handled = handled && root_view->handleDragAndDrop(x, y, mask, TRUE,
- mCargoTypes[mCurItemIndex],
- (void*)cargo,
- &item_acceptance,
- mToolTipMsg);
+ mCargoTypes[mCurItemIndex],
+ (void*)cargo,
+ &item_acceptance,
+ mToolTipMsg);
}
}
}
@@ -1081,76 +999,36 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
(hit_obj, hit_face, pick_info.mKeyMask, FALSE));
}
- if (LLToolDragAndDrop::getInstance()->mDrop && (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE)
+ if (LLToolDragAndDrop::getInstance()->mDrop &&
+ (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE)
{
- // if target allows multi-drop, go ahead and start iteration at beginning of cargo list
- if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI)
+ // if target allows multi-drop or there is only one item being dropped, go ahead
+ if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI ||
+ LLToolDragAndDrop::getInstance()->mCargoIDs.size() == 1)
{
- LLToolDragAndDrop::getInstance()->mCurItemIndex = 0;
+ // Target accepts multi, or cargo is a single-drop
+ for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0;
+ LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();
+ LLToolDragAndDrop::getInstance()->mCurItemIndex++)
+ {
+ // Call the right implementation function
+ (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),
+ LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target])
+ (hit_obj, hit_face, pick_info.mKeyMask, TRUE);
+ }
}
- // otherwise start at end, to follow selection rules (last selected item is most current)
else
{
- LLToolDragAndDrop::getInstance()->mCurItemIndex = LLToolDragAndDrop::getInstance()->mCargoIDs.size() - 1;
- }
-
- for (; LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();
- LLToolDragAndDrop::getInstance()->mCurItemIndex++)
- {
- // Call the right implementation function
- (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),
- LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target])
- (hit_obj, hit_face, pick_info.mKeyMask, TRUE);
+ // Target does not accept multi, but cargo is multi
+ LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO;
}
}
- switch( LLToolDragAndDrop::getInstance()->mLastAccept )
- {
- case ACCEPT_YES_MULTI:
- if (LLToolDragAndDrop::getInstance()->mCargoIDs.size() > 1)
- {
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWDRAGMULTI;
- }
- else
- {
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWDRAG;
- }
- break;
- case ACCEPT_YES_SINGLE:
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWDRAG;
- break;
-
- case ACCEPT_NO_LOCKED:
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NOLOCKED;
- break;
-
- case ACCEPT_NO:
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO;
- break;
-
- case ACCEPT_YES_COPY_MULTI:
- if (LLToolDragAndDrop::getInstance()->mCargoIDs.size() > 1)
- {
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWCOPYMULTI;
- }
- else
- {
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWCOPY;
- }
- break;
- case ACCEPT_YES_COPY_SINGLE:
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWCOPY;
- break;
- case ACCEPT_POSTPONED:
- break;
- default:
- llassert( FALSE );
- }
+ ECursorType cursor = LLToolDragAndDrop::getInstance()->acceptanceToCursor( LLToolDragAndDrop::getInstance()->mLastAccept );
+ gViewerWindow->getWindow()->setCursor( cursor );
LLToolDragAndDrop::getInstance()->mLastHitPos = pick_info.mPosGlobal;
LLToolDragAndDrop::getInstance()->mLastCameraPos = gAgent.getCameraPositionGlobal();
-
- gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor );
}
// static
@@ -1229,7 +1107,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
else if(!item->getPermissions().allowOperationBy(PERM_TRANSFER,
gAgent.getID()))
{
- // Check that we can add the testure as inventory to the object
+ // Check that we can add the texture as inventory to the object
if (willObjectAcceptInventory(hit_obj,item) < ACCEPT_YES_COPY_SINGLE )
{
return FALSE;
@@ -1605,7 +1483,7 @@ struct LLGiveInventoryInfo
};
void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent,
- LLInventoryItem* item)
+ LLInventoryItem* item)
{
llinfos << "LLToolDragAndDrop::giveInventory()" << llendl;
if(!isInventoryGiveAcceptable(item))
@@ -1621,11 +1499,11 @@ void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent,
{
// ask if the agent is sure.
LLGiveInventoryInfo* info = new LLGiveInventoryInfo(to_agent,
- item->getUUID());
+ item->getUUID());
gViewerWindow->alertXml("CannotCopyWarning",
- &LLToolDragAndDrop::handleCopyProtectedItem,
- (void*)info);
+ &LLToolDragAndDrop::handleCopyProtectedItem,
+ (void*)info);
}
}
@@ -1920,11 +1798,13 @@ BOOL LLToolDragAndDrop::isInventoryGiveAcceptable(LLInventoryItem* item)
}
BOOL copyable = FALSE;
if(item->getPermissions().allowCopyBy(gAgent.getID())) copyable = TRUE;
+
LLVOAvatar* my_avatar = gAgent.getAvatarObject();
if(!my_avatar)
{
return FALSE;
}
+
BOOL acceptable = TRUE;
switch(item->getType())
{
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 8e2788a173..f9e1d75754 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -178,6 +178,9 @@ protected:
EAcceptance dad3dActivateGesture(LLViewerObject *obj, S32 face,
MASK mask, BOOL drop);
+ // set the LLToolDragAndDrop's cursor based on the given acceptance
+ ECursorType acceptanceToCursor( EAcceptance acceptance );
+
// This method converts mCargoID to an inventory item or
// folder. If no item or category is found, both pointers will be
// returned NULL.
@@ -189,9 +192,9 @@ protected:
// LLViewerInventoryItem::item_array_t& items);
void dropObject(LLViewerObject* raycast_target,
- BOOL bypass_sim_raycast,
- BOOL from_task_inventory,
- BOOL remove_from_inventory);
+ BOOL bypass_sim_raycast,
+ BOOL from_task_inventory,
+ BOOL remove_from_inventory);
// accessor that looks at permissions, copyability, and names of
// inventory items to determine if a drop would be ok.
@@ -200,9 +203,9 @@ protected:
// deal with permissions of object, etc. returns TRUE if drop can
// proceed, otherwise FALSE.
static BOOL handleDropTextureProtections(LLViewerObject* hit_obj,
- LLInventoryItem* item,
- LLToolDragAndDrop::ESource source,
- const LLUUID& src_id);
+ LLInventoryItem* item,
+ LLToolDragAndDrop::ESource source,
+ const LLUUID& src_id);
// give inventory item functionality
@@ -213,7 +216,7 @@ protected:
// give inventory category functionality
static void handleCopyProtectedCategory(S32 option, void* data);
static void commitGiveInventoryCategory(const LLUUID& to_agent,
- LLInventoryCategory* cat);
+ LLInventoryCategory* cat);
public:
// helper functions
static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); }
diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp
index e74cd58924..50c6de704a 100644
--- a/indra/newview/lltoolselect.cpp
+++ b/indra/newview/lltoolselect.cpp
@@ -199,9 +199,12 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
select_node->setTransient(TRUE);
}
- for (S32 i = 0; i < (S32)root_object->mChildList.size(); i++)
+ LLViewerObject::const_child_list_t& child_list = root_object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- select_node = selection->findNode(root_object->mChildList[i]);
+ LLViewerObject* child = *iter;
+ select_node = selection->findNode(child);
if (select_node)
{
select_node->setTransient(TRUE);
diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp
index e347affa52..79225f82b0 100644
--- a/indra/newview/lluploaddialog.cpp
+++ b/indra/newview/lluploaddialog.cpp
@@ -85,7 +85,7 @@ LLUploadDialog::LLUploadDialog( const std::string& msg)
setMessage(msg);
// The dialog view is a root view
- gViewerWindow->setTopCtrl( this );
+ gFocusMgr.setTopCtrl( this );
}
void LLUploadDialog::setMessage( const std::string& msg)
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 6b324cae9d..a62bf9b9cf 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -141,6 +141,12 @@ static bool handleAvatarLODChanged(const LLSD& newvalue)
return true;
}
+static bool handleAvatarMaxVisibleChanged(const LLSD& newvalue)
+{
+ LLVOAvatar::sMaxVisible = (U32) newvalue.asInteger();
+ return true;
+}
+
static bool handleTerrainLODChanged(const LLSD& newvalue)
{
LLVOSurfacePatch::sLODFactor = (F32)newvalue.asReal();
@@ -454,6 +460,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _1));
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _1));
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _1));
gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _1));
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 0e83ba1123..99abfb02ee 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -106,7 +106,7 @@ LLFrameTimer gRecentMemoryTime;
// Rendering stuff
void pre_show_depth_buffer();
void post_show_depth_buffer();
-void render_ui_and_swap();
+void render_ui();
void render_hud_attachments();
void render_ui_3d();
void render_ui_2d();
@@ -456,7 +456,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (gDisconnected)
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Disconnected");
- render_ui_and_swap();
+ render_ui();
render_disconnected_background();
}
@@ -760,7 +760,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (!for_snapshot)
{
- render_ui_and_swap();
+ render_ui();
}
LLSpatialGroup::sNoDelete = FALSE;
@@ -931,7 +931,7 @@ BOOL setup_hud_matrices(const LLRect& screen_region)
}
-void render_ui_and_swap()
+void render_ui()
{
LLGLState::checkStates();
diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp
index 0a2e328015..d66d0da5b1 100644
--- a/indra/newview/llviewerjointattachment.cpp
+++ b/indra/newview/llviewerjointattachment.cpp
@@ -129,8 +129,9 @@ void LLViewerJointAttachment::setupDrawable(LLDrawable* drawablep)
}
}
- for (LLViewerObject::child_list_t::iterator iter = mAttachedObject->mChildList.begin();
- iter != mAttachedObject->mChildList.end(); ++iter)
+ LLViewerObject::const_child_list_t& child_list = mAttachedObject->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
LLViewerObject* childp = *iter;
if (childp && childp->mDrawable.notNull())
@@ -208,8 +209,9 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object)
{
object->mText->setOnHUDAttachment(TRUE);
}
- for (LLViewerObject::child_list_t::iterator iter = object->mChildList.begin();
- iter != object->mChildList.end(); ++iter)
+ LLViewerObject::const_child_list_t& child_list = object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
LLViewerObject* childp = *iter;
if (childp && childp->mText.notNull())
@@ -258,8 +260,9 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object)
}
}
- for (LLViewerObject::child_list_t::iterator iter = object->mChildList.begin();
- iter != object->mChildList.end(); ++iter)
+ LLViewerObject::const_child_list_t& child_list = object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
LLViewerObject* childp = *iter;
if (childp && childp->mDrawable.notNull())
@@ -282,8 +285,9 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object)
{
object->mText->setOnHUDAttachment(FALSE);
}
- for (LLViewerObject::child_list_t::iterator iter = object->mChildList.begin();
- iter != object->mChildList.end(); ++iter)
+ LLViewerObject::const_child_list_t& child_list = object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
LLViewerObject* childp = *iter;
if (childp->mText.notNull())
@@ -351,8 +355,9 @@ void LLViewerJointAttachment::clampObjectPosition()
void LLViewerJointAttachment::calcLOD()
{
F32 maxarea = mAttachedObject->getMaxScale() * mAttachedObject->getMidScale();
- for (LLViewerObject::child_list_t::iterator iter = mAttachedObject->mChildList.begin();
- iter != mAttachedObject->mChildList.end(); ++iter)
+ LLViewerObject::const_child_list_t& child_list = mAttachedObject->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
LLViewerObject* childp = *iter;
F32 area = childp->getMaxScale() * childp->getMidScale();
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index 1717153810..96e6da76b6 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -99,6 +99,11 @@ void LLViewerJoystick::setOverrideCamera(bool val)
{
mOverrideCamera = val;
}
+
+ if (mOverrideCamera)
+ {
+ gAgent.changeCameraToDefault();
+ }
}
// -----------------------------------------------------------------------------
@@ -793,14 +798,6 @@ void LLViewerJoystick::moveFlycam(bool reset)
{
cur_delta[i] = -getJoystickAxis(axis[i]);
- // we need smaller camera movements in build mode
- if (in_build_mode)
- {
- if (i == X_I || i == Y_I || i == Z_I)
- {
- cur_delta[i] /= BUILDMODE_FLYCAM_T_SCALE;
- }
- }
F32 tmp = cur_delta[i];
if (absolute)
@@ -817,6 +814,18 @@ void LLViewerJoystick::moveFlycam(bool reset)
{
cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f);
}
+
+ // we need smaller camera movements in build mode
+ // NOTE: this needs to remain after the deadzone calculation, otherwise
+ // we have issues with flycam "jumping" when the build dialog is opened/closed -Nyx
+ if (in_build_mode)
+ {
+ if (i == X_I || i == Y_I || i == Z_I)
+ {
+ cur_delta[i] /= BUILDMODE_FLYCAM_T_SCALE;
+ }
+ }
+
cur_delta[i] *= axis_scale[i];
if (!absolute)
@@ -875,10 +884,16 @@ bool LLViewerJoystick::toggleFlycam()
{
return false;
}
+ if (!mOverrideCamera)
+ {
+ gAgent.changeCameraToDefault();
+ }
+
mOverrideCamera = !mOverrideCamera;
if (mOverrideCamera)
{
moveFlycam(true);
+
}
else if (!LLToolMgr::getInstance()->inBuildMode())
{
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 3f57b26fec..f5d822f2e3 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -536,7 +536,7 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data )
init_data->setBrowserComponentDir( component_dir );
std::string profile_name("Second Life");
init_data->setBrowserProfileName( profile_name );
- init_data->setBrowserParentWindow( gViewerWindow->getPlatformWindow() );
+ init_data->setBrowserParentWindow( gViewerWindow->getMediaWindow() );
// We use a custom user agent with viewer version and skin name.
LLViewerMediaImpl::updateBrowserUserAgent();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 771a71c5c5..5d2b8e43ba 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -128,6 +128,7 @@
#include "llfloaterwater.h"
#include "llfloaterwindlight.h"
#include "llfloaterworldmap.h"
+#include "llfloatermemleak.h"
#include "llframestats.h"
#include "llframestatview.h"
#include "llfasttimerview.h"
@@ -493,6 +494,8 @@ BOOL enable_not_thirdperson(void*);
BOOL enable_have_card(void*);
BOOL enable_detach(void*);
BOOL enable_region_owner(void*);
+void menu_toggle_attached_lights(void* user_data);
+void menu_toggle_attached_particles(void* user_data);
class LLLandmarkObserver : public LLInventoryObserver
{
@@ -1434,6 +1437,23 @@ void init_debug_rendering_menu(LLMenuGL* menu)
item = new LLMenuItemCheckGL("Cheesy Beacon", menu_toggle_control, NULL, menu_check_control, (void*)"CheesyBeacon");
menu->append(item);
+
+ item = new LLMenuItemCheckGL("Attached Lights", menu_toggle_attached_lights, NULL, menu_check_control, (void*)"RenderAttachedLights");
+ menu->append(item);
+
+ item = new LLMenuItemCheckGL("Attached Particles", menu_toggle_attached_particles, NULL, menu_check_control, (void*)"RenderAttachedParticles");
+ menu->append(item);
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ menu->appendSeparator();
+ menu->append(new LLMenuItemCallGL("Memory Leaking Simulation", LLFloaterMemLeak::show, NULL, NULL));
+#else
+ if(gSavedSettings.getBOOL("QAMode"))
+ {
+ menu->appendSeparator();
+ menu->append(new LLMenuItemCallGL("Memory Leaking Simulation", LLFloaterMemLeak::show, NULL, NULL));
+ }
+#endif
menu->createJumpKeys();
}
@@ -1771,35 +1791,62 @@ class LLViewCheckBuildMode : public view_listener_t
bool toggle_build_mode()
{
- if (LLToolMgr::getInstance()->inEdit())
+ if (LLToolMgr::getInstance()->inBuildMode())
{
- // just reset the view, will pull us out of edit mode
- handle_reset_view();
-
+ if (gSavedSettings.getBOOL("EditCameraMovement"))
+ {
+ // just reset the view, will pull us out of edit mode
+ handle_reset_view();
+ }
+ else
+ {
+ // manually disable edit mode, but do not affect the camera
+ gAgent.resetView(false);
+ gFloaterTools->close();
+ gViewerWindow->showCursor();
+ }
// avoid spurious avatar movements pulling out of edit mode
LLViewerJoystick::getInstance()->moveAvatar(true);
}
else
{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ ECameraMode camMode = gAgent.getCameraMode();
+ if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode)
{
- handle_toggle_flycam();
+ // pull the user out of mouselook or appearance mode when entering build mode
+ handle_reset_view();
}
-
- if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") )
+
+ if (gSavedSettings.getBOOL("EditCameraMovement"))
{
- // zoom in if we're looking at the avatar
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
- gAgent.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis()));
- gAgent.cameraZoomIn(0.666f);
- gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ // camera should be set
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ handle_toggle_flycam();
+ }
+
+ if (gAgent.getFocusOnAvatar())
+ {
+ // zoom in if we're looking at the avatar
+ gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgent.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis()));
+ gAgent.cameraZoomIn(0.666f);
+ gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ }
}
+
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() );
// Could be first use
LLFirstUse::useBuild();
+
+ gAgent.resetView(false);
+
+ // avoid spurious avatar movements
+ LLViewerJoystick::getInstance()->moveAvatar(true);
+
}
return true;
}
@@ -2880,8 +2927,12 @@ class LLEditEnableCustomizeAvatar : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
- bool new_value = gAgent.getWearablesLoaded();
- gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
+ LLVOAvatar* avatar = gAgent.getAvatarObject();
+
+ bool enabled = ((avatar && avatar->isFullyLoaded()) &&
+ (gAgent.getWearablesLoaded()));
+
+ gMenuHolder->findControl(userdata["control"].asString())->setValue(enabled);
return true;
}
};
@@ -6000,9 +6051,12 @@ BOOL object_selected_and_point_valid(void *user_data)
{
LLSelectNode* node = *iter;
LLViewerObject* object = node->getObject();
- for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++ )
+ LLViewerObject::const_child_list_t& child_list = object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- if (object->mChildList[child_num]->isAvatar())
+ LLViewerObject* child = *iter;
+ if (child->isAvatar())
{
return FALSE;
}
@@ -6383,6 +6437,18 @@ BOOL enable_land_selected( void* )
return !(LLViewerParcelMgr::getInstance()->selectionEmpty());
}
+void menu_toggle_attached_lights(void* user_data)
+{
+ menu_toggle_control(user_data);
+ LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
+}
+
+void menu_toggle_attached_particles(void* user_data)
+{
+ menu_toggle_control(user_data);
+ LLPipeline::sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
+}
+
class LLSomethingSelected : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index d440491661..9146acb750 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2666,7 +2666,7 @@ static void display_release_message(S32, void* data)
void process_agent_movement_complete(LLMessageSystem* msg, void**)
{
- gAgentMovementCompleted = TRUE;
+ gAgentMovementCompleted = true;
LLUUID agent_id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 8745a73e79..461a21d51a 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -96,6 +96,7 @@
#include "pipeline.h"
#include "llviewernetwork.h"
#include "llvowlsky.h"
+#include "llmanip.h"
//#define DEBUG_UPDATE_TYPE
@@ -402,13 +403,10 @@ void LLViewerObject::dump() const
mNameValuePairs[key]->printNameValue(buffer);
llinfos << buffer << llendl;
}
-
- S32 i;
-
- LLViewerObject *child;
- for (i = 0; i < mChildList.size(); i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- child = mChildList[i];
+ LLViewerObject* child = *iter;
llinfos << " child " << child->getID() << llendl;
}
*/
@@ -555,20 +553,16 @@ void LLViewerObject::removeChild(LLViewerObject *childp)
}
}
-LLViewerObject::child_list_t& LLViewerObject::getChildren()
-{
- return mChildList;
-}
-
void LLViewerObject::addThisAndAllChildren(LLDynamicArray<LLViewerObject*>& objects)
{
objects.put(this);
- S32 count = mChildList.size();
- for(S32 i = 0; i < count; i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- if (!mChildList[i]->isAvatar())
+ LLViewerObject* child = *iter;
+ if (!child->isAvatar())
{
- (mChildList[i])->addThisAndAllChildren(objects);
+ child->addThisAndAllChildren(objects);
}
}
}
@@ -581,24 +575,25 @@ void LLViewerObject::addThisAndNonJointChildren(LLDynamicArray<LLViewerObject*>&
{
return;
}
- S32 count = mChildList.size();
- for(S32 i = 0; i < count; i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- if ( (!mChildList[i]->isAvatar())
- && (!mChildList[i]->isJointChild()))
+ LLViewerObject* child = *iter;
+ if ( (!child->isAvatar()) && (!child->isJointChild()))
{
- (mChildList[i])->addThisAndNonJointChildren(objects);
+ child->addThisAndNonJointChildren(objects);
}
}
}
BOOL LLViewerObject::isChild(LLViewerObject *childp) const
{
- S32 count = mChildList.size();
- for(S32 i = 0; i < count; i++)
+ for (child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- const LLViewerObject *testChildp = &(*mChildList[i]);
- if (testChildp == childp) return TRUE;
+ LLViewerObject* testchild = *iter;
+ if (testchild == childp)
+ return TRUE;
}
return FALSE;
}
@@ -607,11 +602,11 @@ BOOL LLViewerObject::isChild(LLViewerObject *childp) const
// returns TRUE if at least one avatar is sitting on this object
BOOL LLViewerObject::isSeat() const
{
- S32 count = mChildList.size();
- for(S32 i = 0; i < count; i++)
+ for (child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- const LLViewerObject *childp = &(*mChildList[i]);
- if (childp->isAvatar())
+ LLViewerObject* child = *iter;
+ if (child->isAvatar())
{
return TRUE;
}
@@ -1844,7 +1839,19 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
||(this_update_precision > mBestUpdatePrecision))))
{
mBestUpdatePrecision = this_update_precision;
- setPositionParent(new_pos_parent);
+
+ LLVector3 diff = new_pos_parent - test_pos_parent ;
+ F32 mag_sqr = diff.magVecSquared() ;
+ if(llfinite(mag_sqr))
+ {
+ setPositionParent(new_pos_parent);
+ }
+ else
+ {
+ llwarns << "Can not move the object/avatar to an infinite location!" << llendl ;
+
+ retval |= INVALID_UPDATE ;
+ }
if (mParent && ((LLViewerObject*)mParent)->isAvatar())
{
@@ -1915,11 +1922,11 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,
// Additionally, if any child is selected, need to update the dialogs and selection
// center.
BOOL needs_refresh = mUserSelected;
- LLViewerObject *childp;
- for (U32 i = 0; i < mChildList.size(); i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- childp = mChildList[i];
- needs_refresh = needs_refresh || childp->mUserSelected;
+ LLViewerObject* child = *iter;
+ needs_refresh = needs_refresh || child->mUserSelected;
}
if (needs_refresh)
@@ -2892,13 +2899,20 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
getTEImage(i)->setBoostLevel(LLViewerImage::BOOST_SELECTED);
}
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID sculpt_id = sculpt_params->getSculptTexture();
+ gImageList.getImage(sculpt_id)->setBoostLevel(LLViewerImage::BOOST_SELECTED);
+ }
+
if (boost_children)
{
- S32 num_children = mChildList.size();
- for (i = 0; i < num_children; i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- LLViewerObject *childp = mChildList[i];
- childp->boostTexturePriority();
+ LLViewerObject* child = *iter;
+ child->boostTexturePriority();
}
}
}
@@ -3996,9 +4010,11 @@ S32 LLViewerObject::countInventoryContents(LLAssetType::EType type)
void LLViewerObject::setCanSelect(BOOL canSelect)
{
mbCanSelect = canSelect;
- for (U32 i = 0; i < mChildList.size(); i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- mChildList[i]->mbCanSelect = canSelect;
+ LLViewerObject* child = *iter;
+ child->mbCanSelect = canSelect;
}
}
@@ -4551,9 +4567,11 @@ void LLViewerObject::setDrawableState(U32 state, BOOL recursive)
}
if (recursive)
{
- for (U32 i = 0; i < mChildList.size(); i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- mChildList[i]->setDrawableState(state, recursive);
+ LLViewerObject* child = *iter;
+ child->setDrawableState(state, recursive);
}
}
}
@@ -4566,9 +4584,11 @@ void LLViewerObject::clearDrawableState(U32 state, BOOL recursive)
}
if (recursive)
{
- for (U32 i = 0; i < mChildList.size(); i++)
+ for (child_list_t::iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
{
- mChildList[i]->clearDrawableState(state, recursive);
+ LLViewerObject* child = *iter;
+ child->clearDrawableState(state, recursive);
}
}
}
@@ -4803,7 +4823,7 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp)
mLatestRecvPacketID = 0;
mRegionp = regionp;
- for (child_list_t::iterator i = getChildren().begin(); i != getChildren().end(); ++i)
+ for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i)
{
LLViewerObject* child = *i;
child->setRegion(regionp);
@@ -4937,3 +4957,141 @@ void LLStaticViewerObject::updateDrawable(BOOL force_damped)
}
clearChanged(SHIFTED);
}
+
+void LLViewerObject::saveUnselectedChildrenPosition(std::vector<LLVector3>& positions)
+{
+ if(mChildList.empty() || !positions.empty())
+ {
+ return ;
+ }
+
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ positions.push_back(childp->getPositionEdit());
+ }
+ }
+
+ return ;
+}
+
+void LLViewerObject::saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations)
+{
+ if(mChildList.empty())
+ {
+ return ;
+ }
+
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ rotations.push_back(childp->getRotationEdit());
+ }
+ }
+
+ return ;
+}
+
+//counter-rotation
+void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations,
+ const std::vector<LLVector3>& positions)
+{
+ if(mChildList.empty())
+ {
+ return ;
+ }
+
+ S32 index = 0 ;
+ LLQuaternion inv_rotation = ~getRotationEdit() ;
+ LLVector3 offset = getPositionEdit() ;
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+ {
+ childp->setRotation(rotations[index] * inv_rotation);
+ childp->setPosition((positions[index] - offset) * inv_rotation);
+ LLManip::rebuild(childp);
+ }
+ else //avatar
+ {
+ LLVector3 reset_pos = (positions[index] - offset) * inv_rotation ;
+ LLQuaternion reset_rot = rotations[index] * inv_rotation ;
+
+ ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
+ ((LLVOAvatar*)childp)->mDrawable->mXform.setRotation(reset_rot) ;
+
+ ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos, TRUE);
+ ((LLVOAvatar*)childp)->mDrawable->getVObj()->setRotation(reset_rot, TRUE) ;
+
+ LLManip::rebuild(childp);
+ }
+ index++;
+ }
+ }
+
+ return ;
+}
+
+//counter-translation
+void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified)
+{
+ if(mChildList.empty())
+ {
+ return ;
+ }
+
+ LLVector3 child_offset;
+ if(simplified) //translation only, rotation matrix does not change
+ {
+ child_offset = offset * ~getRotation();
+ }
+ else //rotation matrix might change too.
+ {
+ if (isAttachment() && mDrawable.notNull())
+ {
+ LLXform* attachment_point_xform = mDrawable->getXform()->getParent();
+ LLQuaternion parent_rotation = getRotation() * attachment_point_xform->getWorldRotation();
+ child_offset = offset * ~parent_rotation;
+ }
+ else
+ {
+ child_offset = offset * ~getRenderRotation();
+ }
+ }
+
+ for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin();
+ iter != mChildList.end(); iter++)
+ {
+ LLViewerObject* childp = *iter;
+ if (!childp->isSelected() && childp->mDrawable.notNull())
+ {
+ if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)
+ {
+ childp->setPosition(childp->getPosition() + child_offset);
+ LLManip::rebuild(childp);
+ }
+ else //avatar
+ {
+ LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ;
+
+ ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos);
+ ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos);
+
+ LLManip::rebuild(childp);
+ }
+ }
+ }
+
+ return ;
+}
+
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 1fd4a29238..b6ff60ef9d 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -129,7 +129,8 @@ protected:
std::map<U16, ExtraParameter*> mExtraParameterList;
public:
- typedef std::vector<LLPointer<LLViewerObject> > child_list_t;
+ typedef std::list<LLPointer<LLViewerObject> > child_list_t;
+ typedef const child_list_t const_child_list_t;
LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp);
MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
@@ -153,7 +154,7 @@ public:
enum { MEDIA_TYPE_NONE = 0, MEDIA_TYPE_WEB_PAGE = 1 };
// Return codes for processUpdateMessage
- enum { MEDIA_URL_REMOVED = 0x1, MEDIA_URL_ADDED = 0x2, MEDIA_URL_UPDATED = 0x4 };
+ enum { MEDIA_URL_REMOVED = 0x1, MEDIA_URL_ADDED = 0x2, MEDIA_URL_UPDATED = 0x4, INVALID_UPDATE = 0x80000000 };
virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
void **user_data,
@@ -212,7 +213,8 @@ public:
U32 getLocalID() const { return mLocalID; }
U32 getCRC() const { return mTotalCRC; }
- virtual BOOL isFlexible() const { return false; }
+ virtual BOOL isFlexible() const { return FALSE; }
+ virtual BOOL isSculpted() const { return FALSE; }
// This method returns true if the object is over land owned by
// the agent.
@@ -234,7 +236,8 @@ public:
virtual void setParent(LLViewerObject* parent);
virtual void addChild(LLViewerObject *childp);
virtual void removeChild(LLViewerObject *childp);
- child_list_t& getChildren();
+ const_child_list_t& getChildren() const { return mChildList; }
+ S32 numChildren() const { return mChildList.size(); }
void addThisAndAllChildren(LLDynamicArray<LLViewerObject*>& objects);
void addThisAndNonJointChildren(LLDynamicArray<LLViewerObject*>& objects);
BOOL isChild(LLViewerObject *childp) const;
@@ -472,6 +475,16 @@ public:
friend class LLViewerObjectList;
friend class LLViewerMediaList;
+public:
+ //counter-translation
+ void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ;
+ //counter-rotation
+ void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations,
+ const std::vector<LLVector3>& positions) ;
+ void saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) ;
+ void saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) ;
+ std::vector<LLVector3> mUnselectedChildrenPositions ;
+
private:
ExtraParameter* createNewParameterEntry(U16 param_type);
ExtraParameter* getExtraParameterEntry(U16 param_type) const;
@@ -496,7 +509,6 @@ public:
LL_VO_WL_SKY = LL_PCODE_APP | 0xb0, // should this be moved to 0x40?
} EVOType;
- child_list_t mChildList;
LLUUID mID;
// unique within region, not unique across regions
@@ -575,6 +587,8 @@ protected:
typedef std::map<char *, LLNameValue *> name_value_map_t;
name_value_map_t mNameValuePairs; // Any name-value pairs stored by script
+ child_list_t mChildList;
+
F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation
F64 mLastMessageUpdateSecs; // Last update from a message from the simulator
TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index a37120451e..6d0137663c 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1163,9 +1163,11 @@ void LLViewerObjectList::generatePickList(LLCamera &camera)
if (objectp)
{
mSelectPickList.insert(objectp);
- for (U32 i = 0; i < objectp->mChildList.size(); i++)
+ LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLViewerObject* childp = objectp->mChildList[i];
+ LLViewerObject* childp = *iter;
if (childp)
{
mSelectPickList.insert(childp);
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index ccf7a5d1d7..779ef0a3c6 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -44,6 +44,7 @@
#include "llworld.h"
#include "pipeline.h"
#include "llspatialpartition.h"
+#include "llvovolume.h"
const F32 PART_SIM_BOX_SIDE = 16.f;
const F32 PART_SIM_BOX_OFFSET = 0.5f*PART_SIM_BOX_SIDE;
@@ -169,6 +170,10 @@ LLViewerPartGroup::~LLViewerPartGroup()
cleanup();
S32 count = (S32) mParticles.size();
+ for(S32 i = 0 ; i < count ; i++)
+ {
+ delete mParticles[i] ;
+ }
mParticles.clear();
LLViewerPartSim::decPartCount(count);
@@ -240,151 +245,150 @@ BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size)
void LLViewerPartGroup::updateParticles(const F32 lastdt)
{
LLMemType mt(LLMemType::MTYPE_PARTICLES);
- S32 i;
F32 dt;
LLVector3 gravity(0.f, 0.f, GRAVITY);
LLViewerRegion *regionp = getRegion();
S32 end = (S32) mParticles.size();
- for (i = 0; i < end; i++)
+ for (S32 i = 0 ; i < (S32)mParticles.size();)
{
LLVector3 a(0.f, 0.f, 0.f);
- LLViewerPart& part = *((LLViewerPart*) mParticles[i]);
+ LLViewerPart* part = mParticles[i] ;
- dt=lastdt+mSkippedTime-part.mSkipOffset;
- part.mSkipOffset=0.f;
+ dt = lastdt + mSkippedTime - part->mSkipOffset;
+ part->mSkipOffset = 0.f;
// Update current time
- const F32 cur_time = part.mLastUpdateTime + dt;
- const F32 frac = cur_time/part.mMaxAge;
+ const F32 cur_time = part->mLastUpdateTime + dt;
+ const F32 frac = cur_time / part->mMaxAge;
// "Drift" the object based on the source object
- if (part.mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK)
+ if (part->mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK)
{
- part.mPosAgent = part.mPartSourcep->mPosAgent;
- part.mPosAgent += part.mPosOffset;
+ part->mPosAgent = part->mPartSourcep->mPosAgent;
+ part->mPosAgent += part->mPosOffset;
}
// Do a custom callback if we have one...
- if (part.mVPCallback)
+ if (part->mVPCallback)
{
- (*part.mVPCallback)(part, dt);
+ (*part->mVPCallback)(*part, dt);
}
- if (part.mFlags & LLPartData::LL_PART_WIND_MASK)
+ if (part->mFlags & LLPartData::LL_PART_WIND_MASK)
{
- LLVector3 tempVel(part.mVelocity);
- part.mVelocity *= 1.f - 0.1f*dt;
- part.mVelocity += 0.1f*dt*regionp->mWind.getVelocity(regionp->getPosRegionFromAgent(part.mPosAgent));
+ LLVector3 tempVel(part->mVelocity);
+ part->mVelocity *= 1.f - 0.1f*dt;
+ part->mVelocity += 0.1f*dt*regionp->mWind.getVelocity(regionp->getPosRegionFromAgent(part->mPosAgent));
}
// Now do interpolation towards a target
- if (part.mFlags & LLPartData::LL_PART_TARGET_POS_MASK)
+ if (part->mFlags & LLPartData::LL_PART_TARGET_POS_MASK)
{
- F32 remaining = part.mMaxAge - part.mLastUpdateTime;
+ F32 remaining = part->mMaxAge - part->mLastUpdateTime;
F32 step = dt / remaining;
step = llclamp(step, 0.f, 0.1f);
step *= 5.f;
// we want a velocity that will result in reaching the target in the
// Interpolate towards the target.
- LLVector3 delta_pos = part.mPartSourcep->mTargetPosAgent - part.mPosAgent;
+ LLVector3 delta_pos = part->mPartSourcep->mTargetPosAgent - part->mPosAgent;
delta_pos /= remaining;
- part.mVelocity *= (1.f - step);
- part.mVelocity += step*delta_pos;
+ part->mVelocity *= (1.f - step);
+ part->mVelocity += step*delta_pos;
}
- if (part.mFlags & LLPartData::LL_PART_TARGET_LINEAR_MASK)
+ if (part->mFlags & LLPartData::LL_PART_TARGET_LINEAR_MASK)
{
- LLVector3 delta_pos = part.mPartSourcep->mTargetPosAgent - part.mPartSourcep->mPosAgent;
- part.mPosAgent = part.mPartSourcep->mPosAgent;
- part.mPosAgent += frac*delta_pos;
- part.mVelocity = delta_pos;
+ LLVector3 delta_pos = part->mPartSourcep->mTargetPosAgent - part->mPartSourcep->mPosAgent;
+ part->mPosAgent = part->mPartSourcep->mPosAgent;
+ part->mPosAgent += frac*delta_pos;
+ part->mVelocity = delta_pos;
}
else
{
// Do velocity interpolation
- part.mPosAgent += dt*part.mVelocity;
- part.mPosAgent += 0.5f*dt*dt*part.mAccel;
- part.mVelocity += part.mAccel*dt;
+ part->mPosAgent += dt*part->mVelocity;
+ part->mPosAgent += 0.5f*dt*dt*part->mAccel;
+ part->mVelocity += part->mAccel*dt;
}
// Do a bounce test
- if (part.mFlags & LLPartData::LL_PART_BOUNCE_MASK)
+ if (part->mFlags & LLPartData::LL_PART_BOUNCE_MASK)
{
// Need to do point vs. plane check...
// For now, just check relative to object height...
- F32 dz = part.mPosAgent.mV[VZ] - part.mPartSourcep->mPosAgent.mV[VZ];
+ F32 dz = part->mPosAgent.mV[VZ] - part->mPartSourcep->mPosAgent.mV[VZ];
if (dz < 0)
{
- part.mPosAgent.mV[VZ] += -2.f*dz;
- part.mVelocity.mV[VZ] *= -0.75f;
+ part->mPosAgent.mV[VZ] += -2.f*dz;
+ part->mVelocity.mV[VZ] *= -0.75f;
}
}
// Reset the offset from the source position
- if (part.mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK)
+ if (part->mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK)
{
- part.mPosOffset = part.mPosAgent;
- part.mPosOffset -= part.mPartSourcep->mPosAgent;
+ part->mPosOffset = part->mPosAgent;
+ part->mPosOffset -= part->mPartSourcep->mPosAgent;
}
// Do color interpolation
- if (part.mFlags & LLPartData::LL_PART_INTERP_COLOR_MASK)
+ if (part->mFlags & LLPartData::LL_PART_INTERP_COLOR_MASK)
{
- part.mColor.setVec(part.mStartColor);
+ part->mColor.setVec(part->mStartColor);
// note: LLColor4's v%k means multiply-alpha-only,
// LLColor4's v*k means multiply-rgb-only
- part.mColor *= 1.f - frac; // rgb*k
- part.mColor %= 1.f - frac; // alpha*k
- part.mColor += frac%(frac*part.mEndColor); // rgb,alpha
+ part->mColor *= 1.f - frac; // rgb*k
+ part->mColor %= 1.f - frac; // alpha*k
+ part->mColor += frac%(frac*part->mEndColor); // rgb,alpha
}
// Do scale interpolation
- if (part.mFlags & LLPartData::LL_PART_INTERP_SCALE_MASK)
+ if (part->mFlags & LLPartData::LL_PART_INTERP_SCALE_MASK)
{
- part.mScale.setVec(part.mStartScale);
- part.mScale *= 1.f - frac;
- part.mScale += frac*part.mEndScale;
+ part->mScale.setVec(part->mStartScale);
+ part->mScale *= 1.f - frac;
+ part->mScale += frac*part->mEndScale;
}
// Set the last update time to now.
- part.mLastUpdateTime = cur_time;
+ part->mLastUpdateTime = cur_time;
// Kill dead particles (either flagged dead, or too old)
- if ((part.mLastUpdateTime > part.mMaxAge) || (LLViewerPart::LL_PART_DEAD_MASK == part.mFlags))
+ if ((part->mLastUpdateTime > part->mMaxAge) || (LLViewerPart::LL_PART_DEAD_MASK == part->mFlags))
{
- end--;
- LLPointer<LLViewerPart>::swap(mParticles[i], mParticles[end]);
- // be sure to process the particle we just swapped-in
- i--;
+ mParticles[i] = mParticles.back() ;
+ mParticles.pop_back() ;
+ delete part ;
}
else
{
- F32 desired_size = calc_desired_size(part.mPosAgent, part.mScale);
- if (!posInGroup(part.mPosAgent, desired_size))
+ F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale);
+ if (!posInGroup(part->mPosAgent, desired_size))
{
// Transfer particles between groups
- LLViewerPartSim::getInstance()->put(&part);
- end--;
- LLPointer<LLViewerPart>::swap(mParticles[i], mParticles[end]);
- // be sure to process the particle we just swapped-in
- i--;
+ LLViewerPartSim::getInstance()->put(part) ;
+ mParticles[i] = mParticles.back() ;
+ mParticles.pop_back() ;
+ }
+ else
+ {
+ i++ ;
}
}
}
- S32 removed = (S32)mParticles.size() - end;
+ S32 removed = end - (S32)mParticles.size();
if (removed > 0)
{
// we removed one or more particles, so flag this group for update
- mParticles.erase(mParticles.begin() + end, mParticles.end());
if (mVOPartGroupp.notNull())
{
gPipeline.markRebuild(mVOPartGroupp->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
@@ -408,9 +412,7 @@ void LLViewerPartGroup::shift(const LLVector3 &offset)
mMinObjPos += offset;
mMaxObjPos += offset;
- S32 count = (S32) mParticles.size();
- S32 i;
- for (i = 0; i < count; i++)
+ for (S32 i = 0 ; i < (S32)mParticles.size(); i++)
{
mParticles[i]->mPosAgent += offset;
}
@@ -419,8 +421,8 @@ void LLViewerPartGroup::shift(const LLVector3 &offset)
void LLViewerPartGroup::removeParticlesByID(const U32 source_id)
{
LLMemType mt(LLMemType::MTYPE_PARTICLES);
- S32 end = (S32) mParticles.size();
- for (int i = 0; i < end; i++)
+
+ for (S32 i = 0; i < (S32)mParticles.size(); i++)
{
if(mParticles[i]->mPartSourcep->getID() == source_id)
{
@@ -500,42 +502,57 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
{
LLMemType mt(LLMemType::MTYPE_PARTICLES);
const F32 MAX_MAG = 1000000.f*1000000.f; // 1 million
+ LLViewerPartGroup *return_group = NULL ;
if (part->mPosAgent.magVecSquared() > MAX_MAG || !part->mPosAgent.isFinite())
{
#if 0 && !LL_RELEASE_FOR_DOWNLOAD
llwarns << "LLViewerPartSim::put Part out of range!" << llendl;
llwarns << part->mPosAgent << llendl;
#endif
- return NULL;
}
-
- F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale);
+ else
+ {
+ F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale);
- S32 count = (S32) mViewerPartGroups.size();
- for (S32 i = 0; i < count; i++)
- {
- if (mViewerPartGroups[i]->addPart(part, desired_size))
+ S32 count = (S32) mViewerPartGroups.size();
+ for (S32 i = 0; i < count; i++)
{
- // We found a spatial group that we fit into, add us and exit
- return mViewerPartGroups[i];
+ if (mViewerPartGroups[i]->addPart(part, desired_size))
+ {
+ // We found a spatial group that we fit into, add us and exit
+ return_group = mViewerPartGroups[i];
+ break ;
+ }
+ }
+
+ // Hmm, we didn't fit in any of the existing spatial groups
+ // Create a new one...
+ if(!return_group)
+ {
+ llassert_always(part->mPosAgent.isFinite());
+ LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size);
+ groupp->mUniformParticles = (part->mScale.mV[0] == part->mScale.mV[1] &&
+ !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK));
+ if (!groupp->addPart(part))
+ {
+ llwarns << "LLViewerPartSim::put - Particle didn't go into its box!" << llendl;
+ llinfos << groupp->getCenterAgent() << llendl;
+ llinfos << part->mPosAgent << llendl;
+ mViewerPartGroups.pop_back() ;
+ delete groupp;
+ groupp = NULL ;
+ }
+ return_group = groupp;
}
}
- // Hmm, we didn't fit in any of the existing spatial groups
- // Create a new one...
- llassert_always(part->mPosAgent.isFinite());
- LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size);
- groupp->mUniformParticles = (part->mScale.mV[0] == part->mScale.mV[1] &&
- !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK));
- if (!groupp->addPart(part))
+ if(!return_group) //failed to insert the particle
{
- llwarns << "LLViewerPartSim::put - Particle didn't go into its box!" << llendl;
- llinfos << groupp->getCenterAgent() << llendl;
- llinfos << part->mPosAgent << llendl;
- delete groupp;
- return NULL;
+ delete part ;
+ part = NULL ;
}
- return groupp;
+
+ return return_group ;
}
LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size)
@@ -614,7 +631,24 @@ void LLViewerPartSim::updateSimulation()
if (!mViewerPartSources[i]->isDead())
{
- mViewerPartSources[i]->update(dt);
+ BOOL upd = TRUE;
+ if (!LLPipeline::sRenderAttachedParticles)
+ {
+ LLViewerObject* vobj = mViewerPartSources[i]->mSourceObjectp;
+ if (vobj && (vobj->getPCode() == LL_PCODE_VOLUME))
+ {
+ LLVOVolume* vvo = (LLVOVolume *)vobj;
+ if (vvo && vvo->isAttachment())
+ {
+ upd = FALSE;
+ }
+ }
+ }
+
+ if (upd)
+ {
+ mViewerPartSources[i]->update(dt);
+ }
}
if (mViewerPartSources[i]->isDead())
@@ -630,7 +664,6 @@ void LLViewerPartSim::updateSimulation()
num_updates++;
}
-
count = (S32) mViewerPartGroups.size();
for (i = 0; i < count; i++)
{
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index daccac4e8f..de763d3e53 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -52,9 +52,9 @@ typedef void (*LLVPCallback)(LLViewerPart &part, const F32 dt);
//
-class LLViewerPart : public LLPartData, public LLRefCount
+class LLViewerPart : public LLPartData
{
-protected:
+public:
~LLViewerPart();
public:
LLViewerPart();
@@ -100,7 +100,7 @@ public:
void shift(const LLVector3 &offset);
- typedef std::vector<LLPointer<LLViewerPart> > part_list_t;
+ typedef std::vector<LLViewerPart*> part_list_t;
part_list_t mParticles;
const LLVector3 &getCenterAgent() const { return mCenterAgent; }
diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp
index b6f16d1002..9bdebbbd38 100644
--- a/indra/newview/llviewerpartsource.cpp
+++ b/indra/newview/llviewerpartsource.cpp
@@ -278,7 +278,7 @@ void LLViewerPartSourceScript::update(const F32 dt)
continue;
}
- LLPointer<LLViewerPart> part = new LLViewerPart();
+ LLViewerPart* part = new LLViewerPart();
part->init(this, mImagep, NULL);
part->mFlags = mPartSysData.mPartData.mFlags;
@@ -569,7 +569,7 @@ void LLViewerPartSourceSpiral::update(const F32 dt)
{
mPosAgent = mSourceObjectp->getRenderPosition();
}
- LLPointer<LLViewerPart> part = new LLViewerPart();
+ LLViewerPart* part = new LLViewerPart();
part->init(this, mImagep, updatePart);
part->mStartColor = mColor;
part->mEndColor = mColor;
@@ -717,7 +717,7 @@ void LLViewerPartSourceBeam::update(const F32 dt)
mImagep = gImageList.getImageFromFile("pixiesmall.j2c");
}
- LLPointer<LLViewerPart> part = new LLViewerPart();
+ LLViewerPart* part = new LLViewerPart();
part->init(this, mImagep, NULL);
part->mFlags = LLPartData::LL_PART_INTERP_COLOR_MASK |
@@ -834,7 +834,7 @@ void LLViewerPartSourceChat::update(const F32 dt)
{
mPosAgent = mSourceObjectp->getRenderPosition();
}
- LLPointer<LLViewerPart> part = new LLViewerPart();
+ LLViewerPart* part = new LLViewerPart();
part->init(this, mImagep, updatePart);
part->mStartColor = mColor;
part->mEndColor = mColor;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index d060d2593c..42ea36baec 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -233,7 +233,7 @@ void LLViewerRegion::initStats()
mPacketsLost = 0;
mLastPacketsLost = 0;
mPingDelay = 0;
- mAlive = FALSE; // can become false if circuit disconnects
+ mAlive = false; // can become false if circuit disconnects
}
LLViewerRegion::~LLViewerRegion()
@@ -808,11 +808,11 @@ void LLViewerRegion::updateNetStats()
LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
if (!cdp)
{
- mAlive = FALSE;
+ mAlive = false;
return;
}
- mAlive = TRUE;
+ mAlive = true;
mDeltaTime = dt;
mLastPacketsIn = mPacketsIn;
@@ -900,6 +900,11 @@ F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos)
return mLandp->resolveHeightRegion( region_pos );
}
+bool LLViewerRegion::isAlive()
+{
+ return mAlive;
+}
+
BOOL LLViewerRegion::isOwnedSelf(const LLVector3& pos)
{
if (mParcelOverlay)
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 8c3115f78d..e2ba5b1636 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -123,6 +123,8 @@ public:
inline BOOL getAllowTerraform() const;
inline BOOL getRestrictPushObject() const;
+ bool isAlive(); // can become false if circuit disconnects
+
void setWaterHeight(F32 water_level);
F32 getWaterHeight() const;
@@ -286,8 +288,6 @@ public:
LLCloudLayer mCloudLayer;
LLViewerParcelOverlay *mParcelOverlay;
- BOOL mAlive; // can become false if circuit disconnects
-
LLStat mBitStat;
LLStat mPacketsStat;
LLStat mPacketsLostStat;
@@ -302,7 +302,7 @@ public:
LLDynamicArray<U32> mMapAvatars;
LLDynamicArray<LLUUID> mMapAvatarIDs;
-protected:
+private:
// The surfaces and other layers
LLSurface* mLandp;
@@ -375,6 +375,8 @@ protected:
LLEventPoll* mEventPoll;
private:
+ bool mAlive; // can become false if circuit disconnects
+
//spatial partitions for objects in this region
std::vector<LLSpatialPartition*> mObjectPartition;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index fe0f3f12a6..f69f4fbb62 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -418,6 +418,7 @@ void LLViewerShaderMgr::setShaders()
mVertexShaderLevel[SHADER_OBJECT] = 0;
mVertexShaderLevel[SHADER_EFFECT] = 0;
mVertexShaderLevel[SHADER_WINDLIGHT] = 0;
+ mVertexShaderLevel[SHADER_AVATAR] = 0;
}
}
else
@@ -431,6 +432,7 @@ void LLViewerShaderMgr::setShaders()
mVertexShaderLevel[SHADER_OBJECT] = 0;
mVertexShaderLevel[SHADER_EFFECT] = 0;
mVertexShaderLevel[SHADER_WINDLIGHT] = 0;
+ mVertexShaderLevel[SHADER_AVATAR] = 0;
}
if (gViewerWindow)
@@ -476,6 +478,8 @@ void LLViewerShaderMgr::unloadShaders()
mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
mVertexShaderLevel[SHADER_WATER] = 0;
mVertexShaderLevel[SHADER_INTERFACE] = 0;
+ mVertexShaderLevel[SHADER_EFFECT] = 0;
+ mVertexShaderLevel[SHADER_WINDLIGHT] = 0;
gPipeline.mVertexShadersLoaded = 0;
}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 4c575ff139..299785d590 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -29,17 +29,17 @@
* $/LicenseInfo$
*/
+// system library includes
+#include <stdio.h>
+#include <iostream>
+#include <fstream>
+
#include "llviewerprecompiledheaders.h"
#include "llpanellogin.h"
#include "llviewerkeyboard.h"
#include "llviewerwindow.h"
-// system library includes
-#include <stdio.h>
-#include <iostream>
-#include <fstream>
-
#include "llviewquery.h"
#include "llxmltree.h"
//#include "llviewercamera.h"
@@ -47,9 +47,6 @@
#include "llvoiceclient.h" // for push-to-talk button handling
-#ifdef SABINRIG
-#include "cbw.h"
-#endif //SABINRIG
//
// TODO: Many of these includes are unnecessary. Remove them.
@@ -60,6 +57,7 @@
#include "indra_constants.h"
#include "llassetstorage.h"
#include "llfontgl.h"
+#include "llmousehandler.h"
#include "llrect.h"
#include "llsky.h"
#include "llstring.h"
@@ -191,7 +189,7 @@
//
// Globals
//
-void render_ui_and_swap();
+void render_ui();
LLBottomPanel* gBottomPanel = NULL;
extern BOOL gDebugClicks;
@@ -237,34 +235,9 @@ const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before co
const F32 MAX_FAST_FRAME_TIME = 0.5f;
const F32 FAST_FRAME_INCREMENT = 0.1f;
-const F32 MIN_DISPLAY_SCALE = 0.85f;
+const F32 MIN_DISPLAY_SCALE = 0.75f;
const S32 CONSOLE_BOTTOM_PAD = 40;
-#ifdef SABINRIG
-/// ALL RIG STUFF
-bool rigControl = false;
-bool voltDisplay = true;
-bool nominalX = false;
-bool nominalY = false;
-static F32 nomerX = 0.0f;
-static F32 nomerY = 0.0f;
-const BOARD_NUM = 0; // rig stuff!
-const ADRANGE = BIP10VOLTS; // rig stuff!
-static unsigned short DataVal; // rig stuff!
-static F32 oldValueX = 0;
-static F32 newValueX = 50;
-static F32 oldValueY = 0;
-static F32 newValueY = 50;
-static S32 mouseX = 50;
-static S32 mouseY = 50;
-static float VoltageX = 50; // rig stuff!
-static float VoltageY = 50; // rig stuff!
-static float nVoltX = 0;
-static float nVoltY = 0;
-static F32 temp1 = 50.f;
-static F32 temp2 = 20.f;
-LLCoordGL new_gl;
-#endif //SABINRIG
std::string LLViewerWindow::sSnapshotBaseName;
std::string LLViewerWindow::sSnapshotDir;
@@ -273,81 +246,6 @@ std::string LLViewerWindow::sMovieBaseName;
extern void toggle_debug_menus(void*);
-#ifdef SABINRIG
-// static
-void LLViewerWindow::printFeedback()
-{
- if(rigControl == true)
- {
- cbAIn (BOARD_NUM, 0, ADRANGE, &DataVal);
- cbToEngUnits (BOARD_NUM,ADRANGE,DataVal,&VoltageX); //Convert raw to voltage for X-axis
- cbAIn (BOARD_NUM, 1, ADRANGE, &DataVal);
- cbToEngUnits (BOARD_NUM,ADRANGE,DataVal,&VoltageY); //Convert raw to voltage for Y-axis
- if(voltDisplay == true)
- {
- llinfos << "Current Voltages - X:" << VoltageX << " Y:" << VoltageY << llendl; //Display voltage
- }
-
- if(nVoltX == 0)
- {
- nVoltX = VoltageX;
- nVoltY = VoltageY; //First time setup of nominal values.
- }
-
- newValueX = VoltageX;
- newValueY = VoltageY; //Take in current voltage and set to a separate value for adjustment.
-
- mouseX = mCurrentMousePoint.mX;
- mouseY = mCurrentMousePoint.mY; //Take in current cursor position and set to separate value for adjustment.
-
- if( abs(newValueX - nVoltX) > nomerX )
- {
- if( (newValueX - oldValueX) < 0)
- {
- mouseX += (S32)( ((newValueX - oldValueX)*.5)) * -temp;
- }
- else
- {
- mouseX += (S32)( ((newValueX - oldValueX)*.5) * temp1);
- }
- }
- else
- {
- mouseX = getWindowWidth() / 2;
- }
- if( abs(newValueY - nVoltY) > nomerY )
- {
- if( (newValueY - oldValueY) < 0)
- {
- mouseY += (S32)( ((newValueY - oldValueY)*(newValueY - oldValueY)) * -temp2);
- }
- else
- {
- mouseY += (S32)( ((newValueY - oldValueY)*(newValueY - oldValueY)) * temp2);
- }
- }
- else
- {
- mouseY = getWindowHeight() / 2;
- }
- //mouseX += (S32)( (newValueX - nVoltX) * temp1 + 0.5 );
- // (newValueX - oldValueX) = difference between current position and nominal position
- // * temp1 = the amplification of the number that sets sensitivity
- // + 0.5 = fixes rounding errors
-
-
- //mouseY += (S32)( (newValueY - nVoltY) * temp2 + 0.5 ); //Algorithm to adjust voltage for mouse adjustment.
-
- oldValueX = newValueX;
- oldValueY = newValueY;
-
- new_gl.mX = mouseX;
- new_gl.mY = mouseY; //Setup final coordinate to move mouse to.
-
- setCursorPosition(new_gl); //Set final cursor position
- }
-}
-#endif //SABINRIG
////////////////////////////////////////////////////////////////////////////
//
@@ -635,6 +533,21 @@ void LLViewerWindow::updateDebugText()
// LLViewerWindow
//
+bool LLViewerWindow::shouldShowToolTipFor(LLMouseHandler *mh)
+{
+ if (mToolTip && mh)
+ {
+ LLMouseHandler::EShowToolTip showlevel = mh->getShowToolTip();
+
+ return (
+ showlevel == LLMouseHandler::SHOW_ALWAYS ||
+ (showlevel == LLMouseHandler::SHOW_IF_NOT_BLOCKED &&
+ !mToolTipBlocked)
+ );
+ }
+ return false;
+}
+
BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
{
S32 x = pos.mX;
@@ -664,11 +577,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
gMouseIdleTimer.reset();
// Hide tooltips on mousedown
- if( mToolTip )
- {
- mToolTipBlocked = TRUE;
- mToolTip->setVisible( FALSE );
- }
+ mToolTipBlocked = TRUE;
// Also hide hover info on mousedown
if (gHoverView)
@@ -708,7 +617,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
}
else
{
- setTopCtrl(NULL);
+ gFocusMgr.setTopCtrl(NULL);
}
}
@@ -791,7 +700,7 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma
}
else
{
- setTopCtrl(NULL);
+ gFocusMgr.setTopCtrl(NULL);
}
}
@@ -981,7 +890,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK
}
else
{
- setTopCtrl(NULL);
+ gFocusMgr.setTopCtrl(NULL);
}
}
@@ -1154,13 +1063,9 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask
gAgent.clearAFK();
}
- if(mToolTip && mouse_actually_moved)
+ if(mouse_actually_moved)
{
- mToolTipBlocked = FALSE; // Blocking starts on keyboard events and (only) ends here.
- if( mToolTip->getVisible() && !mToolTipStickyRect.pointInRect( x, y ) )
- {
- mToolTip->setVisible( FALSE );
- }
+ mToolTipBlocked = FALSE;
}
// Activate the hover picker on mouse move.
@@ -2395,11 +2300,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
}
// Hide tooltips on keypress
- if(mToolTip )
- {
- mToolTipBlocked = TRUE; // block until next time mouse is moved
- mToolTip->setVisible( FALSE );
- }
+ mToolTipBlocked = TRUE; // block until next time mouse is moved
// Also hide hover info on keypress
if (gHoverView)
@@ -2432,22 +2333,8 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
}
// handle escape key
- if (key == KEY_ESCAPE && mask == MASK_NONE)
- {
- if (gMenuHolder && gMenuHolder->hideMenus())
- {
- return TRUE;
- }
-
- //if quit from menu, turn off the Keyboardmode for the menu.
- if(LLMenuGL::getKeyboardMode())
- LLMenuGL::setKeyboardMode(FALSE);
-
- if (gFocusMgr.getTopCtrl())
- {
- gFocusMgr.setTopCtrl(NULL);
- return TRUE;
- }
+ //if (key == KEY_ESCAPE && mask == MASK_NONE)
+ //{
// *TODO: get this to play well with mouselook and hidden
// cursor modes, etc, and re-enable.
@@ -2456,7 +2343,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
// gFocusMgr.setMouseCapture(NULL);
// return TRUE;
//}
- }
+ //}
// let menus handle navigation keys
if (gMenuBarView && gMenuBarView->handleKey(key, mask, TRUE))
@@ -2890,7 +2777,6 @@ BOOL LLViewerWindow::handlePerFrameHover()
}
- //llinfos << (mToolTipBlocked ? "BLOCKED" : "NOT BLOCKED") << llendl;
// Show a new tool tip (or update one that is alrady shown)
BOOL tool_tip_handled = FALSE;
std::string tool_tip_msg;
@@ -2902,38 +2788,48 @@ BOOL LLViewerWindow::handlePerFrameHover()
tooltip_delay = gSavedSettings.getF32( "DragAndDropToolTipDelay" );
}
if( handled &&
- !mToolTipBlocked &&
- (gMouseIdleTimer.getElapsedTimeF32() > tooltip_delay) &&
- !mWindow->isCursorHidden() )
+ gMouseIdleTimer.getElapsedTimeF32() > tooltip_delay &&
+ !mWindow->isCursorHidden() )
{
LLRect screen_sticky_rect;
-
+ LLMouseHandler *mh;
+ S32 local_x, local_y;
if (mouse_captor)
{
- S32 local_x, local_y;
- 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 );
+ mouse_captor->screenPointToLocal(x, y, &local_x, &local_y);
+ mh = mouse_captor;
}
else if (handled_by_top_ctrl)
{
- S32 local_x, local_y;
- 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 );
+ top_ctrl->screenPointToLocal(x, y, &local_x, &local_y);
+ mh = top_ctrl;
}
else
{
- tool_tip_handled = mRootView->handleToolTip(x, y, tool_tip_msg, &screen_sticky_rect );
+ local_x = x; local_y = y;
+ mh = mRootView;
}
- if( tool_tip_handled && !tool_tip_msg.empty() )
+ BOOL tooltip_vis = FALSE;
+ if (shouldShowToolTipFor(mh))
{
- mToolTipStickyRect = screen_sticky_rect;
- mToolTip->setWrappedText( tool_tip_msg, 200 );
- mToolTip->reshapeToFitText();
- mToolTip->setOrigin( x, y );
- LLRect virtual_window_rect(0, getWindowHeight(), getWindowWidth(), 0);
- mToolTip->translateIntoRect( virtual_window_rect, FALSE );
- mToolTip->setVisible( TRUE );
+ tool_tip_handled = mh->handleToolTip(local_x, local_y, tool_tip_msg, &screen_sticky_rect );
+
+ if( tool_tip_handled && !tool_tip_msg.empty() )
+ {
+ mToolTipStickyRect = screen_sticky_rect;
+ mToolTip->setWrappedText( tool_tip_msg, 200 );
+ mToolTip->reshapeToFitText();
+ mToolTip->setOrigin( x, y );
+ LLRect virtual_window_rect(0, getWindowHeight(), getWindowWidth(), 0);
+ mToolTip->translateIntoRect( virtual_window_rect, FALSE );
+ tooltip_vis = TRUE;
+ }
+ }
+
+ if (mToolTip)
+ {
+ mToolTip->setVisible( tooltip_vis );
}
}
@@ -4014,7 +3910,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
else
{
display(do_rebuild, 1.0f, 0, TRUE);
- render_ui_and_swap();
+ render_ui();
}
S32 glformat, gltype, glpixel_length ;
@@ -4239,7 +4135,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
{
display(do_rebuild, scale_factor, subimage_x+(subimage_y*llceil(scale_factor)), TRUE);
// Required for showing the GUI in snapshots? See DEV-16350 for details. JC
- render_ui_and_swap();
+ render_ui();
}
S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width);
@@ -4395,39 +4291,6 @@ void LLViewerWindow::drawMouselookInstructions()
}
-// These functions are here only because LLViewerWindow used to do the work that gFocusMgr does now.
-// They let other objects continue to work without change.
-
-void LLViewerWindow::setKeyboardFocus(LLUICtrl* new_focus)
-{
- gFocusMgr.setKeyboardFocus( new_focus );
-}
-
-LLUICtrl* LLViewerWindow::getKeyboardFocus()
-{
- return gFocusMgr.getKeyboardFocus();
-}
-
-BOOL LLViewerWindow::hasKeyboardFocus(const LLUICtrl* possible_focus) const
-{
- return possible_focus == gFocusMgr.getKeyboardFocus();
-}
-
-BOOL LLViewerWindow::childHasKeyboardFocus(const LLView* parent) const
-{
- return gFocusMgr.childHasKeyboardFocus( parent );
-}
-
-void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor)
-{
- gFocusMgr.setMouseCapture( new_captor );
-}
-
-LLMouseHandler* LLViewerWindow::getMouseCaptor() const
-{
- return gFocusMgr.getMouseCapture();
-}
-
S32 LLViewerWindow::getWindowHeight() const
{
return mVirtualWindowRect.getHeight();
@@ -4448,21 +4311,6 @@ S32 LLViewerWindow::getWindowDisplayWidth() const
return mWindowRect.getWidth();
}
-LLUICtrl* LLViewerWindow::getTopCtrl() const
-{
- return gFocusMgr.getTopCtrl();
-}
-
-BOOL LLViewerWindow::hasTopCtrl(LLView* view) const
-{
- return view == gFocusMgr.getTopCtrl();
-}
-
-void LLViewerWindow::setTopCtrl(LLUICtrl* new_top)
-{
- gFocusMgr.setTopCtrl( new_top );
-}
-
void LLViewerWindow::setupViewport(S32 x_offset, S32 y_offset)
{
gGLViewport[0] = x_offset;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index c7d02cb720..30a9d91de9 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -51,14 +51,13 @@
class LLView;
class LLViewerObject;
class LLUUID;
-class LLMouseHandler;
class LLProgressView;
class LLTool;
class LLVelocityBar;
-class LLViewerWindow;
class LLTextBox;
class LLImageRaw;
class LLHUDIcon;
+class LLMouseHandler;
#define PICK_HALF_WIDTH 5
#define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1)
@@ -192,6 +191,7 @@ public:
LLWindow* getWindow() const { return mWindow; }
void* getPlatformWindow() const { return mWindow->getPlatformWindow(); }
+ void* getMediaWindow() const { return mWindow->getMediaWindow(); }
void focusClient() const { return mWindow->focusClient(); };
LLCoordGL getLastMouse() const { return mLastMousePoint; }
@@ -210,9 +210,6 @@ public:
const LLPickInfo& getLastPick() const { return mLastPick; }
const LLPickInfo& getHoverPick() const { return mHoverPick; }
- LLUICtrl* getTopCtrl() const;
- BOOL hasTopCtrl(LLView* view) const;
-
void setupViewport(S32 x_offset = 0, S32 y_offset = 0);
void setup3DRender();
void setup2DRender();
@@ -261,24 +258,10 @@ public:
void setNormalControlsVisible( BOOL visible );
void setMenuBackgroundColor(bool god_mode = false, bool dev_grid = false);
- // Handle the application becoming active (frontmost) or inactive
- //BOOL handleActivate(BOOL activate);
-
- void setKeyboardFocus(LLUICtrl* new_focus); // new_focus = NULL to release the focus.
- LLUICtrl* getKeyboardFocus();
- BOOL hasKeyboardFocus( const LLUICtrl* possible_focus ) const;
- BOOL childHasKeyboardFocus( const LLView* parent ) const;
-
- void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse.
- LLMouseHandler* getMouseCaptor() const;
-
- 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();
@@ -368,12 +351,8 @@ public:
static bool alertCallback(S32 modal);
-#ifdef SABINRIG
- //Silly rig stuff
- void printFeedback(); //RIG STUFF!
-#endif //SABINRIG
-
private:
+ bool shouldShowToolTipFor(LLMouseHandler *mh);
void switchToolByMask(MASK mask);
void destroyWindow();
void drawMouselookInstructions();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 47090d5c65..9bdf842ad6 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -138,7 +138,7 @@ S32 LLVOAvatar::sFreezeCounter = 0 ;
//-----------------------------------------------------------------------------
// Constants
//-----------------------------------------------------------------------------
-const F32 MIN_PIXEL_AREA_FOR_COMPOSITE = 200.f;
+const F32 MIN_PIXEL_AREA_FOR_COMPOSITE = 1024;
F32 SHADOW_OFFSET_AMT = 0.03f;
@@ -673,6 +673,10 @@ LLVOAvatar::LLVOAvatar(
mUpperMaskTexName(0),
mLowerMaskTexName(0),
mCulled( FALSE ),
+ mVisibilityRank(0),
+ mFadeTime(0.f),
+ mLastFadeTime(0.f),
+ mLastFadeDistance(1.f),
mTexSkinColor( NULL ),
mTexHairColor( NULL ),
mTexEyeColor( NULL ),
@@ -731,6 +735,7 @@ LLVOAvatar::LLVOAvatar(
mNeedsAnimUpdate = TRUE;
mImpostorDistance = 0;
+ mImpostorPixelArea = 0;
setNumTEs(TEX_NUM_ENTRIES);
@@ -1528,6 +1533,8 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
}
}
+ mPixelArea = LLPipeline::calcPixelArea((newMin+newMax)*0.5f, (newMax-newMin)*0.5f, *LLViewerCamera::getInstance());
+
//stretch bounding box by attachments
for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
@@ -2338,6 +2345,15 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
// Do base class updates...
U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
+ if(retval & LLViewerObject::INVALID_UPDATE)
+ {
+ if(this == gAgent.getAvatarObject())
+ {
+ //tell sim to cancel this update
+ gAgent.teleportViaLocation(gAgent.getPositionGlobal());
+ }
+ }
+
//llinfos << getRotation() << llendl;
//llinfos << getPosition() << llendl;
if (update_type == OUT_FULL )
@@ -2642,7 +2658,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)
F32 old_angle = mImpostorAngle.mV[i];
F32 angle_diff = fabsf(cur_angle-old_angle);
- if (angle_diff > 3.14159f/512.f*distance)
+ if (angle_diff > 3.14159f/512.f*distance*mUpdatePeriod)
{
mNeedsImpostorUpdate = TRUE;
}
@@ -3362,30 +3378,41 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
// the rest should only be done occasionally for far away avatars
//--------------------------------------------------------------------
- if (!mIsSelf && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter)
+ if (visible && !mIsSelf && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter)
{
F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f);
if (LLMuteList::getInstance()->isMuted(getID()))
- {
+ { // muted avatars update at 16 hz
mUpdatePeriod = 16;
- visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
}
- else if (visible && mPixelArea <= impostor_area)
- {
- mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mPixelArea), 2, 8);
-
- visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
+ else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible * 0.25f)
+ { //first 25% of max visible avatars are not impostored
+ mUpdatePeriod = 1;
+ }
+ else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.75f)
+ { //back 25% of max visible avatars are slow updating impostors
+ mUpdatePeriod = 8;
+ }
+ else if (visible && mImpostorPixelArea <= impostor_area)
+ { // stuff in between gets an update period based on pixel area
+ mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8);
+ }
+ else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.25f)
+ { // force nearby impostors in ultra crowded areas
+ mUpdatePeriod = 2;
}
else
- {
+ { // not impostored
mUpdatePeriod = 1;
}
- if (!visible)
- {
- updateMotions(LLCharacter::HIDDEN_UPDATE);
- return FALSE;
- }
+ visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
+ }
+
+ if (!visible)
+ {
+ updateMotions(LLCharacter::HIDDEN_UPDATE);
+ return FALSE;
}
// change animation time quanta based on avatar render load
@@ -3758,32 +3785,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
mRoot.updateWorldMatrixChildren();
- // Send the speaker position to the spatialized voice system.
- if(mIsSelf)
- {
- LLMatrix3 rot;
- LLVector3d pos;
-#if 1
- // character rotation (stable, shouldn't move with animations)
- rot = mRoot.getWorldRotation().getMatrix3();
-#else
- // actual head rotation (moves with animations, probably a bit too much)
- rot.setRows(
- LLVector3::x_axis * mSkullp->getWorldRotation(),
- LLVector3::y_axis * mSkullp->getWorldRotation(),
- LLVector3::z_axis * mSkullp->getWorldRotation());
-#endif
-
- pos = getPositionGlobal();
- pos += LLVector3d(mHeadOffset);
-
- // MBW -- XXX -- Setting velocity to 0 for now. May figure it out later...
- gVoiceClient->setAvatarPosition(
- pos, // position
- LLVector3::zero, // velocity
- rot); // rotation matrix
- }
-
if (!mDebugText.size() && mText.notNull())
{
mText->markDead();
@@ -4254,7 +4255,23 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)
LLGLEnable test(GL_ALPHA_TEST);
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
- gGL.color4f(1,1,1,1);
+ F32 blend = gFrameTimeSeconds - mFadeTime;
+
+ LLGLState gl_blend(GL_BLEND, blend < 1.f ? TRUE : FALSE);
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ F32 alpha;
+ if (mVisibilityRank >= (U32) LLVOAvatar::sMaxVisible)
+ { //fade out
+ alpha = 1.f - llmin(blend, 1.f);
+ }
+ else
+ { //fade in
+ alpha = llmin(blend, 1.f);
+ }
+
+ color.mV[3] = (U8) (alpha*255);
+
gGL.color4ubv(color.mV);
mImpostor.bindTexture();
gGL.begin(LLVertexBuffer::QUADS);
@@ -4380,7 +4397,6 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
const LLTextureEntry *te = getTE(i);
F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
-// BOOL boost_aux = (imagep->needsAux() && (!imagep->mFullWidth || !imagep->mFullHeight));
S32 boost_level = mIsSelf ? LLViewerImage::BOOST_AVATAR_BAKED_SELF : LLViewerImage::BOOST_AVATAR_BAKED;
// Spam if this is a baked texture, not set to default image, without valid host info
@@ -5750,7 +5766,7 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
LLVector3 center = (ext[1] + ext[0]) * 0.5f;
LLVector3 size = (ext[1]-ext[0])*0.5f;
- mPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
+ mImpostorPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
F32 range = mDrawable->mDistanceWRTCamera;
@@ -6199,9 +6215,11 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
stopMotionFromSource(viewer_object->getID());
LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE);
- for (S32 i = 0; i < (S32)viewer_object->mChildList.size(); i++)
+ LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLViewerObject* child_objectp = viewer_object->mChildList[i];
+ LLViewerObject* child_objectp = *iter;
// the simulator should automatically handle
// permissions revocation
@@ -6243,6 +6261,10 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
mDrawable->mXform.setPosition(rel_pos);
mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot);
+ //in case the viewerobject is not updated in time
+ mDrawable->getVObj()->setPosition(sit_object->getWorldPosition()) ;
+ mDrawable->getVObj()->setRotation(sit_object->getWorldRotation()) ;
+
gPipeline.markMoved(mDrawable, TRUE);
mIsSitting = TRUE;
mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject
@@ -6284,9 +6306,11 @@ void LLVOAvatar::getOffObject()
stopMotionFromSource(sit_object->getID());
LLFollowCamMgr::setCameraActive(sit_object->getID(), FALSE);
- for (S32 i = 0; i < (S32)sit_object->mChildList.size(); i++)
+ LLViewerObject::const_child_list_t& child_list = sit_object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLViewerObject* child_objectp = sit_object->mChildList[i];
+ LLViewerObject* child_objectp = *iter;
stopMotionFromSource(child_objectp->getID());
LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE);
@@ -6299,7 +6323,11 @@ void LLVOAvatar::getOffObject()
// set *local* position based on last *world* position, since we're unparenting the avatar
mDrawable->mXform.setPosition(cur_position_world);
- mDrawable->mXform.setRotation(cur_rotation_world);
+ mDrawable->mXform.setRotation(cur_rotation_world);
+
+ //in case the viewerobject is not updated from sim in time
+ mDrawable->getVObj()->setPosition(cur_position_world);
+ mDrawable->getVObj()->setRotation(cur_rotation_world);
gPipeline.markMoved(mDrawable, TRUE);
@@ -6750,7 +6778,9 @@ void LLVOAvatar::dumpTotalLocalTextureByteCount()
BOOL LLVOAvatar::isVisible()
{
- return mDrawable.notNull() && (mDrawable->isVisible() || mIsDummy);
+ return mDrawable.notNull()
+ && (mDrawable->isVisible() || mIsDummy)
+ && (mVisibilityRank < (U32) sMaxVisible || gFrameTimeSeconds - mFadeTime < 1.f);
}
@@ -7184,9 +7214,8 @@ void LLVOAvatar::updateMeshTextures()
{
mHeadBakedLoaded = FALSE;
mHeadMaskDiscard = -1;
- baked->setNeedsAux(TRUE);
- baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
- baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
+ baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
+ baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) );
}
}
else
@@ -7235,9 +7264,8 @@ void LLVOAvatar::updateMeshTextures()
{
mUpperBakedLoaded = FALSE;
mUpperMaskDiscard = -1;
- baked->setNeedsAux(TRUE);
- baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
- baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
+ baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
+ baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) );
}
}
else
@@ -7283,9 +7311,8 @@ void LLVOAvatar::updateMeshTextures()
{
mLowerBakedLoaded = FALSE;
mLowerMaskDiscard = -1;
- baked->setNeedsAux(TRUE);
- baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
- baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
+ baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
+ baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) );
}
}
else
@@ -7329,7 +7356,7 @@ void LLVOAvatar::updateMeshTextures()
else
{
mEyesBakedLoaded = FALSE;
- baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
+ baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) );
}
}
else
@@ -7372,7 +7399,7 @@ void LLVOAvatar::updateMeshTextures()
else
{
mSkirtBakedLoaded = FALSE;
- baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
+ baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) );
}
}
else
@@ -7473,7 +7500,7 @@ void LLVOAvatar::setLocalTexture( ELocTexIndex idx, LLViewerImage* tex, BOOL bak
}
else
{
- tex->setLoadedCallback( onLocalTextureLoaded, desired_discard, TRUE, new LLAvatarTexData(getID(), idx) );
+ tex->setLoadedCallback( onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), idx) );
}
}
tex->setMinDiscardLevel(desired_discard);
@@ -8274,9 +8301,12 @@ LLBBox LLVOAvatar::getHUDBBox()
bbox.addPointLocal(hud_object->getPosition());
// add rotated bounding box for attached object
bbox.addBBoxAgent(hud_object->getBoundingBoxAgent());
- for (U32 i = 0; i < hud_object->mChildList.size(); i++)
+ LLViewerObject::const_child_list_t& child_list = hud_object->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- bbox.addBBoxAgent(hud_object->mChildList[i]->getBoundingBoxAgent());
+ LLViewerObject* child_objectp = *iter;
+ bbox.addBBoxAgent(child_objectp->getBoundingBoxAgent());
}
}
}
@@ -8309,41 +8339,38 @@ void LLVOAvatar::onFirstTEMessageReceived()
{
mLastHeadBakedID = getTEImage( TEX_HEAD_BAKED )->getID();
LLViewerImage* image = getTEImage( TEX_HEAD_BAKED );
- image->setNeedsAux(TRUE);
- image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
- image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
+ image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
+ image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) );
}
if( upper_baked )
{
mLastUpperBodyBakedID = getTEImage( TEX_UPPER_BAKED )->getID();
LLViewerImage* image = getTEImage( TEX_UPPER_BAKED );
- image->setNeedsAux(TRUE);
- image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
- image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
+ image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
+ image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) );
}
if( lower_baked )
{
mLastLowerBodyBakedID = getTEImage( TEX_LOWER_BAKED )->getID();
LLViewerImage* image = getTEImage( TEX_LOWER_BAKED );
- image->setNeedsAux(TRUE);
- image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
- image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
+ image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
+ image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) );
}
if( eyes_baked )
{
mLastEyesBakedID = getTEImage( TEX_EYES_BAKED )->getID();
LLViewerImage* image = getTEImage( TEX_EYES_BAKED );
- image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
+ image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) );
}
if( skirt_baked )
{
mLastSkirtBakedID = getTEImage( TEX_SKIRT_BAKED )->getID();
LLViewerImage* image = getTEImage( TEX_SKIRT_BAKED );
- image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
+ image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) );
}
updateMeshTextures();
@@ -8355,6 +8382,12 @@ void LLVOAvatar::onFirstTEMessageReceived()
//-----------------------------------------------------------------------------
void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
{
+ if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages"))
+ {
+ llwarns << "Blocking AvatarAppearance message" << llendl;
+ return;
+ }
+
LLMemType mt(LLMemType::MTYPE_AVATAR);
// llinfos << "processAvatarAppearance start " << mID << llendl;
@@ -8846,6 +8879,42 @@ void LLVOAvatar::dumpArchetypeXML( void* )
}
+U32 LLVOAvatar::getVisibilityRank()
+{
+ return mVisibilityRank;
+}
+
+void LLVOAvatar::setVisibilityRank(U32 rank)
+{
+ BOOL stale = gFrameTimeSeconds - mLastFadeTime > 10.f;
+
+ //only raise visibility rank or trigger a fade out every 10 seconds
+ if (mVisibilityRank >= (U32) LLVOAvatar::sMaxVisible && rank < (U32) LLVOAvatar::sMaxVisible ||
+ (stale && mVisibilityRank < (U32) LLVOAvatar::sMaxVisible && rank >= (U32) LLVOAvatar::sMaxVisible))
+ { //remember the time we became visible/invisible based on visibility rank
+ mVisibilityRank = rank;
+ mLastFadeTime = gFrameTimeSeconds;
+ mLastFadeDistance = mDrawable->mDistanceWRTCamera;
+
+ F32 blend = gFrameTimeSeconds - mFadeTime;
+ mFadeTime = gFrameTimeSeconds;
+ if (blend < 1.f)
+ { //move the blend time back if a blend is already in progress (prevent flashes)
+ mFadeTime -= 1.f-blend;
+ }
+ }
+ else if (stale)
+ {
+ mLastFadeTime = gFrameTimeSeconds;
+ mLastFadeDistance = mDrawable->mDistanceWRTCamera;
+ mVisibilityRank = rank;
+ }
+ else
+ {
+ mVisibilityRank = llmin(mVisibilityRank, rank);
+ }
+}
+
// Assumes LLVOAvatar::sInstances has already been sorted.
S32 LLVOAvatar::getUnbakedPixelAreaRank()
{
@@ -8875,8 +8944,8 @@ void LLVOAvatar::cullAvatarsByPixelArea()
std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater());
// Update the avatars that have changed status
- S32 rank = 1;
-
+ S32 comp_rank = 1;
+ U32 rank = 0;
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
{
@@ -8892,8 +8961,8 @@ void LLVOAvatar::cullAvatarsByPixelArea()
}
else
{
- culled = (rank > LLVOAvatar::sMaxOtherAvatarsToComposite) || (inst->mPixelArea < MIN_PIXEL_AREA_FOR_COMPOSITE);
- rank++;
+ culled = (comp_rank > LLVOAvatar::sMaxOtherAvatarsToComposite) || (inst->mPixelArea < MIN_PIXEL_AREA_FOR_COMPOSITE);
+ comp_rank++;
}
if( inst->mCulled != culled )
@@ -8904,6 +8973,15 @@ void LLVOAvatar::cullAvatarsByPixelArea()
inst->updateMeshTextures();
}
+
+ if (inst->isSelf())
+ {
+ inst->setVisibilityRank(0);
+ }
+ else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible())
+ {
+ inst->setVisibilityRank(rank++);
+ }
}
if( LLVOAvatar::areAllNearbyInstancesBaked() )
@@ -9867,9 +9945,20 @@ U32 calc_shame(LLVOVolume* volume, std::set<LLUUID> &textures)
shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
- for (U32 i = 0; i < drawablep->getChildCount(); ++i)
+ LLViewerObject::const_child_list_t& child_list = volume->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- shame += calc_shame(drawablep->getChild(i)->getVOVolume(), textures);
+ LLViewerObject* child_objectp = *iter;
+ LLDrawable* child_drawablep = child_objectp->mDrawable;
+ if (child_drawablep)
+ {
+ LLVOVolume* child_volumep = child_drawablep->getVOVolume();
+ if (child_volumep)
+ {
+ shame += calc_shame(child_volumep, textures);
+ }
+ }
}
return shame;
@@ -9916,3 +10005,4 @@ void LLVOAvatar::idleUpdateRenderCost()
mText->setColor(LLColor4(red,green,0,1));
}
+
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index ff846c8d83..2ed0f1ec9b 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -439,6 +439,8 @@ public:
BOOL isCulled() { return mCulled; }
S32 getUnbakedPixelAreaRank();
+ void setVisibilityRank(U32 rank);
+ U32 getVisibilityRank();
static void cullAvatarsByPixelArea();
void dumpLocalTextures();
@@ -717,8 +719,9 @@ public:
LLVector3 mImpostorExtents[2];
LLVector3 mImpostorAngle;
F32 mImpostorDistance;
+ F32 mImpostorPixelArea;
LLVector3 mLastAnimExtents[2];
-
+
//--------------------------------------------------------------------
// Misc Render State
//--------------------------------------------------------------------
@@ -956,6 +959,10 @@ protected:
U32 mLowerMaskTexName;
BOOL mCulled;
+ U32 mVisibilityRank;
+ F32 mFadeTime;
+ F32 mLastFadeTime;
+ F32 mLastFadeDistance;
F32 mMinPixelArea; // debug
F32 mMaxPixelArea; // debug
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 445e553c23..3cf0eb839d 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -60,6 +60,7 @@
#include "llviewerparcelmgr.h"
#include "llfirstuse.h"
#include "llviewerwindow.h"
+#include "llviewercamera.h"
// for base64 decoding
#include "apr_base64.h"
@@ -1191,7 +1192,11 @@ void LLVoiceClient::stateMachine()
setVoiceEnabled(false);
}
- if(!mVoiceEnabled)
+ if(mVoiceEnabled)
+ {
+ updatePosition();
+ }
+ else
{
if(getState() != stateDisabled)
{
@@ -3516,6 +3521,45 @@ void LLVoiceClient::enforceTether(void)
}
}
+void LLVoiceClient::updatePosition(void)
+{
+
+ if(gVoiceClient)
+ {
+ LLVOAvatar *agent = gAgent.getAvatarObject();
+ LLViewerRegion *region = gAgent.getRegion();
+ if(region && agent)
+ {
+ LLMatrix3 rot;
+ LLVector3d pos;
+
+ // MBW -- XXX -- Setting both camera and avatar velocity to 0 for now. May figure it out later...
+
+ // Send the current camera position to the voice code
+ rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis());
+ pos = gAgent.getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin());
+
+ gVoiceClient->setCameraPosition(
+ pos, // position
+ LLVector3::zero, // velocity
+ rot); // rotation matrix
+
+ // Send the current avatar position to the voice code
+ rot = agent->getRootJoint()->getWorldRotation().getMatrix3();
+
+ pos = agent->getPositionGlobal();
+ // MBW -- XXX -- Can we get the head offset from outside the LLVOAvatar?
+// pos += LLVector3d(mHeadOffset);
+ pos += LLVector3d(0.f, 0.f, 1.f);
+
+ gVoiceClient->setAvatarPosition(
+ pos, // position
+ LLVector3::zero, // velocity
+ rot); // rotation matrix
+ }
+ }
+}
+
void LLVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
{
mCameraRequestedPosition = position;
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index f864b75bec..2e1efce6fb 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -188,6 +188,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>
/////////////////////////////
// Sending updates of current state
+static void updatePosition(void);
void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
bool channelFromRegion(LLViewerRegion *region, std::string &name);
diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp
index 40e405a313..6eb3851d16 100644
--- a/indra/newview/llvoicevisualizer.cpp
+++ b/indra/newview/llvoicevisualizer.cpp
@@ -293,10 +293,6 @@ void LLVoiceVisualizer::lipSyncOohAah( F32& ooh, F32& aah )
if( ( sLipSyncEnabled == TRUE ) && mCurrentlySpeaking )
{
U32 transfer_index = (U32) (sOohPowerTransfersf * mSpeakingAmplitude);
- if (transfer_index < 0)
- {
- transfer_index = 0;
- }
if (transfer_index >= sOohPowerTransfers)
{
transfer_index = sOohPowerTransfers - 1;
@@ -304,10 +300,6 @@ void LLVoiceVisualizer::lipSyncOohAah( F32& ooh, F32& aah )
F32 transfer_ooh = sOohPowerTransfer[transfer_index];
transfer_index = (U32) (sAahPowerTransfersf * mSpeakingAmplitude);
- if (transfer_index < 0)
- {
- transfer_index = 0;
- }
if (transfer_index >= sAahPowerTransfers)
{
transfer_index = sAahPowerTransfers - 1;
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 412e4660c8..6cc61e36e0 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -180,14 +180,13 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
pixel_meter_ratio *= pixel_meter_ratio;
S32 count=0;
- S32 i;
mDepth = 0.f;
-
- for (i = 0; i < num_parts; i++)
+ S32 i = 0 ;
+ for (i = 0 ; i < (S32)mViewerPartGroupp->mParticles.size(); i++)
{
- const LLViewerPart &part = *((LLViewerPart*) mViewerPartGroupp->mParticles[i]);
+ const LLViewerPart *part = mViewerPartGroupp->mParticles[i];
- LLVector3 part_pos_agent(part.mPosAgent);
+ LLVector3 part_pos_agent(part->mPosAgent);
at = part_pos_agent - camera_agent;
F32 camera_dist_squared = at.magVecSquared();
@@ -196,7 +195,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
inv_camera_dist_squared = 1.f / camera_dist_squared;
else
inv_camera_dist_squared = 1.f;
- F32 area = part.mScale.mV[0] * part.mScale.mV[1] * inv_camera_dist_squared;
+ F32 area = part->mScale.mV[0] * part->mScale.mV[1] * inv_camera_dist_squared;
tot_area = llmax(tot_area, area);
if (tot_area > max_area)
@@ -227,7 +226,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
facep->setViewerObject(this);
- if (part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK)
+ if (part->mFlags & LLPartData::LL_PART_EMISSIVE_MASK)
{
facep->setState(LLFace::FULLBRIGHT);
}
@@ -236,9 +235,9 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
facep->clearState(LLFace::FULLBRIGHT);
}
- facep->mCenterLocal = part.mPosAgent;
- facep->setFaceColor(part.mColor);
- facep->setTexture(part.mImagep);
+ facep->mCenterLocal = part->mPosAgent;
+ facep->setFaceColor(part->mColor);
+ facep->setTexture(part->mImagep);
mPixelArea = tot_area * pixel_meter_ratio;
const F32 area_scale = 10.f; // scale area to increase priority a bit
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 1e1f8be859..225d9a18b2 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -68,7 +68,7 @@
const S32 MIN_QUIET_FRAMES_COALESCE = 30;
const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
const F32 FORCE_CULL_AREA = 8.f;
-const S32 SCULPT_REZ = 128;
+const S32 SCULPT_REZ = 64;
BOOL gAnimateTextures = TRUE;
extern BOOL gHideSelectedObjects;
@@ -87,6 +87,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mRelativeXformInvTrans.setIdentity();
mLOD = MIN_LOD;
+ mSculptLevel = -2;
mTextureAnimp = NULL;
mVObjRadius = LLVector3(1,1,0.5f).magVec();
mNumFaces = 0;
@@ -515,12 +516,13 @@ void LLVOVolume::updateTextures()
if (mSculptTexture.notNull())
{
mSculptTexture->addTextureStats(SCULPT_REZ * SCULPT_REZ);
- mSculptTexture->setBoostLevel(LLViewerImage::BOOST_SCULPTED);
+ mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
+ (S32)LLViewerImage::BOOST_SCULPTED));
}
S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture
- S32 current_discard = getVolume()->getSculptLevel();
-
+ S32 current_discard = mSculptLevel;
+
if (texture_discard >= 0 && //texture has some data available
(texture_discard < current_discard || //texture has more data than last rebuild
current_discard < 0)) //no previous rebuild
@@ -701,6 +703,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
if (mSculptTexture.notNull())
{
sculpt();
+ mSculptLevel = getVolume()->getSculptLevel();
}
}
else
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 262d4ecc8d..58a1b308a4 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -224,6 +224,7 @@ private:
LLFrameTimer mTextureUpdateTimer;
S32 mLOD;
BOOL mLODChanged;
+ S32 mSculptLevel;
BOOL mSculptChanged;
LLMatrix4 mRelativeXform;
LLMatrix3 mRelativeXformInvTrans;
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index ab9a00c785..ffb360934a 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -61,9 +61,8 @@ enum EWearableType // If you change this, update LLWearable::getTypeName(), get
class LLWearable
{
+ friend class LLWearableList;
public:
- LLWearable(const LLTransactionID& transactionID);
- LLWearable(const LLAssetID& assetID);
~LLWearable();
const LLAssetID& getID() { return mAssetID; }
@@ -120,6 +119,10 @@ public:
friend std::ostream& operator<<(std::ostream &s, const LLWearable &w);
private:
+ // Private constructor used by LLWearableList
+ LLWearable(const LLTransactionID& transactionID);
+ LLWearable(const LLAssetID& assetID);
+
static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml.
S32 mDefinitionVersion; // Depends on the state of the avatar_lad.xml when this asset was created.
std::string mName;
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index 7678727e58..a32c43302d 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -43,7 +43,7 @@
#include "llnotify.h"
// Globals
-LLWearableList gWearableList;
+LLWearableList gWearableList; // Globally constructed; be careful that there's no dependency with gAgent.
struct LLWearableArrivedData
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 08c593755b..8cebf1c12a 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -135,7 +135,7 @@ LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
{
LLHost old_host = regionp->getHost();
// region already exists!
- if (host == old_host && regionp->mAlive)
+ if (host == old_host && regionp->isAlive())
{
// This is a duplicate for the same host and it's alive, don't bother.
return regionp;
@@ -146,7 +146,7 @@ LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
llwarns << "LLWorld::addRegion exists, but old host " << old_host
<< " does not match new host " << host << llendl;
}
- if (!regionp->mAlive)
+ if (!regionp->isAlive())
{
llwarns << "LLWorld::addRegion exists, but isn't alive" << llendl;
}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index c24d1b882a..7269e32d71 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -197,6 +197,7 @@ glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
return ret;
}
+void display_update_camera();
//----------------------------------------
S32 LLPipeline::sCompiles = 0;
@@ -224,6 +225,8 @@ BOOL LLPipeline::sImpostorRender = FALSE;
BOOL LLPipeline::sUnderWaterRender = FALSE;
BOOL LLPipeline::sTextureBindTest = FALSE;
BOOL LLPipeline::sRenderFrameTest = FALSE;
+BOOL LLPipeline::sRenderAttachedLights = TRUE;
+BOOL LLPipeline::sRenderAttachedParticles = TRUE;
static LLCullResult* sCull = NULL;
@@ -240,10 +243,30 @@ static const U32 gl_cube_face[] =
void validate_framebuffer_object();
LLPipeline::LLPipeline() :
+ mBackfaceCull(FALSE),
+ mBatchCount(0),
+ mMatrixOpCount(0),
+ mTextureMatrixOps(0),
+ mMaxBatchSize(0),
+ mMinBatchSize(0),
+ mMeanBatchSize(0),
+ mTrianglesDrawn(0),
+ mNumVisibleNodes(0),
+ mVerticesRelit(0),
+ mLightingChanges(0),
+ mGeometryChanges(0),
+ mNumVisibleFaces(0),
+
mCubeBuffer(NULL),
+ mCubeFrameBuffer(0),
+ mCubeDepth(0),
mInitialized(FALSE),
mVertexShadersEnabled(FALSE),
mVertexShadersLoaded(0),
+ mRenderTypeMask(0),
+ mRenderDebugFeatureMask(0),
+ mRenderDebugMask(0),
+ mOldRenderDebugMask(0),
mLastRebuildPool(NULL),
mAlphaPool(NULL),
mSkyPool(NULL),
@@ -256,15 +279,11 @@ LLPipeline::LLPipeline() :
mBumpPool(NULL),
mWLSkyPool(NULL),
mLightMask(0),
- mLightMovingMask(0)
+ mLightMovingMask(0),
+ mLightingDetail(0)
{
- //mFramebuffer[0] = mFramebuffer[1] = mFramebuffer[2] = mFramebuffer[3] = 0;
mBlurCubeBuffer[0] = mBlurCubeBuffer[1] = mBlurCubeBuffer[2] = 0;
mBlurCubeTexture[0] = mBlurCubeTexture[1] = mBlurCubeTexture[2] = 0;
-
- //mDepthbuffer[0] = mDepthbuffer[1] = 0;
- mCubeFrameBuffer = 0;
- mCubeDepth = 0;
}
void LLPipeline::init()
@@ -273,6 +292,8 @@ void LLPipeline::init()
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+ sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
+ sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
mInitialized = TRUE;
@@ -439,12 +460,6 @@ void LLPipeline::releaseGLBuffers()
mCubeDepth = mCubeFrameBuffer = 0;
}
- /*if (mFramebuffer[0])
- {
- glDeleteFramebuffersEXT(4, mFramebuffer);
- mFramebuffer[0] = mFramebuffer[1] = mFramebuffer[2] = mFramebuffer[3] = 0;
- }*/
-
if (mBlurCubeBuffer[0])
{
glDeleteFramebuffersEXT(3, mBlurCubeBuffer);
@@ -1582,6 +1597,9 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)
}
}
}
+
+ LLHUDText::shiftAll(offset);
+ display_update_camera();
}
void LLPipeline::markTextured(LLDrawable *drawablep)
@@ -1766,6 +1784,12 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
{
return;
}
+
+ LLVOAvatar* avatarp = (LLVOAvatar*) drawablep->getVObj().get();
+ if (!avatarp->isVisible())
+ {
+ return;
+ }
}
assertInitialized();
@@ -2153,6 +2177,7 @@ void render_hud_elements()
gGL.color4f(1,1,1,1);
if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
+ LLGLEnable multisample(GL_MULTISAMPLE_ARB);
gViewerWindow->renderSelections(FALSE, FALSE, FALSE); // For HUD version in render_ui_3d()
// Draw the tracking overlays
@@ -2717,12 +2742,15 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
}
//render child faces
- for (U32 k = 0; k < drawable->getChildCount(); ++k)
+ LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); iter++)
{
- LLDrawable* child = drawable->getChild(k);
- for (S32 l = 0; l < child->getNumFaces(); ++l)
+ LLViewerObject* child = *iter;
+ LLDrawable* child_drawable = child->mDrawable;
+ for (S32 l = 0; l < child_drawable->getNumFaces(); ++l)
{
- LLFace* facep = child->getFace(l);
+ LLFace* facep = child_drawable->getFace(l);
if (!facep->getPool())
{
facep->renderForSelect(prim_mask);
@@ -3174,12 +3202,16 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
if (light->fade <= -LIGHT_FADE_TIME)
{
drawable->clearState(LLDrawable::NEARBY_LIGHT);
+ continue;
}
- else
+ if (!sRenderAttachedLights && volight && volight->isAttachment())
{
- F32 dist = calc_light_dist(volight, cam_pos, max_dist);
- cur_nearby_lights.insert(Light(drawable, dist, light->fade));
+ drawable->clearState(LLDrawable::NEARBY_LIGHT);
+ continue;
}
+
+ F32 dist = calc_light_dist(volight, cam_pos, max_dist);
+ cur_nearby_lights.insert(Light(drawable, dist, light->fade));
}
mNearbyLights = cur_nearby_lights;
}
@@ -4026,11 +4058,6 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
return;
}
- if (!drawable)
- {
- return;
- }
-
for (S32 i = 0; i < drawable->getNumFaces(); i++)
{
LLFace* facep = drawable->getFace(i);
@@ -5224,7 +5251,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
gGL.color4f(1,1,1,1);
- gGL.color4ub(64,64,64,1);
+ gGL.color4ub(64,64,64,255);
gGL.begin(LLVertexBuffer::QUADS);
gGL.vertex3fv((pos+left-up).mV);
gGL.vertex3fv((pos-left-up).mV);
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index ac2c32fedd..389b80813d 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -389,6 +389,8 @@ public:
static BOOL sRenderGlow;
static BOOL sTextureBindTest;
static BOOL sRenderFrameTest;
+ static BOOL sRenderAttachedLights;
+ static BOOL sRenderAttachedParticles;
//screen texture
LLRenderTarget mScreen;
@@ -403,10 +405,6 @@ public:
//texture for making the glow
LLRenderTarget mGlow[3];
-
- //framebuffer objects for off-screen scratch space
- //GLuint mFramebuffer[4];
- //GLuint mDepthbuffer[2];
//dynamic cube map scratch space
LLPointer<LLCubeMap> mCubeBuffer;
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index b71cffac63..0f1541a385 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="Joystick" title="ジョイスティックの設定">
<check_box name="enable_joystick" width="120" >
ジョイスティックを使う:
@@ -112,9 +112,15 @@
<text left="0" name="ZoomDeadZone" width="140">
ズーム・デッド・ゾーン
</text>
- <spinner left="275" name="FlycamAxisDeadZone6" width="50" />
- <button label="SpaceNavigatorのデフォルト設定" left="330"
- name="SpaceNavigatorDefaults" width="210" />
+ <spinner left="275" width="50" name="FlycamAxisDeadZone6" />
+ <button label="SpaceNavigatorのデフォルト設定" name="SpaceNavigatorDefaults" width="210" left="330"/>
+
+ <string name="JoystickMonitor">
+ ジョイスティック・モニター
+ </string>
+ <string name="Axis">
+ 軸 [NUM]
+ </string>
<string name="NoDevice">
デバイスは検出されませんでした
</string>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 58acbaf3d1..caa691a0b4 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -388,6 +388,7 @@ class DarwinManifest(ViewerManifest):
self.path("licenses-mac.txt", dst="licenses.txt")
self.path("featuretable_mac.txt")
self.path("secondlife.icns")
+ self.path("SecondLife.nib")
# Translations
self.path("English.lproj")
@@ -408,6 +409,10 @@ class DarwinManifest(ViewerManifest):
#libfmodwrapper.dylib
self.path(self.args['configuration'] + "/libfmodwrapper.dylib", "libfmodwrapper.dylib")
+
+ # our apps
+ self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app")
+ self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app")
# command line arguments for connecting to the proper grid
self.put_in_file(self.flags_list(), 'arguments.txt')
diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt
index 9be6c5c5bf..d15377a26b 100644
--- a/indra/win_crash_logger/CMakeLists.txt
+++ b/indra/win_crash_logger/CMakeLists.txt
@@ -38,7 +38,25 @@ set(win_crash_logger_HEADER_FILES
set_source_files_properties(${win_crash_logger_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
-list(APPEND win_crash_logger_SOURCE_FILES ${win_crash_logger_HEADER_FILES})
+set(win_crash_logger_RESOURCE_FILES
+ ll_icon.ico
+ )
+
+set_source_files_properties(${win_crash_logger_RESOURCE_FILES}
+ PROPERTIES HEADER_FILE_ONLY TRUE)
+
+set(win_crash_logger_RESOURCE_FILES
+ win_crash_logger.rc
+ ${win_crash_logger_RESOURCE_FILES}
+ )
+
+SOURCE_GROUP("Resource Files" FILES ${win_crash_logger_RESOURCE_FILES})
+
+list(APPEND
+ win_crash_logger_SOURCE_FILES
+ ${win_crash_logger_HEADER_FILES}
+ ${win_crash_logger_RESOURCE_FILES}
+ )
find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR})