diff options
261 files changed, 3839 insertions, 1675 deletions
@@ -67,3 +67,4 @@ glob:indra/newview/filters.xml  glob:indra/newview/avatar_icons_cache.txt  glob:indra/newview/avatar_lad.log  glob:*.diff +*.rej @@ -228,6 +228,10 @@ c4911ec8cd81e676dfd2af438b3e065407a94a7a 3.2.1-start  80f3e30d8aa4d8f674a48bd742aaa6d8e9eae0b5 3.2.3-start  a8c7030d6845186fac7c188be4323a0e887b4184 DRTVWR-99_3.2.1-release  a8c7030d6845186fac7c188be4323a0e887b4184 3.2.1-release +a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release +fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release +a9abb9633a266c8d2fe62411cfd1c86d32da72bf 2.7.1-release +fe3a8e7973072ea62043c08b19b66626c1a720eb 2.7.1-release  3fe994349fae64fc40874bb59db387131eb35a41 3.2.4-start  a9abb9633a266c8d2fe62411cfd1c86d32da72bf DRTVWR-60_2.7.1-release  fe3a8e7973072ea62043c08b19b66626c1a720eb DRTVWR-60_2.7.1-release @@ -244,5 +248,15 @@ bd6bcde2584491fd9228f1fa51c4575f4e764e19 3.2.4-release  3d2d5d244c6398a4214c666d5dd3965b0918709a 3.2.5-beta1  65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d DRTVWR-107_3.2.5-beta2  65a2c1c8d855b88edfbea4e16ef2f27e7cff8b1d 3.2.5-beta2 +c6175c955a19e9b9353d242889ec1779b5762522 DRTVWR-105_3.2.5-release +c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release  2174ed1c7129562428a5cfe8651ed77b8d26ae18 3.2.6-start +286d73ff5c19f6c00e023dc1b60975ed6bbe2872 DRTVWR-109_3.2.6-beta1  4891c46a56fed7512c783b9cbe7cb7260727bf0c 3.2.7-start +286d73ff5c19f6c00e023dc1b60975ed6bbe2872 3.2.6-beta1 +c6175c955a19e9b9353d242889ec1779b5762522 DRTVWR-105_3.2.5-release +c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release +3d75c836d178c7c7e788f256afe195f6cab764a2 DRTVWR-111_3.2.7-beta1 +3d75c836d178c7c7e788f256afe195f6cab764a2 3.2.7-beta1 +89980333c99dbaf1787fe20784f1d8849e9b5d4f 3.2.8-start +37dd400ad721e2a89ee820ffc1e7e433c68f3ca2 3.2.9-start diff --git a/autobuild.xml b/autobuild.xml index 9914be6867..0e4b81324a 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1206,9 +1206,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>26aa7c367ffadd573f61a6a96f820f80</string> +              <string>4a98d727561cd1f4ac5ee02907411df1</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/245988/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20111201.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/250147/arch/Darwin/installer/llqtwebkit-4.7.1-darwin-20120228.tar.bz2</string>              </map>              <key>name</key>              <string>darwin</string> @@ -1218,9 +1218,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>c05a33ee8b6f253b5a744596dfc3707d</string> +              <string>f50e5f0cc880c55b3f0f7e67dc8f7221</string>                <key>url</key> -              <string>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20101013.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/250147/arch/Linux/installer/llqtwebkit-4.7.1-linux-20120228.tar.bz2</string>              </map>              <key>name</key>              <string>linux</string> @@ -1230,9 +1230,9 @@              <key>archive</key>              <map>                <key>hash</key> -              <string>270db8568a0c4bab266d98e1a820aec4</string> +              <string>5e3cd6af397e853a963a6de40d440ff4</string>                <key>url</key> -              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/245988/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20111201.tar.bz2</string> +              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llqtwebkit/rev/250147/arch/CYGWIN/installer/llqtwebkit-4.7.1-windows-20120228.tar.bz2</string>              </map>              <key>name</key>              <string>windows</string> diff --git a/doc/contributions.txt b/doc/contributions.txt index 84f399cc89..c5db396c97 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -607,6 +607,9 @@ Jonathan Yap  	STORM-1737  	STORM-1733  	STORM-1790 +	STORM-1788 +	STORM-1799 +	STORM-1796  Kadah Coba  	STORM-1060  Jondan Lundquist diff --git a/indra/cmake/VisualLeakDetector.cmake b/indra/cmake/VisualLeakDetector.cmake new file mode 100644 index 0000000000..d3ba554e46 --- /dev/null +++ b/indra/cmake/VisualLeakDetector.cmake @@ -0,0 +1,15 @@ +# -*- cmake -*- + +if (VIEWER) + +  set(INCLUDE_VLD_CMAKE OFF CACHE BOOL "Build the Windows viewer with Visual Leak Detector turned on or off") + +  if (INCLUDE_VLD_CMAKE) + +    if (WINDOWS) +      add_definitions(-DINCLUDE_VLD=1) +    endif (WINDOWS) + +  endif (INCLUDE_VLD_CMAKE) + +endif (VIEWER) diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake index 91b49e75d7..d9df78bfc8 100644 --- a/indra/cmake/WebKitLibPlugin.cmake +++ b/indra/cmake/WebKitLibPlugin.cmake @@ -70,9 +70,10 @@ elseif (LINUX)          QtNetwork          QtGui          QtCore -        qgif -        qjpeg -        jpeg +        jscore +#        qgif +#        qjpeg +#        jpeg          fontconfig          X11          Xrender diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/indra/edit-me-to-trigger-new-build.txt diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index f0b44f97d2..7f747c2eca 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -215,7 +215,7 @@ BOOL LLVorbisDecodeState::initDecode()  		return(FALSE);  	} -	S32 sample_count = ov_pcm_total(&mVF, -1); +	S32 sample_count = (S32)ov_pcm_total(&mVF, -1);  	size_t size_guess = (size_t)sample_count;  	vorbis_info* vi = ov_info(&mVF, -1);  	size_guess *= (vi? vi->channels : 1); diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h index a47ee7ca7c..28b69e1973 100644 --- a/indra/llaudio/llaudioengine.h +++ b/indra/llaudio/llaudioengine.h @@ -37,6 +37,7 @@  #include "lluuid.h"  #include "llframetimer.h"  #include "llassettype.h" +#include "llextendedstatus.h"  #include "lllistener.h" diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index f3cf950afa..2a0df26384 100644 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -1570,7 +1570,7 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)  		constraint_it++)  		{  			U8 byte = constraint_it->mChainLength; -			dp.packU8(byte, "chain_lenght"); +			dp.packU8(byte, "chain_length");  			byte = constraint_it->mConstraintType;  			dp.packU8(byte, "constraint_type"); diff --git a/indra/llcommon/linden_common.h b/indra/llcommon/linden_common.h index bdcc98e402..5cfcdab41c 100644 --- a/indra/llcommon/linden_common.h +++ b/indra/llcommon/linden_common.h @@ -52,34 +52,11 @@  #include <ctime>  #include <iosfwd> -// Work around Microsoft compiler warnings in STL headers -#ifdef LL_WINDOWS -#pragma warning (disable : 4702) // unreachable code -#pragma warning (disable : 4244) // conversion from time_t to S32 -#endif	//	LL_WINDOWS - -// *TODO: Eliminate these, most library .cpp files don't need them. -// Add them to llviewerprecompiledheaders.h if necessary. -#include <list> -#include <map> -#include <vector> -#include <string> - -#ifdef LL_WINDOWS -// Reenable warnings we disabled above -#pragma warning (3 : 4702) // unreachable code, we like level 3, not 4 -// moved msvc warnings to llpreprocessor.h  *TODO - delete this comment after merge conflicts are unlikely -brad -#endif	//	LL_WINDOWS -  // Linden only libs in alpha-order other than stdtypes.h  // *NOTE: Please keep includes here to a minimum, see above.  #include "stdtypes.h"  #include "lldefs.h"  #include "llerror.h" -#include "llextendedstatus.h" -// Don't do this, adds 15K lines of header code to every library file. -//#include "llfasttimer.h"  #include "llfile.h" -#include "llformat.h"  #endif diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp index db1ea4792b..0855180dcd 100644 --- a/indra/llcommon/llevents.cpp +++ b/indra/llcommon/llevents.cpp @@ -430,13 +430,13 @@ LLBoundListener LLEventPump::listen_impl(const std::string& name, const LLEventL      {          // The new node isn't last. Place it between the previous node and          // the successor. -        newNode = (myprev + mydmi->second)/2.0; +        newNode = (myprev + mydmi->second)/2.f;      }      else      {          // The new node is last. Bump myprev up to the next integer, add          // 1.0 and use that. -        newNode = std::ceil(myprev) + 1.0; +        newNode = std::ceil(myprev) + 1.f;      }      // Now that newNode has a value that places it appropriately in mSignal,      // connect it. diff --git a/indra/llcommon/llmd5.cpp b/indra/llcommon/llmd5.cpp index 75fde8e5ba..1409c55d1c 100644 --- a/indra/llcommon/llmd5.cpp +++ b/indra/llcommon/llmd5.cpp @@ -175,7 +175,7 @@ void LLMD5::update(std::istream& stream){    while (stream.good()){      stream.read( (char*)buffer, BLOCK_LEN); 	/* Flawfinder: ignore */		// note that return value of read is unusable. -    len=stream.gcount(); +    len=(int)stream.gcount();      update(buffer, len);    } diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h index 31d5f3d2c7..7fdb537ab5 100644 --- a/indra/llcommon/llpreprocessor.h +++ b/indra/llcommon/llpreprocessor.h @@ -132,7 +132,7 @@  #pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"  #pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden  #pragma warning (disable : 4180)	// qualifier applied to function type has no meaning; ignored -#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file +//#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file  #pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.  #pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)  #pragma warning( disable : 4996 )	// warning: deprecated @@ -152,6 +152,7 @@  #pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class  #pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class  #pragma warning (disable : 4018) // '<' : signed/unsigned mismatch	 +  #endif	//	LL_MSVC  #if LL_WINDOWS diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index bf62600514..b419101b7e 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -110,7 +110,7 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes)  	if (!strncasecmp(LEGACY_NON_HEADER, hdr_buf, strlen(LEGACY_NON_HEADER))) /* Flawfinder: ignore */  	{  		legacy_no_header = true; -		inbuf = str.gcount(); +		inbuf = (int)str.gcount();  	}  	else  	{ @@ -343,7 +343,7 @@ std::istream& LLSDParser::get(  	char delim) const  {  	istr.get(s, n, delim); -	if(mCheckLimits) mMaxBytesLeft -= istr.gcount(); +	if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();  	return istr;  } @@ -353,7 +353,7 @@ std::istream& LLSDParser::get(  		char delim) const		  {  	istr.get(sb, delim); -	if(mCheckLimits) mMaxBytesLeft -= istr.gcount(); +	if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();  	return istr;  } @@ -377,7 +377,7 @@ std::istream& LLSDParser::read(  	std::streamsize n) const  {  	istr.read(s, n); -	if(mCheckLimits) mMaxBytesLeft -= istr.gcount(); +	if(mCheckLimits) mMaxBytesLeft -= (int)istr.gcount();  	return istr;  } @@ -789,7 +789,7 @@ bool LLSDNotationParser::parseBinary(std::istream& istr, LLSD& data) const  		if(len)  		{  			value.resize(len); -			account(fullread(istr, (char *)&value[0], len)); +			account((int)fullread(istr, (char *)&value[0], len));  		}  		c = get(istr); // strip off the trailing double-quote  		data = value; @@ -1069,7 +1069,7 @@ S32 LLSDBinaryParser::doParse(std::istream& istr, LLSD& data) const  			if(size > 0)  			{  				value.resize(size); -				account(fullread(istr, (char*)&value[0], size)); +				account((int)fullread(istr, (char*)&value[0], size));  			}  			data = value;  		} @@ -1200,7 +1200,7 @@ bool LLSDBinaryParser::parseString(  	if(size)  	{  		buf.resize(size); -		account(fullread(istr, &buf[0], size)); +		account((int)fullread(istr, &buf[0], size));  		value.assign(buf.begin(), buf.end());  	}  	return true; @@ -1642,7 +1642,7 @@ int deserialize_string_raw(  	const S32 BUF_LEN = 20;  	char buf[BUF_LEN];		/* Flawfinder: ignore */  	istr.get(buf, BUF_LEN - 1, ')'); -	count += istr.gcount(); +	count += (int)istr.gcount();  	int c = istr.get();  	c = istr.get();  	count += 2; @@ -1657,7 +1657,7 @@ int deserialize_string_raw(  		if(len)  		{  			buf.resize(len); -			count += fullread(istr, (char *)&buf[0], len); +			count += (int)fullread(istr, (char *)&buf[0], len);  			value.assign(buf.begin(), buf.end());  		}  		c = istr.get(); diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp index be9db53906..34b3dbb99a 100644 --- a/indra/llcommon/llsdserialize_xml.cpp +++ b/indra/llcommon/llsdserialize_xml.cpp @@ -464,7 +464,7 @@ S32 LLSDXMLParser::Impl::parseLines(std::istream& input, LLSD& data)  			}  		} -		status = XML_ParseBuffer(mParser, num_read, false); +		status = XML_ParseBuffer(mParser, (int)num_read, false);  		if (status == XML_STATUS_ERROR)  		{  			break; diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index 65c7297cbf..532d3f9341 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -308,7 +308,7 @@ class LLSDParam<T>                              \  {                                               \  public:                                         \      LLSDParam(const LLSD& value):               \ -        _value(value.AS())                      \ +        _value((T)value.AS())                      \      {}                                          \                                                  \      operator T() const { return _value; }       \ diff --git a/indra/llcommon/llstat.cpp b/indra/llcommon/llstat.cpp index b2c495d093..057257057f 100644 --- a/indra/llcommon/llstat.cpp +++ b/indra/llcommon/llstat.cpp @@ -593,7 +593,7 @@ void LLStatTime::stop()  {      if ( LLStatAccum::SCALE_PER_FRAME == scale )      { -        return mTotalTimeInFrame; +        return (F32)mTotalTimeInFrame;      }      else      { diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 4063cc730b..a6ad6b125c 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -337,11 +337,7 @@ LLMutex::~LLMutex()  void LLMutex::lock()  { -#if LL_DARWIN -	if (mLockingThread == LLThread::currentID()) -#else -	if (mLockingThread == sThreadID) -#endif +	if(isSelfLocked())  	{ //redundant lock  		mCount++;  		return; @@ -398,6 +394,15 @@ bool LLMutex::isLocked()  	}  } +bool LLMutex::isSelfLocked() +{ +#if LL_DARWIN +	return mLockingThread == LLThread::currentID(); +#else +	return mLockingThread == sThreadID; +#endif +} +  U32 LLMutex::lockingThread() const  {  	return mLockingThread; diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index f0e0de6173..b52e70ab2e 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -151,6 +151,7 @@ public:  	void lock();		// blocks  	void unlock();  	bool isLocked(); 	// non-blocking, but does do a lock/unlock so not free +	bool isSelfLocked(); //return true if locked in a same thread  	U32 lockingThread() const; //get ID of locking thread  protected: diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp index 38054b636e..9ebc6de7f4 100644 --- a/indra/llcommon/lltimer.cpp +++ b/indra/llcommon/lltimer.cpp @@ -83,7 +83,7 @@ U32 micro_sleep(U64 us, U32 max_yields)  {      // max_yields is unused; just fiddle with it to avoid warnings.      max_yields = 0; -    ms_sleep(us / 1000); +	ms_sleep((U32)(us / 1000));      return 0;  }  #elif LL_LINUX || LL_SOLARIS || LL_DARWIN diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index 99ab053b25..a869c74189 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -28,8 +28,8 @@  #define LL_LLVERSIONVIEWER_H  const S32 LL_VERSION_MAJOR = 3; -const S32 LL_VERSION_MINOR = 2; -const S32 LL_VERSION_PATCH = 8; +const S32 LL_VERSION_MINOR = 3; +const S32 LL_VERSION_PATCH = 0;  const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Developer"; diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index 3461aa3e6c..d6dcde4b9f 100644 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -250,7 +250,7 @@ void LLCrashLogger::gatherFiles()  		if(minidump_stream.is_open())  		{  			minidump_stream.seekg(0, std::ios::end); -			size_t length = minidump_stream.tellg(); +			size_t length = (size_t)minidump_stream.tellg();  			minidump_stream.seekg(0, std::ios::beg);  			LLSD::Binary data; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index cc8cb66d73..8241746a74 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -501,10 +501,10 @@ void LLImageCompressionTester::outputTestRecord(LLSD *sd)  	F32 decompressionRate = 0.0f;  	F32 compressionRate   = 0.0f; -	F32 totalkBInDecompression  = (F32)(mTotalBytesInDecompression)  / 1000.0; -	F32 totalkBOutDecompression = (F32)(mTotalBytesOutDecompression) / 1000.0; -	F32 totalkBInCompression    = (F32)(mTotalBytesInCompression)    / 1000.0; -	F32 totalkBOutCompression   = (F32)(mTotalBytesOutCompression)   / 1000.0; +	F32 totalkBInDecompression  = (F32)(mTotalBytesInDecompression)  / 1000.f; +	F32 totalkBOutDecompression = (F32)(mTotalBytesOutDecompression) / 1000.f; +	F32 totalkBInCompression    = (F32)(mTotalBytesInCompression)    / 1000.f; +	F32 totalkBOutCompression   = (F32)(mTotalBytesOutCompression)   / 1000.f;  	if (!is_approx_zero(mTotalTimeDecompression))  	{ diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 76760aa414..fbf23bc3f0 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -405,7 +405,7 @@ U32 LLInventoryItem::getCRC32() const  	//lldebugs << "7 crc: " << std::hex << crc << std::dec << llendl;  	crc += mSaleInfo.getCRC32();  	//lldebugs << "8 crc: " << std::hex << crc << std::dec << llendl; -	crc += mCreationDate; +	crc += (U32)mCreationDate;  	//lldebugs << "9 crc: " << std::hex << crc << std::dec << llendl;  	return crc;  } @@ -521,7 +521,7 @@ void LLInventoryItem::packMessage(LLMessageSystem* msg) const  	mSaleInfo.packMessage(msg);  	msg->addStringFast(_PREHASH_Name, mName);  	msg->addStringFast(_PREHASH_Description, mDescription); -	msg->addS32Fast(_PREHASH_CreationDate, mCreationDate); +	msg->addS32Fast(_PREHASH_CreationDate, (S32)mCreationDate);  	U32 crc = getCRC32();  	msg->addU32Fast(_PREHASH_CRC, crc);  } diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h index bd9c8c2519..e0ad270266 100644 --- a/indra/llmath/llcalcparser.h +++ b/indra/llmath/llcalcparser.h @@ -174,7 +174,7 @@ private:  	F32 _log(const F32& a) const { return log(a); }  	F32 _exp(const F32& a) const { return exp(a); }  	F32 _fabs(const F32& a) const { return fabs(a); } -	F32 _floor(const F32& a) const { return llfloor(a); } +	F32 _floor(const F32& a) const { return (F32)llfloor(a); }  	F32 _ceil(const F32& a) const { return llceil(a); }  	F32 _atan2(const F32& a,const F32& b) const { return atan2(a,b); } diff --git a/indra/llmath/llcoord.h b/indra/llmath/llcoord.h index 706ad92787..9b76268afd 100644 --- a/indra/llmath/llcoord.h +++ b/indra/llmath/llcoord.h @@ -26,80 +26,87 @@  #ifndef LL_LLCOORD_H  #define LL_LLCOORD_H +template<typename> class LLCoord; +struct LL_COORD_TYPE_GL; +struct LL_COORD_TYPE_WINDOW; +struct LL_COORD_TYPE_SCREEN; + +typedef LLCoord<LL_COORD_TYPE_GL> LLCoordGL; +typedef LLCoord<LL_COORD_TYPE_WINDOW> LLCoordWindow; +typedef LLCoord<LL_COORD_TYPE_SCREEN> LLCoordScreen; + +struct LLCoordCommon +{ +	LLCoordCommon(S32 x, S32 y) : mX(x), mY(y) {} +	LLCoordCommon() : mX(0), mY(0) {} +	S32 mX; +	S32 mY; +}; +  // A two-dimensional pixel value -class LLCoord +template<typename COORD_FRAME> +class LLCoord : protected COORD_FRAME  {  public: -	S32		mX; -	S32		mY; +	typedef LLCoord<COORD_FRAME> self_t; +	typename COORD_FRAME::value_t	mX; +	typename COORD_FRAME::value_t	mY;  	LLCoord():	mX(0), mY(0)  	{} -	LLCoord(S32 x, S32 y): mX(x), mY(y) -	{} -	virtual ~LLCoord() +	LLCoord(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y): mX(x), mY(y)  	{} -	virtual void set(S32 x, S32 y)		{ mX = x; mY = y; } -}; +	LLCoord(const LLCoordCommon& other) +	{ +		COORD_FRAME::convertFromCommon(other); +	} +	LLCoordCommon convert() const +	{ +		return COORD_FRAME::convertToCommon(); +	} -// GL coordinates start in the client region of a window, -// with left, bottom = 0, 0 -class LLCoordGL : public LLCoord -{ -public: -	LLCoordGL() : LLCoord() -	{} -	LLCoordGL(S32 x, S32 y) : LLCoord(x, y) -	{} -	bool operator==(const LLCoordGL& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordGL& other) const { return !(*this == other); } -}; +	void set(typename COORD_FRAME::value_t x, typename COORD_FRAME::value_t y) { mX = x; mY = y;} +	bool operator==(const self_t& other) const { return mX == other.mX && mY == other.mY; } +	bool operator!=(const self_t& other) const { return !(*this == other); } -//bool operator ==(const LLCoordGL& a, const LLCoordGL& b); +	static const self_t& getTypedCoords(const COORD_FRAME& self) { return static_cast<const self_t&>(self); } +	static self_t& getTypedCoords(COORD_FRAME& self) { return static_cast<self_t&>(self); } +}; -// Window coords include things like window borders, -// menu regions, etc. -class LLCoordWindow : public LLCoord +struct LL_COORD_TYPE_GL   { -public: -	LLCoordWindow() : LLCoord() -	{} -	LLCoordWindow(S32 x, S32 y) : LLCoord(x, y) -	{} -	bool operator==(const LLCoordWindow& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordWindow& other) const { return !(*this == other); } -}; +	typedef S32 value_t; +	LLCoordCommon convertToCommon() const +	{ +		const LLCoordGL& self = LLCoordGL::getTypedCoords(*this); +		return LLCoordCommon(self.mX, self.mY); +	} -// Screen coords start at left, top = 0, 0 -class LLCoordScreen : public LLCoord +	void convertFromCommon(const LLCoordCommon& from) +	{ +		LLCoordGL& self = LLCoordGL::getTypedCoords(*this); +		self.mX = from.mX; +		self.mY = from.mY; +	} +}; + +struct LL_COORD_TYPE_WINDOW   { -public: -	LLCoordScreen() : LLCoord() -	{} -	LLCoordScreen(S32 x, S32 y) : LLCoord(x, y) -	{} -	bool operator==(const LLCoordScreen& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordScreen& other) const { return !(*this == other); } +	typedef S32 value_t; + +	LLCoordCommon convertToCommon() const; +	void convertFromCommon(const LLCoordCommon& from);  }; -class LLCoordFont : public LLCoord +struct LL_COORD_TYPE_SCREEN   { -public: -	F32 mZ; -	 -	LLCoordFont() : LLCoord(), mZ(0.f) -	{} -	LLCoordFont(S32 x, S32 y, F32 z = 0) : LLCoord(x,y), mZ(z) -	{} -	 -	void set(S32 x, S32 y) { LLCoord::set(x,y); mZ = 0.f; } -	void set(S32 x, S32 y, F32 z) { mX = x; mY = y; mZ = z; } -	bool operator==(const LLCoordFont& other) const { return mX == other.mX && mY == other.mY; } -	bool operator!=(const LLCoordFont& other) const { return !(*this == other); } +	typedef S32 value_t; + +	LLCoordCommon convertToCommon() const; +	void convertFromCommon(const LLCoordCommon& from);  }; -	  #endif diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 0c6cf1dfae..cc9744756f 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -2078,6 +2078,7 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL ge  	mFaceMask = 0x0;  	mDetail = detail;  	mSculptLevel = -2; +	mSurfaceArea = 1.f; //only calculated for sculpts, defaults to 1 for all other prims  	mIsMeshAssetLoaded = FALSE;  	mLODScaleBias.setVec(1,1,1);  	mHullPoints = NULL; @@ -2903,7 +2904,7 @@ F32 LLVolume::sculptGetSurfaceArea()  			// compute the area of the quad by taking the length of the cross product of the two triangles  			LLVector3 cross1 = (p1 - p2) % (p1 - p3);  			LLVector3 cross2 = (p4 - p2) % (p4 - p3); -			area += (cross1.magVec() + cross2.magVec()) / 2.0; +			area += (cross1.magVec() + cross2.magVec()) / 2.f;  		}  	} @@ -3144,6 +3145,8 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,  		{  			F32 area = sculptGetSurfaceArea(); +			mSurfaceArea = area; +  			const F32 SCULPT_MAX_AREA = 384.f;  			if (area < SCULPT_MIN_AREA || area > SCULPT_MAX_AREA) @@ -5887,7 +5890,7 @@ F32 find_vertex_score(LLVCacheVertexData& data)  	}  	//bonus points for having low valence -	F32 valence_boost = powf(data.mActiveTriangles, -FindVertexScore_ValenceBoostPower); +	F32 valence_boost = powf((F32)data.mActiveTriangles, -FindVertexScore_ValenceBoostPower);  	score += FindVertexScore_ValenceBoostScale * valence_boost;  	return score; diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h index afd1ec5eed..76cf9de613 100644 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -963,6 +963,7 @@ public:  	S32	getNumFaces() const;  	S32 getNumVolumeFaces() const							{ return mVolumeFaces.size(); }  	F32 getDetail() const									{ return mDetail; } +	F32 getSurfaceArea() const								{ return mSurfaceArea; }  	const LLVolumeParams& getParams() const					{ return mParams; }  	LLVolumeParams getCopyOfParams() const					{ return mParams; }  	const LLProfile& getProfile() const						{ return *mProfilep; } @@ -1065,6 +1066,7 @@ public:  	BOOL mUnique;  	F32 mDetail;  	S32 mSculptLevel; +	F32 mSurfaceArea; //unscaled surface area  	BOOL mIsMeshAssetLoaded;  	LLVolumeParams mParams; diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp index bad4deb4de..6a1b4143cf 100644 --- a/indra/llmath/m4math.cpp +++ b/indra/llmath/m4math.cpp @@ -858,25 +858,25 @@ LLSD LLMatrix4::getValue() const  void LLMatrix4::setValue(const LLSD& data)   { -	mMatrix[0][0] = data[0].asReal(); -	mMatrix[0][1] = data[1].asReal(); -	mMatrix[0][2] = data[2].asReal(); -	mMatrix[0][3] = data[3].asReal(); - -	mMatrix[1][0] = data[4].asReal(); -	mMatrix[1][1] = data[5].asReal(); -	mMatrix[1][2] = data[6].asReal(); -	mMatrix[1][3] = data[7].asReal(); - -	mMatrix[2][0] = data[8].asReal(); -	mMatrix[2][1] = data[9].asReal(); -	mMatrix[2][2] = data[10].asReal(); -	mMatrix[2][3] = data[11].asReal(); - -	mMatrix[3][0] = data[12].asReal(); -	mMatrix[3][1] = data[13].asReal(); -	mMatrix[3][2] = data[14].asReal(); -	mMatrix[3][3] = data[15].asReal(); +	mMatrix[0][0] = (F32)data[0].asReal(); +	mMatrix[0][1] = (F32)data[1].asReal(); +	mMatrix[0][2] = (F32)data[2].asReal(); +	mMatrix[0][3] = (F32)data[3].asReal(); + +	mMatrix[1][0] = (F32)data[4].asReal(); +	mMatrix[1][1] = (F32)data[5].asReal(); +	mMatrix[1][2] = (F32)data[6].asReal(); +	mMatrix[1][3] = (F32)data[7].asReal(); + +	mMatrix[2][0] = (F32)data[8].asReal(); +	mMatrix[2][1] = (F32)data[9].asReal(); +	mMatrix[2][2] = (F32)data[10].asReal(); +	mMatrix[2][3] = (F32)data[11].asReal(); + +	mMatrix[3][0] = (F32)data[12].asReal(); +	mMatrix[3][1] = (F32)data[13].asReal(); +	mMatrix[3][2] = (F32)data[14].asReal(); +	mMatrix[3][3] = (F32)data[15].asReal();  } diff --git a/indra/llmessage/llbuffer.cpp b/indra/llmessage/llbuffer.cpp index 0316797f00..250cace6e9 100644 --- a/indra/llmessage/llbuffer.cpp +++ b/indra/llmessage/llbuffer.cpp @@ -32,6 +32,9 @@  #include "llmath.h"  #include "llmemtype.h"  #include "llstl.h" +#include "llthread.h" + +#define ASSERT_LLBUFFERARRAY_MUTEX_LOCKED llassert(!mMutexp || mMutexp->isSelfLocked());  /**    * LLSegment @@ -224,7 +227,8 @@ void LLHeapBuffer::allocate(S32 size)   * LLBufferArray   */  LLBufferArray::LLBufferArray() : -	mNextBaseChannel(0) +	mNextBaseChannel(0), +	mMutexp(NULL)  {  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  } @@ -233,6 +237,8 @@ LLBufferArray::~LLBufferArray()  {  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	std::for_each(mBuffers.begin(), mBuffers.end(), DeletePointer()); + +	delete mMutexp;  }  // static @@ -243,14 +249,57 @@ LLChannelDescriptors LLBufferArray::makeChannelConsumer(  	return rv;  } +void LLBufferArray::lock() +{ +	if(mMutexp) +	{ +		mMutexp->lock() ; +	} +} + +void LLBufferArray::unlock() +{ +	if(mMutexp) +	{ +		mMutexp->unlock() ; +	} +} + +LLMutex* LLBufferArray::getMutex() +{ +	return mMutexp ; +} + +void LLBufferArray::setThreaded(bool threaded) +{ +	if(threaded) +	{ +		if(!mMutexp) +		{ +			mMutexp = new LLMutex(NULL); +		} +	} +	else +	{ +		if(mMutexp) +		{ +			delete mMutexp ; +			mMutexp = NULL ; +		} +	} +} +  LLChannelDescriptors LLBufferArray::nextChannel()  {  	LLChannelDescriptors rv(mNextBaseChannel++);  	return rv;  } +//mMutexp should be locked before calling this.  S32 LLBufferArray::capacity() const  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED +  	S32 total = 0;  	const_buffer_iterator_t iter = mBuffers.begin();  	const_buffer_iterator_t end = mBuffers.end(); @@ -263,6 +312,8 @@ S32 LLBufferArray::capacity() const  bool LLBufferArray::append(S32 channel, const U8* src, S32 len)  { +	LLMutexLock lock(mMutexp) ; +  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	std::vector<LLSegment> segments;  	if(copyIntoBuffers(channel, src, len, segments)) @@ -273,8 +324,11 @@ bool LLBufferArray::append(S32 channel, const U8* src, S32 len)  	return false;  } +//mMutexp should be locked before calling this.  bool LLBufferArray::prepend(S32 channel, const U8* src, S32 len)  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED +  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	std::vector<LLSegment> segments;  	if(copyIntoBuffers(channel, src, len, segments)) @@ -293,6 +347,8 @@ bool LLBufferArray::insertAfter(  {  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	std::vector<LLSegment> segments; + +	LLMutexLock lock(mMutexp) ;  	if(mSegments.end() != segment)  	{  		++segment; @@ -305,8 +361,11 @@ bool LLBufferArray::insertAfter(  	return false;  } +//mMutexp should be locked before calling this.  LLBufferArray::segment_iterator_t LLBufferArray::splitAfter(U8* address)  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED +  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	segment_iterator_t end = mSegments.end();  	segment_iterator_t it = getSegment(address); @@ -335,20 +394,26 @@ LLBufferArray::segment_iterator_t LLBufferArray::splitAfter(U8* address)  	return rv;  } +//mMutexp should be locked before calling this.  LLBufferArray::segment_iterator_t LLBufferArray::beginSegment()  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	return mSegments.begin();  } +//mMutexp should be locked before calling this.  LLBufferArray::segment_iterator_t LLBufferArray::endSegment()  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	return mSegments.end();  } +//mMutexp should be locked before calling this.  LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter(  	U8* address,  	LLSegment& segment)  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	segment_iterator_t rv = mSegments.begin();  	segment_iterator_t end = mSegments.end(); @@ -395,8 +460,10 @@ LLBufferArray::segment_iterator_t LLBufferArray::constructSegmentAfter(  	return rv;  } +//mMutexp should be locked before calling this.  LLBufferArray::segment_iterator_t LLBufferArray::getSegment(U8* address)  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	segment_iterator_t end = mSegments.end();  	if(!address)  	{ @@ -414,9 +481,11 @@ LLBufferArray::segment_iterator_t LLBufferArray::getSegment(U8* address)  	return end;  } +//mMutexp should be locked before calling this.  LLBufferArray::const_segment_iterator_t LLBufferArray::getSegment(  	U8* address) const  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	const_segment_iterator_t end = mSegments.end();  	if(!address)  	{ @@ -466,6 +535,8 @@ S32 LLBufferArray::countAfter(S32 channel, U8* start) const  	S32 count = 0;  	S32 offset = 0;  	const_segment_iterator_t it; + +	LLMutexLock lock(mMutexp) ;  	const_segment_iterator_t end = mSegments.end();  	if(start)  	{ @@ -517,6 +588,8 @@ U8* LLBufferArray::readAfter(  	len = 0;  	S32 bytes_to_copy = 0;  	const_segment_iterator_t it; + +	LLMutexLock lock(mMutexp) ;  	const_segment_iterator_t end = mSegments.end();  	if(start)  	{ @@ -568,6 +641,7 @@ U8* LLBufferArray::seek(  	U8* start,  	S32 delta) const  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	const_segment_iterator_t it;  	const_segment_iterator_t end = mSegments.end(); @@ -709,9 +783,14 @@ U8* LLBufferArray::seek(  	return rv;  } +//test use only  bool LLBufferArray::takeContents(LLBufferArray& source)  {  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER); + +	LLMutexLock lock(mMutexp); +	source.lock(); +  	std::copy(  		source.mBuffers.begin(),  		source.mBuffers.end(), @@ -723,13 +802,17 @@ bool LLBufferArray::takeContents(LLBufferArray& source)  		std::back_insert_iterator<segment_list_t>(mSegments));  	source.mSegments.clear();  	source.mNextBaseChannel = 0; +	source.unlock(); +  	return true;  } +//mMutexp should be locked before calling this.  LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(  	S32 channel,  	S32 len)  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	// start at the end of the buffers, because it is the most likely  	// to have free space. @@ -765,8 +848,10 @@ LLBufferArray::segment_iterator_t LLBufferArray::makeSegment(  	return send;  } +//mMutexp should be locked before calling this.  bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter)  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	// Find out which buffer contains the segment, and if it is found, @@ -792,13 +877,14 @@ bool LLBufferArray::eraseSegment(const segment_iterator_t& erase_iter)  	return rv;  } - +//mMutexp should be locked before calling this.  bool LLBufferArray::copyIntoBuffers(  	S32 channel,  	const U8* src,  	S32 len,  	std::vector<LLSegment>& segments)  { +	ASSERT_LLBUFFERARRAY_MUTEX_LOCKED  	LLMemType m1(LLMemType::MTYPE_IO_BUFFER);  	if(!src || !len) return false;  	S32 copied = 0; diff --git a/indra/llmessage/llbuffer.h b/indra/llmessage/llbuffer.h index 1c42b6fbc6..ccdb9fa7ee 100644 --- a/indra/llmessage/llbuffer.h +++ b/indra/llmessage/llbuffer.h @@ -39,6 +39,7 @@  #include <list>  #include <vector> +class LLMutex;  /**    * @class LLChannelDescriptors   * @brief A way simple interface to accesss channels inside a buffer @@ -564,6 +565,29 @@ public:  	 * @return Returns true on success.  	 */  	bool eraseSegment(const segment_iterator_t& iter); + +	/** +	* @brief Lock the mutex if it exists +	* This method locks mMutexp to make accessing LLBufferArray thread-safe +	*/ +	void lock(); + +	/** +	* @brief Unlock the mutex if it exists +	*/ +	void unlock(); + +	/** +	* @brief Return mMutexp +	*/ +	LLMutex* getMutex(); + +	/** +	* @brief Set LLBufferArray to be shared across threads or not +	* This method is to create mMutexp if is threaded. +	* @param threaded Indicates this LLBufferArray instance is shared across threads if true. +	*/ +	void setThreaded(bool threaded);  	//@}  protected: @@ -595,6 +619,7 @@ protected:  	S32 mNextBaseChannel;  	buffer_list_t mBuffers;  	segment_list_t mSegments; +	LLMutex* mMutexp;  };  #endif // LL_LLBUFFER_H diff --git a/indra/llmessage/llbufferstream.cpp b/indra/llmessage/llbufferstream.cpp index 6257983c43..8d8ad05ad5 100644 --- a/indra/llmessage/llbufferstream.cpp +++ b/indra/llmessage/llbufferstream.cpp @@ -31,6 +31,7 @@  #include "llbuffer.h"  #include "llmemtype.h" +#include "llthread.h"  static const S32 DEFAULT_OUTPUT_SEGMENT_SIZE = 1024 * 4; @@ -62,6 +63,7 @@ int LLBufferStreamBuf::underflow()  		return EOF;  	} +	LLMutexLock lock(mBuffer->getMutex());  	LLBufferArray::segment_iterator_t iter;  	LLBufferArray::segment_iterator_t end = mBuffer->endSegment();  	U8* last_pos = (U8*)gptr(); @@ -149,6 +151,7 @@ int LLBufferStreamBuf::overflow(int c)  	// since we got here, we have a buffer, and we have a character to  	// put on it.  	LLBufferArray::segment_iterator_t it; +	LLMutexLock lock(mBuffer->getMutex());  	it = mBuffer->makeSegment(mChannels.out(), DEFAULT_OUTPUT_SEGMENT_SIZE);  	if(it != mBuffer->endSegment())  	{ @@ -210,6 +213,7 @@ int LLBufferStreamBuf::sync()  	// *NOTE: I bet we could just --address if address is not NULL.  	// Need to think about that. +	LLMutexLock lock(mBuffer->getMutex());  	address = mBuffer->seek(mChannels.out(), address, -1);  	if(address)  	{ @@ -273,6 +277,8 @@ streampos LLBufferStreamBuf::seekoff(  			// NULL is fine  			break;  		} + +		LLMutexLock lock(mBuffer->getMutex());  		address = mBuffer->seek(mChannels.in(), base_addr, off);  		if(address)  		{ @@ -304,6 +310,8 @@ streampos LLBufferStreamBuf::seekoff(  			// NULL is fine  			break;  		} + +		LLMutexLock lock(mBuffer->getMutex());  		address = mBuffer->seek(mChannels.out(), base_addr, off);  		if(address)  		{ diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index e17380fdf5..b93d429feb 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -72,10 +72,9 @@  static const U32 EASY_HANDLE_POOL_SIZE		= 5;  static const S32 MULTI_PERFORM_CALL_REPEAT	= 5; -static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds +static const S32 CURL_REQUEST_TIMEOUT = 30; // seconds per operation  static const S32 MAX_ACTIVE_REQUEST_COUNT = 100; -static   // DEBUG //  S32 gCurlEasyCount = 0;  S32 gCurlMultiCount = 0; @@ -87,6 +86,11 @@ std::vector<LLMutex*> LLCurl::sSSLMutex;  std::string LLCurl::sCAPath;  std::string LLCurl::sCAFile;  LLCurlThread* LLCurl::sCurlThread = NULL ; +LLMutex* LLCurl::sHandleMutexp = NULL ; +S32      LLCurl::sTotalHandles = 0 ; +bool     LLCurl::sNotQuitting = true; +F32      LLCurl::sCurlRequestTimeOut = 120.f; //seonds +S32      LLCurl::sMaxHandles = 256; //max number of handles, (multi handles and easy handles combined).  void check_curl_code(CURLcode code)  { @@ -224,13 +228,15 @@ LLMutex* LLCurl::Easy::sHandleMutexp = NULL ;  //static  CURL* LLCurl::Easy::allocEasyHandle()  { +	llassert(LLCurl::getCurlThread()) ; +  	CURL* ret = NULL;  	LLMutexLock lock(sHandleMutexp) ;  	if (sFreeHandles.empty())  	{ -		ret = curl_easy_init(); +		ret = LLCurl::newEasyHandle();  	}  	else  	{ @@ -250,19 +256,30 @@ CURL* LLCurl::Easy::allocEasyHandle()  //static  void LLCurl::Easy::releaseEasyHandle(CURL* handle)  { +	static const S32 MAX_NUM_FREE_HANDLES = 32 ; +  	if (!handle)  	{ -		llerrs << "handle cannot be NULL!" << llendl; +		return ; //handle allocation failed. +		//llerrs << "handle cannot be NULL!" << llendl;  	}  	LLMutexLock lock(sHandleMutexp) ;  	if (sActiveHandles.find(handle) != sActiveHandles.end())  	{  		sActiveHandles.erase(handle); + +		if(sFreeHandles.size() < MAX_NUM_FREE_HANDLES) +		{  		sFreeHandles.insert(handle);  	}  	else  	{ +			LLCurl::deleteEasyHandle(handle) ; +		} +	} +	else +	{  		llerrs << "Invalid handle." << llendl;  	}  } @@ -302,6 +319,14 @@ LLCurl::Easy::~Easy()  	--gCurlEasyCount;  	curl_slist_free_all(mHeaders);  	for_each(mStrings.begin(), mStrings.end(), DeletePointerArray()); + +	if (mResponder && LLCurl::sNotQuitting) //aborted +	{	 +		std::string reason("Request timeout, aborted.") ; +		mResponder->completedRaw(408, //HTTP_REQUEST_TIME_OUT, timeout, abort +			reason, mChannels, mOutput);		 +	} +	mResponder = NULL;  }  void LLCurl::Easy::resetState() @@ -428,9 +453,9 @@ size_t curlReadCallback(char* data, size_t size, size_t nmemb, void* user_data)  	LLCurl::Easy* easy = (LLCurl::Easy*)user_data;  	S32 n = size * nmemb; -	S32 startpos = easy->getInput().tellg(); +	S32 startpos = (S32)easy->getInput().tellg();  	easy->getInput().seekg(0, std::ios::end); -	S32 endpos = easy->getInput().tellg(); +	S32 endpos = (S32)easy->getInput().tellg();  	easy->getInput().seekg(startpos, std::ios::beg);  	S32 maxn = endpos - startpos;  	n = llmin(n, maxn); @@ -474,6 +499,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,  	LLProxy::getInstance()->applyProxySettings(this);  	mOutput.reset(new LLBufferArray); +	mOutput->setThreaded(true);  	setopt(CURLOPT_WRITEFUNCTION, (void*)&curlWriteCallback);  	setopt(CURLOPT_WRITEDATA, (void*)this); @@ -517,8 +543,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,  }  //////////////////////////////////////////////////////////////////////////// -LLMutex* LLCurl::Multi::sMultiInitMutexp = NULL ; -LLCurl::Multi::Multi() +LLCurl::Multi::Multi(F32 idle_time_out)  	: mQueued(0),  	  mErrorCount(0),  	  mState(STATE_READY), @@ -527,15 +552,17 @@ LLCurl::Multi::Multi()  	  mDeletionMutexp(NULL),  	  mEasyMutexp(NULL)  { -	mCurlMultiHandle = initMulti(); +	mCurlMultiHandle = LLCurl::newMultiHandle();  	if (!mCurlMultiHandle)  	{  		llwarns << "curl_multi_init() returned NULL! Easy handles: " << gCurlEasyCount << " Multi handles: " << gCurlMultiCount << llendl; -		mCurlMultiHandle = initMulti(); +		mCurlMultiHandle = LLCurl::newMultiHandle();  	} -	llassert_always(mCurlMultiHandle);	 +	//llassert_always(mCurlMultiHandle);	 +	if(mCurlMultiHandle) +	{  	if(LLCurl::getCurlThread()->getThreaded())  	{  		mMutexp = new LLMutex(NULL) ; @@ -544,11 +571,28 @@ LLCurl::Multi::Multi()  	}  	LLCurl::getCurlThread()->addMulti(this) ; +		mIdleTimeOut = idle_time_out ; +		if(mIdleTimeOut < LLCurl::sCurlRequestTimeOut) +		{ +			mIdleTimeOut = LLCurl::sCurlRequestTimeOut ; +		} +  	++gCurlMultiCount;  } +}  LLCurl::Multi::~Multi()  { +	cleanup() ;	 +} + +void LLCurl::Multi::cleanup() +{ +	if(!mCurlMultiHandle) +	{ +		return ; //nothing to clean. +	} +  	// Clean up active  	for(easy_active_list_t::iterator iter = mEasyActiveList.begin();  		iter != mEasyActiveList.end(); ++iter) @@ -564,7 +608,8 @@ LLCurl::Multi::~Multi()  	for_each(mEasyFreeList.begin(), mEasyFreeList.end(), DeletePointer());	  	mEasyFreeList.clear(); -	check_curl_multi_code(curl_multi_cleanup(mCurlMultiHandle)); +	check_curl_multi_code(LLCurl::deleteMultiHandle(mCurlMultiHandle)); +	mCurlMultiHandle = NULL ;  	delete mMutexp ;  	mMutexp = NULL ; @@ -573,14 +618,12 @@ LLCurl::Multi::~Multi()  	delete mEasyMutexp ;  	mEasyMutexp = NULL ; +	mQueued = 0 ; +	mState = STATE_COMPLETED; +	  	--gCurlMultiCount; -} - -CURLM* LLCurl::Multi::initMulti() -{ -	LLMutexLock lock(sMultiInitMutexp) ; -	return curl_multi_init() ; +	return ;  }  void LLCurl::Multi::lock() @@ -604,6 +647,7 @@ void LLCurl::Multi::markDead()  	LLMutexLock lock(mDeletionMutexp) ;  	mDead = TRUE ; +	LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ;   }  void LLCurl::Multi::setState(LLCurl::Multi::ePerformState state) @@ -630,6 +674,11 @@ bool LLCurl::Multi::isCompleted()  bool LLCurl::Multi::waitToComplete()  { +	if(!isValid()) +	{ +		return true ; +	} +  	if(!mMutexp) //not threaded  	{  		doPerform() ; @@ -639,7 +688,7 @@ bool LLCurl::Multi::waitToComplete()  	bool completed = (STATE_COMPLETED == mState) ;  	if(!completed)  	{ -		LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_URGENT) ; +		LLCurl::getCurlThread()->setPriority(mHandle, LLQueuedThread::PRIORITY_HIGH) ;  	}  	return completed; @@ -690,6 +739,11 @@ bool LLCurl::Multi::doPerform()  		mQueued = q;	  		setState(STATE_COMPLETED) ; +		mIdleTimer.reset() ; +	} +	else if(mIdleTimer.getElapsedTimeF32() > mIdleTimeOut) //idle for too long, remove it. +	{ +		dead = true ;  	}  	return dead ; @@ -697,6 +751,11 @@ bool LLCurl::Multi::doPerform()  S32 LLCurl::Multi::process()  { +	if(!isValid()) +	{ +		return 0 ; +	} +  	waitToComplete() ;  	if (getState() != STATE_COMPLETED) @@ -849,32 +908,38 @@ bool LLCurlThread::CurlRequest::processRequest()  	if(mMulti)  	{  		completed = mCurlThread->doMultiPerform(mMulti) ; + +		if(!completed) +		{  		setPriority(LLQueuedThread::PRIORITY_LOW) ;  	} +	}  	return completed ;  }  void LLCurlThread::CurlRequest::finishRequest(bool completed)  { +	if(mMulti->isDead()) +	{  	mCurlThread->deleteMulti(mMulti) ; +	} +	else +	{ +		mCurlThread->cleanupMulti(mMulti) ; //being idle too long, remove the request. +	} +  	mMulti = NULL ;  }  LLCurlThread::LLCurlThread(bool threaded) :  	LLQueuedThread("curlthread", threaded)  { -	if(!LLCurl::Multi::sMultiInitMutexp) -	{ -		LLCurl::Multi::sMultiInitMutexp = new LLMutex(NULL) ; -	}  }  //virtual   LLCurlThread::~LLCurlThread()   { -	delete LLCurl::Multi::sMultiInitMutexp ; -	LLCurl::Multi::sMultiInitMutexp = NULL ;  }  S32 LLCurlThread::update(F32 max_time_ms) @@ -896,8 +961,20 @@ void LLCurlThread::addMulti(LLCurl::Multi* multi)  void LLCurlThread::killMulti(LLCurl::Multi* multi)  { +	if(!multi) +	{ +		return ; +	} + +	if(multi->isValid()) +	{  	multi->markDead() ;  } +	else +	{ +		deleteMulti(multi) ; +	} +}  //private  bool LLCurlThread::doMultiPerform(LLCurl::Multi* multi)  @@ -910,6 +987,13 @@ void LLCurlThread::deleteMulti(LLCurl::Multi* multi)  {  	delete multi ;  } + +//private +void LLCurlThread::cleanupMulti(LLCurl::Multi* multi)  +{ +	multi->cleanup() ; +} +  //------------------------------------------------------------  //static @@ -942,6 +1026,13 @@ LLCurlRequest::~LLCurlRequest()  void LLCurlRequest::addMulti()  {  	LLCurl::Multi* multi = new LLCurl::Multi(); +	if(!multi->isValid()) +	{ +		LLCurl::getCurlThread()->killMulti(multi) ; +		mActiveMulti = NULL ; +		mActiveRequestCount = 0 ; +		return; +	}  	mMultiSet.insert(multi);  	mActiveMulti = multi; @@ -956,7 +1047,12 @@ LLCurl::Easy* LLCurlRequest::allocEasy()  	{  		addMulti();  	} -	llassert_always(mActiveMulti); +	if(!mActiveMulti) +	{ +		return NULL ; +	} + +	//llassert_always(mActiveMulti);  	++mActiveRequestCount;  	LLCurl::Easy* easy = mActiveMulti->allocEasy();  	return easy; @@ -1066,6 +1162,19 @@ S32 LLCurlRequest::process()  	{  		curlmulti_set_t::iterator curiter = iter++;  		LLCurl::Multi* multi = *curiter; + +		if(!multi->isValid()) +		{ +			if(multi == mActiveMulti) +			{				 +				mActiveMulti = NULL ; +				mActiveRequestCount = 0 ; +			} +			mMultiSet.erase(curiter) ; +			LLCurl::getCurlThread()->killMulti(multi) ; +			continue ; +		} +  		S32 tres = multi->process();  		res += tres;  		if (multi != mActiveMulti && tres == 0 && multi->mQueued == 0) @@ -1086,6 +1195,19 @@ S32 LLCurlRequest::getQueued()  	{  		curlmulti_set_t::iterator curiter = iter++;  		LLCurl::Multi* multi = *curiter; +		 +		if(!multi->isValid()) +		{ +			if(multi == mActiveMulti) +			{				 +				mActiveMulti = NULL ; +				mActiveRequestCount = 0 ; +			} +			LLCurl::getCurlThread()->killMulti(multi); +			mMultiSet.erase(curiter) ; +			continue ; +		} +  		queued += multi->mQueued;  		if (multi->getState() != LLCurl::Multi::STATE_READY)  		{ @@ -1105,6 +1227,8 @@ LLCurlEasyRequest::LLCurlEasyRequest()  {  	mMulti = new LLCurl::Multi(); +	if(mMulti->isValid()) +	{  	mEasy = mMulti->allocEasy();  	if (mEasy)  	{ @@ -1114,6 +1238,13 @@ LLCurlEasyRequest::LLCurlEasyRequest()  		LLProxy::getInstance()->applyProxySettings(mEasy);  	}  } +	else +	{ +		LLCurl::getCurlThread()->killMulti(mMulti) ; +		mEasy = NULL ; +		mMulti = NULL ; +	} +}  LLCurlEasyRequest::~LLCurlEasyRequest()  { @@ -1122,7 +1253,7 @@ LLCurlEasyRequest::~LLCurlEasyRequest()  void LLCurlEasyRequest::setopt(CURLoption option, S32 value)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setopt(option, value);  	} @@ -1130,7 +1261,7 @@ void LLCurlEasyRequest::setopt(CURLoption option, S32 value)  void LLCurlEasyRequest::setoptString(CURLoption option, const std::string& value)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setoptString(option, value);  	} @@ -1138,7 +1269,7 @@ void LLCurlEasyRequest::setoptString(CURLoption option, const std::string& value  void LLCurlEasyRequest::setPost(char* postdata, S32 size)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setopt(CURLOPT_POST, 1);  		mEasy->setopt(CURLOPT_POSTFIELDS, postdata); @@ -1148,7 +1279,7 @@ void LLCurlEasyRequest::setPost(char* postdata, S32 size)  void LLCurlEasyRequest::setHeaderCallback(curl_header_callback callback, void* userdata)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setopt(CURLOPT_HEADERFUNCTION, (void*)callback);  		mEasy->setopt(CURLOPT_HEADERDATA, userdata); // aka CURLOPT_WRITEHEADER @@ -1157,7 +1288,7 @@ void LLCurlEasyRequest::setHeaderCallback(curl_header_callback callback, void* u  void LLCurlEasyRequest::setWriteCallback(curl_write_callback callback, void* userdata)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setopt(CURLOPT_WRITEFUNCTION, (void*)callback);  		mEasy->setopt(CURLOPT_WRITEDATA, userdata); @@ -1166,7 +1297,7 @@ void LLCurlEasyRequest::setWriteCallback(curl_write_callback callback, void* use  void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userdata)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setopt(CURLOPT_READFUNCTION, (void*)callback);  		mEasy->setopt(CURLOPT_READDATA, userdata); @@ -1175,7 +1306,7 @@ void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userd  void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setopt(CURLOPT_SSL_CTX_FUNCTION, (void*)callback);  		mEasy->setopt(CURLOPT_SSL_CTX_DATA, userdata); @@ -1184,7 +1315,7 @@ void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void*  void LLCurlEasyRequest::slist_append(const char* str)  { -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->slist_append(str);  	} @@ -1195,7 +1326,7 @@ void LLCurlEasyRequest::sendRequest(const std::string& url)  	llassert_always(!mRequestSent);  	mRequestSent = true;  	lldebugs << url << llendl; -	if (mEasy) +	if (isValid() && mEasy)  	{  		mEasy->setHeaders();  		mEasy->setoptString(CURLOPT_URL, url); @@ -1207,7 +1338,7 @@ void LLCurlEasyRequest::requestComplete()  {  	llassert_always(mRequestSent);  	mRequestSent = false; -	if (mEasy) +	if (isValid() && mEasy)  	{  		mMulti->removeEasy(mEasy);  	} @@ -1216,6 +1347,10 @@ void LLCurlEasyRequest::requestComplete()  // Usage: Call getRestult until it returns false (no more messages)  bool LLCurlEasyRequest::getResult(CURLcode* result, LLCurl::TransferInfo* info)  { +	if(!isValid()) +	{ +		return false ; +	}  	if (!mMulti->isCompleted())  	{ //we're busy, try again later  		return false; @@ -1280,7 +1415,7 @@ CURLMsg* LLCurlEasyRequest::info_read(S32* q, LLCurl::TransferInfo* info)  std::string LLCurlEasyRequest::getErrorString()  { -	return mEasy ? std::string(mEasy->getErrorBuffer()) : std::string(); +	return isValid() &&  mEasy ? std::string(mEasy->getErrorBuffer()) : std::string();  }  //////////////////////////////////////////////////////////////////////////// @@ -1306,8 +1441,11 @@ unsigned long LLCurl::ssl_thread_id(void)  }  #endif -void LLCurl::initClass(bool multi_threaded) +void LLCurl::initClass(F32 curl_reuest_timeout, S32 max_number_handles, bool multi_threaded)  { +	sCurlRequestTimeOut = curl_reuest_timeout ; //seconds +	sMaxHandles = max_number_handles ; //max number of handles, (multi handles and easy handles combined). +  	// Do not change this "unless you are familiar with and mean to control   	// internal operations of libcurl"  	// - http://curl.haxx.se/libcurl/c/curl_global_init.html @@ -1328,12 +1466,15 @@ void LLCurl::initClass(bool multi_threaded)  	sCurlThread = new LLCurlThread(multi_threaded) ;  	if(multi_threaded)  	{ +		sHandleMutexp = new LLMutex(NULL) ;  		Easy::sHandleMutexp = new LLMutex(NULL) ;  	}  }  void LLCurl::cleanupClass()  { +	sNotQuitting = false; //set quitting +  	//shut down curl thread  	while(1)  	{ @@ -1354,7 +1495,7 @@ void LLCurl::cleanupClass()  	for (std::set<CURL*>::iterator iter = Easy::sFreeHandles.begin(); iter != Easy::sFreeHandles.end(); ++iter)  	{  		CURL* curl = *iter; -		curl_easy_cleanup(curl); +		LLCurl::deleteEasyHandle(curl);  	}  	Easy::sFreeHandles.clear(); @@ -1362,9 +1503,77 @@ void LLCurl::cleanupClass()  	delete Easy::sHandleMutexp ;  	Easy::sHandleMutexp = NULL ; +	delete sHandleMutexp ; +	sHandleMutexp = NULL ; +  	llassert(Easy::sActiveHandles.empty());  } +//static  +CURLM* LLCurl::newMultiHandle() +{ +	LLMutexLock lock(sHandleMutexp) ; + +	if(sTotalHandles + 1 > sMaxHandles) +	{ +		llwarns << "no more handles available." << llendl ; +		return NULL ; //failed +	} +	sTotalHandles++; + +	CURLM* ret = curl_multi_init() ; +	if(!ret) +	{ +		llwarns << "curl_multi_init failed." << llendl ; +	} + +	return ret ; +} + +//static  +CURLMcode  LLCurl::deleteMultiHandle(CURLM* handle) +{ +	if(handle) +	{ +		LLMutexLock lock(sHandleMutexp) ;		 +		sTotalHandles-- ; +		return curl_multi_cleanup(handle) ; +	} +	return CURLM_OK ; +} + +//static  +CURL*  LLCurl::newEasyHandle() +{ +	LLMutexLock lock(sHandleMutexp) ; + +	if(sTotalHandles + 1 > sMaxHandles) +	{ +		llwarns << "no more handles available." << llendl ; +		return NULL ; //failed +	} +	sTotalHandles++; + +	CURL* ret = curl_easy_init() ; +	if(!ret) +	{ +		llwarns << "curl_easy_init failed." << llendl ; +	} + +	return ret ; +} + +//static  +void  LLCurl::deleteEasyHandle(CURL* handle) +{ +	if(handle) +	{ +		LLMutexLock lock(sHandleMutexp) ; +		curl_easy_cleanup(handle) ; +		sTotalHandles-- ; +	} +} +  const unsigned int LLCurl::MAX_REDIRECTS = 5;  // Provide access to LLCurl free functions outside of llcurl.cpp without polluting the global namespace. diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index 9c2c215c7a..fd664c0fa1 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -43,6 +43,7 @@  #include "llsd.h"  #include "llthread.h"  #include "llqueuedthread.h" +#include "llframetimer.h"  class LLMutex;  class LLCurlThread; @@ -162,7 +163,7 @@ public:  	/**  	 * @ brief Initialize LLCurl class  	 */ -	static void initClass(bool multi_threaded = false); +	static void initClass(F32 curl_reuest_timeout = 120.f, S32 max_number_handles = 256, bool multi_threaded = false);  	/**  	 * @ brief Cleanup LLCurl class @@ -182,11 +183,24 @@ public:  	static unsigned long ssl_thread_id(void);  	static LLCurlThread* getCurlThread() { return sCurlThread ;} + +	static CURLM* newMultiHandle() ; +	static CURLMcode deleteMultiHandle(CURLM* handle) ; +	static CURL*  newEasyHandle() ; +	static void   deleteEasyHandle(CURL* handle) ; +  private:  	static std::string sCAPath;  	static std::string sCAFile;  	static const unsigned int MAX_REDIRECTS;  	static LLCurlThread* sCurlThread; + +	static LLMutex* sHandleMutexp ; +	static S32      sTotalHandles ; +	static S32      sMaxHandles; +public: +	static bool     sNotQuitting; +	static F32      sCurlRequestTimeOut;	  };  class LLCurl::Easy @@ -277,7 +291,7 @@ public:  		STATE_COMPLETED=2  	} ePerformState; -	Multi();	 +	Multi(F32 idle_time_out = 0.f);	  	LLCurl::Easy* allocEasy();  	bool addEasy(LLCurl::Easy* easy);	 @@ -288,7 +302,10 @@ public:  	void setState(ePerformState state) ;  	ePerformState getState() ; +	  	bool isCompleted() ; +	bool isValid() {return mCurlMultiHandle != NULL ;} +	bool isDead() {return mDead;}  	bool waitToComplete() ; @@ -299,9 +316,9 @@ public:  	S32 mQueued;  	S32 mErrorCount; -	static CURLM* initMulti() ;  private:  	void easyFree(LLCurl::Easy*); +	void cleanup() ;  	CURLM* mCurlMultiHandle; @@ -319,8 +336,8 @@ private:  	LLMutex* mMutexp ;  	LLMutex* mDeletionMutexp ;  	LLMutex* mEasyMutexp ; - -	static LLMutex* sMultiInitMutexp ; +	LLFrameTimer mIdleTimer ; +	F32 mIdleTimeOut;  };  class LLCurlThread : public LLQueuedThread @@ -357,6 +374,7 @@ public:  private:  	bool doMultiPerform(LLCurl::Multi* multi) ;  	void deleteMulti(LLCurl::Multi* multi) ; +	void cleanupMulti(LLCurl::Multi* multi) ;  } ;  namespace boost @@ -414,6 +432,7 @@ public:  	std::string getErrorString();  	bool isCompleted() {return mMulti->isCompleted() ;}  	bool wait() { return mMulti->waitToComplete(); } +	bool isValid() {return mMulti && mMulti->isValid(); }  	LLCurl::Easy* getEasy() const { return mEasy; } diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp index 2bca517e97..612d765969 100644 --- a/indra/llmessage/llhttpassetstorage.cpp +++ b/indra/llmessage/llhttpassetstorage.cpp @@ -232,7 +232,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const  void LLHTTPAssetRequest::setupCurlHandle()  {  	// *NOTE: Similar code exists in mapserver/llcurlutil.cpp  JC -	mCurlHandle = curl_easy_init(); +	mCurlHandle = LLCurl::newEasyHandle(); +	llassert_always(mCurlHandle != NULL) ;  	// Apply proxy settings if configured to do so  	LLProxy::getInstance()->applyProxySettings(mCurlHandle); @@ -278,7 +279,7 @@ void LLHTTPAssetRequest::setupCurlHandle()  void LLHTTPAssetRequest::cleanupCurlHandle()  { -	curl_easy_cleanup(mCurlHandle); +	LLCurl::deleteEasyHandle(mCurlHandle);  	if (mAssetStoragep)  	{  		// Terminating a request.  Thus upload or download is no longer pending. @@ -429,12 +430,13 @@ void LLHTTPAssetStorage::_init(const std::string& web_host, const std::string& l  	// curl_global_init moved to LLCurl::initClass() -	mCurlMultiHandle = curl_multi_init(); +	mCurlMultiHandle = LLCurl::newMultiHandle() ; +	llassert_always(mCurlMultiHandle != NULL) ;  }  LLHTTPAssetStorage::~LLHTTPAssetStorage()  { -	curl_multi_cleanup(mCurlMultiHandle); +	LLCurl::deleteMultiHandle(mCurlMultiHandle);  	mCurlMultiHandle = NULL;  	// curl_global_cleanup moved to LLCurl::initClass() diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index dd4e3a6300..0c325a68aa 100644 --- a/indra/llmessage/llhttpclient.cpp +++ b/indra/llmessage/llhttpclient.cpp @@ -158,7 +158,7 @@ namespace  			if(fstream.is_open())  			{  				fstream.seekg(0, std::ios::end); -				U32 fileSize = fstream.tellg(); +				U32 fileSize = (U32)fstream.tellg();  				fstream.seekg(0, std::ios::beg);  				std::vector<char> fileBuffer(fileSize);  				fstream.read(&fileBuffer[0], fileSize); @@ -228,6 +228,12 @@ static void request(  	LLPumpIO::chain_t chain;  	LLURLRequest* req = new LLURLRequest(method, url); +	if(!req->isValid())//failed +	{ +		delete req ; +		return ; +	} +  	req->setSSLVerifyCallback(LLHTTPClient::getCertVerifyCallback(), (void *)req); @@ -423,7 +429,9 @@ static LLSD blocking_request(  {  	lldebugs << "blockingRequest of " << url << llendl;  	char curl_error_buffer[CURL_ERROR_SIZE] = "\0"; -	CURL* curlp = curl_easy_init(); +	CURL* curlp = LLCurl::newEasyHandle(); +	llassert_always(curlp != NULL) ; +  	LLHTTPBuffer http_buffer;  	std::string body_str; @@ -517,7 +525,7 @@ static LLSD blocking_request(  	}  	// * Cleanup -	curl_easy_cleanup(curlp); +	LLCurl::deleteEasyHandle(curlp);  	return response;  } diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp index 73e8a69085..987f386aa3 100644 --- a/indra/llmessage/lliohttpserver.cpp +++ b/indra/llmessage/lliohttpserver.cpp @@ -818,6 +818,8 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(    			// Copy everything after mLast read to the out.  			LLBufferArray::segment_iterator_t seg_iter; + +			buffer->lock();  			seg_iter = buffer->splitAfter(mLastRead);  			if(seg_iter != buffer->endSegment())  			{ @@ -838,7 +840,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(  				}  #endif  			} - +			buffer->unlock();  			//  			// *FIX: get rid of extra bytes off the end  			// diff --git a/indra/llmessage/lliopipe.cpp b/indra/llmessage/lliopipe.cpp index 6e4eec74a6..8f827f7a30 100644 --- a/indra/llmessage/lliopipe.cpp +++ b/indra/llmessage/lliopipe.cpp @@ -75,6 +75,12 @@ LLIOPipe::~LLIOPipe()  	//lldebugs << "destroying LLIOPipe" << llendl;  } +//virtual  +bool LLIOPipe::isValid()  +{ +	return true ; +} +  // static  std::string LLIOPipe::lookupStatusString(EStatus status)  { diff --git a/indra/llmessage/lliopipe.h b/indra/llmessage/lliopipe.h index 8e656b6da1..cbd17b5a3d 100644 --- a/indra/llmessage/lliopipe.h +++ b/indra/llmessage/lliopipe.h @@ -231,6 +231,8 @@ public:  	 */  	virtual ~LLIOPipe(); +	virtual bool isValid() ; +  protected:  	/**  	 * @brief Base Constructor. diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp index 54ceab3422..d5b4d45821 100644 --- a/indra/llmessage/lliosocket.cpp +++ b/indra/llmessage/lliosocket.cpp @@ -445,6 +445,7 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(  	// efficient - not only because writev() is better, but also  	// because we won't have to do as much work to find the start  	// address. +	buffer->lock();  	LLBufferArray::segment_iterator_t it;  	LLBufferArray::segment_iterator_t end = buffer->endSegment();  	LLSegment segment; @@ -524,6 +525,8 @@ LLIOPipe::EStatus LLIOSocketWriter::process_impl(  		}  	} +	buffer->unlock(); +  	PUMP_DEBUG;  	if(done && eos)  	{ diff --git a/indra/llmessage/llmime.cpp b/indra/llmessage/llmime.cpp index 943a734927..9d9c4ebd68 100644 --- a/indra/llmessage/llmime.cpp +++ b/indra/llmessage/llmime.cpp @@ -388,7 +388,7 @@ bool LLMimeParser::Impl::parseHeaders(  		// not to read past limit when we get() the newline.  		S32 max_get = llmin((S32)LINE_BUFFER_LENGTH, limit - mScanCount - 1);  		istr.getline(mBuffer, max_get, '\r'); -		mScanCount += istr.gcount(); +		mScanCount += (S32)istr.gcount();  		int c = istr.get();  		if(EOF == c)  		{ @@ -496,7 +496,7 @@ void LLMimeParser::Impl::scanPastSeparator(  		// past limit when we get() the newline.  		S32 max_get = llmin((S32)LINE_BUFFER_LENGTH, limit - mScanCount - 1);  		istr.getline(mBuffer, max_get, '\r'); -		mScanCount += istr.gcount(); +		mScanCount += (S32)istr.gcount();  		if(istr.gcount() >= LINE_BUFFER_LENGTH - 1)  		{  			// that's way too long to be a separator, so ignore it. diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp index a8d2a0a224..f3ef4f2684 100644 --- a/indra/llmessage/llpumpio.cpp +++ b/indra/llmessage/llpumpio.cpp @@ -195,7 +195,7 @@ bool LLPumpIO::prime(apr_pool_t* pool)  	return ((pool == NULL) ? false : true);  } -bool LLPumpIO::addChain(const chain_t& chain, F32 timeout) +bool LLPumpIO::addChain(const chain_t& chain, F32 timeout, bool has_curl_request)  {  	LLMemType m1(LLMemType::MTYPE_IO_PUMP);  	if(chain.empty()) return false; @@ -204,8 +204,10 @@ bool LLPumpIO::addChain(const chain_t& chain, F32 timeout)  	LLScopedLock lock(mChainsMutex);  #endif  	LLChainInfo info; +	info.mHasCurlRequest = has_curl_request;  	info.setTimeoutSeconds(timeout);  	info.mData = LLIOPipe::buffer_ptr_t(new LLBufferArray); +	info.mData->setThreaded(has_curl_request);  	LLLinkInfo link;  #if LL_DEBUG_PIPE_TYPE_IN_PUMP  	lldebugs << "LLPumpIO::addChain() " << chain[0] << " '" @@ -440,6 +442,15 @@ void LLPumpIO::pump()  static LLFastTimer::DeclareTimer FTM_PUMP_IO("Pump IO"); +LLPumpIO::current_chain_t LLPumpIO::removeRunningChain(LLPumpIO::current_chain_t& run_chain)  +{ +	std::for_each( +				(*run_chain).mDescriptors.begin(), +				(*run_chain).mDescriptors.end(), +				ll_delete_apr_pollset_fd_client_data()); +	return mRunningChains.erase(run_chain); +} +  //timeout is in microseconds  void LLPumpIO::pump(const S32& poll_timeout)  { @@ -585,10 +596,16 @@ void LLPumpIO::pump(const S32& poll_timeout)  //						<< (*run_chain).mChainLinks[0].mPipe  //						<< " because we reached the end." << llendl;  #endif -				run_chain = mRunningChains.erase(run_chain); +				run_chain = removeRunningChain(run_chain);  				continue;  			}  		} +		else if(isChainExpired(*run_chain)) +		{ +			run_chain = removeRunningChain(run_chain); +			continue; +		} +  		PUMP_DEBUG;  		if((*run_chain).mLock)  		{ @@ -696,11 +713,7 @@ void LLPumpIO::pump(const S32& poll_timeout)  			PUMP_DEBUG;  			// This chain is done. Clean up any allocated memory and  			// erase the chain info. -			std::for_each( -				(*run_chain).mDescriptors.begin(), -				(*run_chain).mDescriptors.end(), -				ll_delete_apr_pollset_fd_client_data()); -			run_chain = mRunningChains.erase(run_chain); +			run_chain = removeRunningChain(run_chain);  			// *NOTE: may not always need to rebuild the pollset.  			mRebuildPollset = true; @@ -1095,6 +1108,24 @@ void LLPumpIO::processChain(LLChainInfo& chain)  	PUMP_DEBUG;  } +bool LLPumpIO::isChainExpired(LLChainInfo& chain) +{ +	if(!chain.mHasCurlRequest) +	{ +		return false ; +	} + +	for(links_t::iterator iter = chain.mChainLinks.begin(); iter != chain.mChainLinks.end(); ++iter) +	{ +		if(!(*iter).mPipe->isValid()) +		{ +			return true ; +		} +	} + +	return false ; +} +  bool LLPumpIO::handleChainError(  	LLChainInfo& chain,  	LLIOPipe::EStatus error) @@ -1136,6 +1167,9 @@ bool LLPumpIO::handleChainError(  #endif  			keep_going = false;  			break; +		case LLIOPipe::STATUS_EXPIRED: +			keep_going = false; +			break ;  		default:  			if(LLIOPipe::isSuccess(error))  			{ @@ -1157,7 +1191,8 @@ bool LLPumpIO::handleChainError(  LLPumpIO::LLChainInfo::LLChainInfo() :  	mInit(false),  	mLock(0), -	mEOS(false) +	mEOS(false), +	mHasCurlRequest(false)  {  	LLMemType m1(LLMemType::MTYPE_IO_PUMP);  	mTimer.setTimerExpirySec(DEFAULT_CHAIN_EXPIRY_SECS); diff --git a/indra/llmessage/llpumpio.h b/indra/llmessage/llpumpio.h index 9303c9d7fc..d2c5d37571 100644 --- a/indra/llmessage/llpumpio.h +++ b/indra/llmessage/llpumpio.h @@ -111,9 +111,10 @@ public:  	 * @param chain The pipes for the chain  	 * @param timeout The number of seconds in the future to  	 * expire. Pass in 0.0f to never expire. +	 * @param has_curl_request The chain contains LLURLRequest if true.  	 * @return Returns true if anything was added to the pump.  	 */ -	bool addChain(const chain_t& chain, F32 timeout); +	bool addChain(const chain_t& chain, F32 timeout, bool has_curl_request = false);  	/**   	 * @brief Struct to associate a pipe with it's buffer io indexes. @@ -356,12 +357,13 @@ protected:  		// basic member data  		bool mInit; +		bool mEOS; +		bool mHasCurlRequest;  		S32 mLock;  		LLFrameTimer mTimer;  		links_t::iterator mHead;  		links_t mChainLinks; -		LLIOPipe::buffer_ptr_t mData; -		bool mEOS; +		LLIOPipe::buffer_ptr_t mData;		  		LLSD mContext;  		// tracking inside the pump @@ -402,7 +404,7 @@ protected:  protected:  	void initialize(apr_pool_t* pool);  	void cleanup(); - +	current_chain_t removeRunningChain(current_chain_t& chain) ;  	/**   	 * @brief Given the internal state of the chains, rebuild the pollset  	 * @see setConditional() @@ -429,6 +431,9 @@ protected:  	 */  	bool handleChainError(LLChainInfo& chain, LLIOPipe::EStatus error); +	//if the chain is expired, remove it +	bool isChainExpired(LLChainInfo& chain) ; +  public:  	/**   	 * @brief Return number of running chains. diff --git a/indra/llmessage/llsdmessage.cpp b/indra/llmessage/llsdmessage.cpp index 9148c9dd15..1c93c12d99 100644 --- a/indra/llmessage/llsdmessage.cpp +++ b/indra/llmessage/llsdmessage.cpp @@ -88,7 +88,7 @@ bool LLSDMessage::httpListener(const LLSD& request)                                                         request,                                                         url, "POST", reply, error),                         LLSD(),      // headers -                       timeout); +                       (F32)timeout);      return false;  } diff --git a/indra/llmessage/llsdmessagebuilder.cpp b/indra/llmessage/llsdmessagebuilder.cpp index 2698a271ee..615221e0ad 100644 --- a/indra/llmessage/llsdmessagebuilder.cpp +++ b/indra/llmessage/llsdmessagebuilder.cpp @@ -317,7 +317,7 @@ void LLSDMessageBuilder::copyFromMessageData(const LLMsgData& data)  			// S64 not supported in LLSD so we just truncate it  			case MVT_S64: -				addS32(varname, *(S64*)mvci.getData()); +				addS32(varname, (S32)*(S64*)mvci.getData());  				break;  			case MVT_F32: diff --git a/indra/llmessage/llsdrpcclient.h b/indra/llmessage/llsdrpcclient.h index 9fb49a5c33..0cecf4f688 100644 --- a/indra/llmessage/llsdrpcclient.h +++ b/indra/llmessage/llsdrpcclient.h @@ -240,9 +240,16 @@ public:  	virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const  	{  		lldebugs << "LLSDRPCClientFactory::build" << llendl; -		LLIOPipe::ptr_t service(new Client); -		chain.push_back(service);  		LLURLRequest* http(new LLURLRequest(LLURLRequest::HTTP_POST)); +		if(!http->isValid()) +		{ +			llwarns << "Creating LLURLRequest failed." << llendl ; +			delete http; +			return false; +		} + +		LLIOPipe::ptr_t service(new Client); +		chain.push_back(service);		  		LLIOPipe::ptr_t http_pipe(http);  		http->addHeader("Content-Type: text/llsd");  		if(mURL.empty()) @@ -283,9 +290,16 @@ public:  	virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const  	{  		lldebugs << "LLXMLSDRPCClientFactory::build" << llendl; -		LLIOPipe::ptr_t service(new Client); -		chain.push_back(service); +  		LLURLRequest* http(new LLURLRequest(LLURLRequest::HTTP_POST)); +		if(!http->isValid()) +		{ +			llwarns << "Creating LLURLRequest failed." << llendl ; +			delete http; +			return false ; +		} +		LLIOPipe::ptr_t service(new Client); +		chain.push_back(service);		  		LLIOPipe::ptr_t http_pipe(http);  		http->addHeader("Content-Type: text/xml");  		if(mURL.empty()) diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index 261e57e79e..a16f5c7bf0 100644 --- a/indra/llmessage/llurlrequest.cpp +++ b/indra/llmessage/llurlrequest.cpp @@ -83,6 +83,12 @@ LLURLRequestDetail::LLURLRequestDetail() :  {  	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);  	mCurlRequest = new LLCurlEasyRequest(); +	 +	if(!mCurlRequest->isValid()) //failed. +	{ +		delete mCurlRequest ; +		mCurlRequest = NULL ; +	}  }  LLURLRequestDetail::~LLURLRequestDetail() @@ -250,12 +256,24 @@ void LLURLRequest::allowCookies()  	mDetail->mCurlRequest->setoptString(CURLOPT_COOKIEFILE, "");  } +//virtual  +bool LLURLRequest::isValid()  +{ +	return mDetail->mCurlRequest && mDetail->mCurlRequest->isValid();  +} +  // virtual  LLIOPipe::EStatus LLURLRequest::handleError(  	LLIOPipe::EStatus status,  	LLPumpIO* pump)  {  	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST); +	 +	if(!isValid()) +	{ +		return STATUS_EXPIRED ; +	} +  	if(mCompletionCallback && pump)  	{  		LLURLRequestComplete* complete = NULL; @@ -441,6 +459,12 @@ void LLURLRequest::initialize()  	LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);  	mState = STATE_INITIALIZED;  	mDetail = new LLURLRequestDetail; + +	if(!isValid()) +	{ +		return ; +	} +  	mDetail->mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);  	mDetail->mCurlRequest->setWriteCallback(&downCallback, (void*)this);  	mDetail->mCurlRequest->setReadCallback(&upCallback, (void*)this); diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h index ec5c2c1941..44d358d906 100644 --- a/indra/llmessage/llurlrequest.h +++ b/indra/llmessage/llurlrequest.h @@ -188,6 +188,8 @@ public:  	 */  	void allowCookies(); +	/*virtual*/ bool isValid() ; +  public:  	/**   	 * @brief Give this pipe a chance to handle a generated error diff --git a/indra/llmessage/llxfer.h b/indra/llmessage/llxfer.h index 989e8b2cab..f9348eb11f 100644 --- a/indra/llmessage/llxfer.h +++ b/indra/llmessage/llxfer.h @@ -29,6 +29,7 @@  #include "message.h"  #include "lltimer.h" +#include "llextendedstatus.h"  const S32 LL_XFER_LARGE_PAYLOAD = 7680; diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index d0b0e178b8..6a425cfe98 100644 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -3147,7 +3147,7 @@ bool LLMessageSystem::generateDigestForWindowAndUUIDs(char* digest, const S32 wi  		LL_ERRS("Messaging") << "Trying to generate complex digest on a machine without a shared secret!" << llendl;  	} -	U32 now = time(NULL); +	U32 now = (U32)time(NULL);  	now /= window; @@ -3167,7 +3167,7 @@ bool LLMessageSystem::isMatchingDigestForWindowAndUUIDs(const char* digest, cons  	}  	char our_digest[MD5HEX_STR_SIZE];	/* Flawfinder: ignore */ -	U32 now = time(NULL); +	U32 now = (U32)time(NULL);  	now /= window; @@ -3213,7 +3213,7 @@ bool LLMessageSystem::generateDigestForWindow(char* digest, const S32 window) co  		LL_ERRS("Messaging") << "Trying to generate simple digest on a machine without a shared secret!" << llendl;  	} -	U32 now = time(NULL); +	U32 now = (U32)time(NULL);  	now /= window; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 7d827ae483..fccbf37a8d 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -56,8 +56,9 @@ std::string LLFontGL::sAppDir;  LLColor4 LLFontGL::sShadowColor(0.f, 0.f, 0.f, 1.f);  LLFontRegistry* LLFontGL::sFontRegistry = NULL; -LLCoordFont LLFontGL::sCurOrigin; -std::vector<LLCoordFont> LLFontGL::sOriginStack; +LLCoordGL LLFontGL::sCurOrigin; +F32 LLFontGL::sCurDepth; +std::vector<std::pair<LLCoordGL, F32> > LLFontGL::sOriginStack;  const F32 EXT_X_BEARING = 1.f;  const F32 EXT_Y_BEARING = 0.f; @@ -68,20 +69,6 @@ const F32 PIXEL_CORRECTION_DISTANCE = 0.01f;  const F32 PAD_UVY = 0.5f; // half of vertical padding between glyphs in the glyph texture  const F32 DROP_SHADOW_SOFT_STRENGTH = 0.3f; -static F32 llfont_round_x(F32 x) -{ -	//return llfloor((x-LLFontGL::sCurOrigin.mX)/LLFontGL::sScaleX+0.5f)*LLFontGL::sScaleX+LLFontGL::sCurOrigin.mX; -	//return llfloor(x/LLFontGL::sScaleX+0.5f)*LLFontGL::sScaleY; -	return x; -} - -static F32 llfont_round_y(F32 y) -{ -	//return llfloor((y-LLFontGL::sCurOrigin.mY)/LLFontGL::sScaleY+0.5f)*LLFontGL::sScaleY+LLFontGL::sCurOrigin.mY; -	//return llfloor(y+0.5f); -	return y; -} -  LLFontGL::LLFontGL()  {  } @@ -115,23 +102,23 @@ static LLFastTimer::DeclareTimer FTM_RENDER_FONTS("Fonts");  S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRect& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style,   					 ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const  { -	F32 x = rect.mLeft; +	F32 x = (F32)rect.mLeft;  	F32 y = 0.f;  	switch(valign)  	{  	case TOP: -		y = rect.mTop; +		y = (F32)rect.mTop;  		break;  	case VCENTER: -		y = rect.getCenterY(); +		y = (F32)rect.getCenterY();  		break;  	case BASELINE:  	case BOTTOM: -		y = rect.mBottom; +		y = (F32)rect.mBottom;  		break;  	default: -		y = rect.mBottom; +		y = (F32)rect.mBottom;  		break;  	}  	return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses); @@ -177,21 +164,11 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	gGL.loadUIIdentity(); -	//gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ); - -	// this code snaps the text origin to a pixel grid to start with -	//F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); -	//F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY); -	//gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f); -  	LLVector2 origin(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY)); -	// snap the text origin to a pixel grid to start with -	origin.mV[VX] -= llround((F32)sCurOrigin.mX) - (sCurOrigin.mX); -	origin.mV[VY] -= llround((F32)sCurOrigin.mY) - (sCurOrigin.mY); -	// Depth translation, so that floating text appears 'inworld' -	// and is correclty occluded. -	gGL.translatef(0.f,0.f,sCurOrigin.mZ); +	// Depth translation, so that floating text appears 'in-world' +	// and is correctly occluded. +	gGL.translatef(0.f,0.f,sCurDepth);  	S32 chars_drawn = 0;  	S32 i; @@ -225,7 +202,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  		cur_y += llceil(mFontFreetype->getDescenderHeight());  		break;  	case VCENTER: -		cur_y -= (mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight()) / 2.f; +		cur_y -= llceil((llceil(mFontFreetype->getAscenderHeight()) - llceil(mFontFreetype->getDescenderHeight())) / 2.f);  		break;  	case BASELINE:  		// Baseline, do nothing. @@ -251,7 +228,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  	cur_render_y = cur_y;  	cur_render_x = cur_x; -	F32 start_x = llround(cur_x); +	F32 start_x = (F32)llround(cur_x);  	const LLFontBitmapCache* font_bitmap_cache = mFontFreetype->getFontBitmapCache(); @@ -335,10 +312,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  				(fgi->mXBitmapOffset + fgi->mWidth) * inv_width,  				(fgi->mYBitmapOffset - PAD_UVY) * inv_height);  		// snap glyph origin to whole screen pixel -		LLRectf screen_rect(llround(cur_render_x + (F32)fgi->mXBearing), -				    llround(cur_render_y + (F32)fgi->mYBearing), -				    llround(cur_render_x + (F32)fgi->mXBearing) + (F32)fgi->mWidth, -				    llround(cur_render_y + (F32)fgi->mYBearing) - (F32)fgi->mHeight); +		LLRectf screen_rect((F32)llround(cur_render_x + (F32)fgi->mXBearing), +				    (F32)llround(cur_render_y + (F32)fgi->mYBearing), +				    (F32)llround(cur_render_x + (F32)fgi->mXBearing) + (F32)fgi->mWidth, +				    (F32)llround(cur_render_y + (F32)fgi->mYBearing) - (F32)fgi->mHeight);  		if (glyph_count >= GLYPH_BATCH_SIZE)  		{ @@ -445,19 +422,9 @@ S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y  }  // font metrics - override for LLFontFreetype that returns units of virtual pixels -F32 LLFontGL::getLineHeight() const +S32 LLFontGL::getLineHeight() const  {  -	return (F32)llceil(mFontFreetype->getLineHeight() / sScaleY);  -} - -F32 LLFontGL::getAscenderHeight() const -{  -	return (F32)llceil(mFontFreetype->getAscenderHeight() / sScaleY);  -} - -F32 LLFontGL::getDescenderHeight() const -{  -	return (F32)llceil(mFontFreetype->getDescenderHeight() / sScaleY);  +	return llceil(mFontFreetype->getAscenderHeight() / sScaleY) + llceil(mFontFreetype->getDescenderHeight() / sScaleY);  }  S32 LLFontGL::getWidth(const std::string& utf8text) const @@ -646,7 +613,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch  		}  		// Round after kerning. -		cur_x = llround(cur_x); +		cur_x = (F32)llround(cur_x);  		drawn_x = cur_x;  	} @@ -717,7 +684,7 @@ S32	LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_  		}  		// Round after kerning. -		total_width = llround(total_width); +		total_width = (F32)llround(total_width);  	}  	if (drawable_chars == 0) @@ -800,7 +767,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t  		// Round after kerning. -		cur_x = llround(cur_x); +		cur_x = (F32)llround(cur_x);  	}  	return llmin(max_chars, pos - begin_offset); @@ -1147,22 +1114,22 @@ void LLFontGL::renderQuad(LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* c  {  	S32 index = 0; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mTop), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mTop, 0.f);  	uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mTop);  	colors_out[index] = color;  	index++; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mTop), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mTop, 0.f);  	uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop);  	colors_out[index] = color;  	index++; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mLeft), llfont_round_y(screen_rect.mBottom), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mBottom, 0.f);  	uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom);  	colors_out[index] = color;  	index++; -	vertex_out[index] = LLVector3(llfont_round_x(screen_rect.mRight), llfont_round_y(screen_rect.mBottom), 0.f); +	vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mBottom, 0.f);  	uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom);  	colors_out[index] = color;  } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index dc8d848ed2..74bdbb43e7 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -115,9 +115,7 @@ public:  	S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const;  	// font metrics - override for LLFontFreetype that returns units of virtual pixels -	F32 getLineHeight() const; -	F32 getAscenderHeight() const; -	F32 getDescenderHeight() const; +	S32 getLineHeight() const;  	S32 getWidth(const std::string& utf8text) const;  	S32 getWidth(const llwchar* wchars) const; @@ -188,8 +186,9 @@ public:  	static std::string getFontPathLocal();  	static std::string getFontPathSystem(); -	static LLCoordFont sCurOrigin; -	static std::vector<LLCoordFont> sOriginStack; +	static LLCoordGL sCurOrigin; +	static F32			sCurDepth; +	static std::vector<std::pair<LLCoordGL, F32> > sOriginStack;  	static LLColor4 sShadowColor; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index cd827f5091..b0ddacbb05 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -997,7 +997,7 @@ void LLLightState::setSpotDirection(const LLVector3& direction)  		const glh::matrix4f& mat = gGL.getModelviewMatrix();  		mat.mult_matrix_dir(dir); -		mSpotDirection.set(direction); +		mSpotDirection.set(dir.v);  	}  } @@ -1434,6 +1434,8 @@ void LLRender::loadIdentity()  	flush();  	{ +		llassert_always(mMatrixMode < NUM_MATRIX_MODES) ; +  		mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].make_identity();  		mMatHash[mMatrixMode]++;  	} diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 20a450fbfb..eb302392bb 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -148,7 +148,7 @@ U32 wpo2(U32 i)  	return r;  } -U8* LLVBOPool::allocate(U32& name, U32 size) +volatile U8* LLVBOPool::allocate(U32& name, U32 size)  {  	llassert(nhpo2(size) == size); @@ -159,20 +159,25 @@ U8* LLVBOPool::allocate(U32& name, U32 size)  		mFreeList.resize(i+1);  	} -	U8* ret = NULL; +	volatile U8* ret = NULL;  	if (mFreeList[i].empty())  	{  		//make a new buffer  		glGenBuffersARB(1, &name);  		glBindBufferARB(mType, name); -		glBufferDataARB(mType, size, 0, mUsage);  		LLVertexBuffer::sAllocatedBytes += size; -		if (LLVertexBuffer::sDisableVBOMapping) +		if (LLVertexBuffer::sDisableVBOMapping || mUsage != GL_DYNAMIC_DRAW_ARB)  		{ +			glBufferDataARB(mType, size, 0, mUsage);  			ret = (U8*) ll_aligned_malloc_16(size);  		} +		else +		{ //always use a true hint of static draw when allocating non-client-backed buffers +			glBufferDataARB(mType, size, 0, GL_STATIC_DRAW_ARB); +		} +  		glBindBufferARB(mType, 0);  	}  	else @@ -188,7 +193,7 @@ U8* LLVBOPool::allocate(U32& name, U32 size)  	return ret;  } -void LLVBOPool::release(U32 name, U8* buffer, U32 size) +void LLVBOPool::release(U32 name, volatile U8* buffer, U32 size)  {  	llassert(nhpo2(size) == size); @@ -201,8 +206,15 @@ void LLVBOPool::release(U32 name, U8* buffer, U32 size)  	rec.mClientData = buffer;  	sBytesPooled += size; - -	mFreeList[i].push_back(rec); +	 +	if (!LLVertexBuffer::sDisableVBOMapping && mUsage == GL_DYNAMIC_DRAW_ARB) +	{ +		glDeleteBuffersARB(1, &rec.mGLName); +	} +	else +	{ +		mFreeList[i].push_back(rec); +	}  }  void LLVBOPool::cleanup() @@ -221,7 +233,7 @@ void LLVBOPool::cleanup()  			if (r.mClientData)  			{ -				ll_aligned_free_16(r.mClientData); +				ll_aligned_free_16((void*) r.mClientData);  			}  			l.pop_front(); @@ -536,7 +548,7 @@ void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_of  void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const  {  	validateRange(start, end, count, indices_offset); - +	mMappable = FALSE;  	gGL.syncMatrices();  	llassert(mNumVerts >= 0); @@ -591,7 +603,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi  void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const  {  	llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL); - +	mMappable = FALSE;  	gGL.syncMatrices();  	llassert(mNumIndices >= 0); @@ -637,7 +649,7 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const  void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const  {  	llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL); -	 +	mMappable = FALSE;  	gGL.syncMatrices();  	llassert(mNumVerts >= 0); @@ -787,9 +799,26 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :  	if (mUsage && mUsage != GL_STREAM_DRAW_ARB)  	{ //only stream_draw and dynamic_draw are supported when using VBOs, dynamic draw is the default -		mUsage = GL_DYNAMIC_DRAW_ARB; +		if (sDisableVBOMapping) +		{ //always use stream draw if VBO mapping is disabled +			mUsage = GL_STREAM_DRAW_ARB; +		} +		else +		{ +			mUsage = GL_DYNAMIC_DRAW_ARB; +		}  	} -		 +	 + +	if (mUsage == GL_DYNAMIC_DRAW_ARB && !sDisableVBOMapping) +	{ +		mMappable = TRUE; +	} +	else +	{ +		mMappable = FALSE; +	} +  	//zero out offsets  	for (U32 i = 0; i < TYPE_MAX; i++)  	{ @@ -1042,7 +1071,7 @@ void LLVertexBuffer::destroyGLBuffer()  		}  		else  		{ -			FREE_MEM(sPrivatePoolp, mMappedData) ; +			FREE_MEM(sPrivatePoolp, (void*) mMappedData) ;  			mMappedData = NULL;  			mEmpty = TRUE;  		} @@ -1063,7 +1092,7 @@ void LLVertexBuffer::destroyGLIndices()  		}  		else  		{ -			FREE_MEM(sPrivatePoolp, mMappedIndexData) ; +			FREE_MEM(sPrivatePoolp, (void*) mMappedIndexData) ;  			mMappedIndexData = NULL;  			mEmpty = TRUE;  		} @@ -1282,8 +1311,11 @@ bool expand_region(LLVertexBuffer::MappedRegion& region, S32 index, S32 count)  	return true;  } +static LLFastTimer::DeclareTimer FTM_VBO_MAP_BUFFER_RANGE("VBO Map Range"); +static LLFastTimer::DeclareTimer FTM_VBO_MAP_BUFFER("VBO Map"); +  // Map for data access -U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range) +volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range)  {  	bindGLBuffer(true);  	LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER); @@ -1298,7 +1330,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  	if (useVBOs())  	{ -		if (sDisableVBOMapping || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange) +		if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)  		{  			if (count == -1)  			{ @@ -1323,7 +1355,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  			if (!mapped)  			{  				//not already mapped, map new region -				MappedRegion region(type, !sDisableVBOMapping && map_range ? -1 : index, count); +				MappedRegion region(type, mMappable && map_range ? -1 : index, count);  				mMappedVertexRegions.push_back(region);  			}  		} @@ -1340,19 +1372,20 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  			sMappedCount++;  			stop_glerror();	 -			if(sDisableVBOMapping) +			if(!mMappable)  			{  				map_range = false;  			}  			else  			{ -				U8* src = NULL; +				volatile U8* src = NULL;  				waitFence();  				if (gGLManager.mHasMapBufferRange)  				{  					if (map_range)  					{  #ifdef GL_ARB_map_buffer_range +						LLFastTimer t(FTM_VBO_MAP_BUFFER_RANGE);  						S32 offset = mOffsets[type] + sTypeSize[type]*index;  						S32 length = (sTypeSize[type]*count+0xF) & ~0xF;  						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, offset, length,  @@ -1376,6 +1409,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  							}  						} +						LLFastTimer t(FTM_VBO_MAP_BUFFER);  						src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER_ARB, 0, mSize,   							GL_MAP_WRITE_BIT |   							GL_MAP_FLUSH_EXPLICIT_BIT); @@ -1403,7 +1437,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  				llassert(src != NULL); -				mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src); +				mMappedData = LL_NEXT_ALIGNED_ADDRESS<volatile U8>(src);  				mAlignedOffset = mMappedData - src;  				stop_glerror(); @@ -1416,7 +1450,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  			//check the availability of memory  			LLMemory::logMemoryInfo(TRUE) ;  -				if(!sDisableVBOMapping) +				if(mMappable)  				{			  					//--------------------  					//print out more debug info before crash @@ -1448,7 +1482,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  		map_range = false;  	} -	if (map_range && gGLManager.mHasMapBufferRange && !sDisableVBOMapping) +	if (map_range && gGLManager.mHasMapBufferRange && mMappable)  	{  		return mMappedData;  	} @@ -1458,7 +1492,11 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran  	}  } -U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range) + +static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX_RANGE("IBO Map Range"); +static LLFastTimer::DeclareTimer FTM_VBO_MAP_INDEX("IBO Map"); + +volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  {  	LLMemType mt2(LLMemType::MTYPE_VERTEX_MAP_BUFFER);  	bindGLIndices(true); @@ -1473,7 +1511,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  	if (useVBOs())  	{ -		if (sDisableVBOMapping || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange) +		if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)  		{  			if (count == -1)  			{ @@ -1495,7 +1533,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  			if (!mapped)  			{  				//not already mapped, map new region -				MappedRegion region(TYPE_INDEX, !sDisableVBOMapping && map_range ? -1 : index, count); +				MappedRegion region(TYPE_INDEX, mMappable && map_range ? -1 : index, count);  				mMappedIndexRegions.push_back(region);  			}  		} @@ -1524,19 +1562,20 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  				}  			} -			if(sDisableVBOMapping) +			if(!mMappable)  			{  				map_range = false;  			}  			else  			{ -				U8* src = NULL; +				volatile U8* src = NULL;  				waitFence();  				if (gGLManager.mHasMapBufferRange)  				{  					if (map_range)  					{  #ifdef GL_ARB_map_buffer_range +						LLFastTimer t(FTM_VBO_MAP_INDEX_RANGE);  						S32 offset = sizeof(U16)*index;  						S32 length = sizeof(U16)*count;  						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length,  @@ -1548,6 +1587,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  					else  					{  #ifdef GL_ARB_map_buffer_range +						LLFastTimer t(FTM_VBO_MAP_INDEX);  						src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, sizeof(U16)*mNumIndices,   							GL_MAP_WRITE_BIT |   							GL_MAP_FLUSH_EXPLICIT_BIT); @@ -1569,6 +1609,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  				}  				else  				{ +					LLFastTimer t(FTM_VBO_MAP_INDEX);  					map_range = false;  					src = (U8*) glMapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);  				} @@ -1587,7 +1628,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  			log_glerror();  			LLMemory::logMemoryInfo(TRUE) ; -			if(!sDisableVBOMapping) +			if(mMappable)  			{  				GLint buff;  				glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff); @@ -1609,7 +1650,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  		map_range = false;  	} -	if (map_range && gGLManager.mHasMapBufferRange && !sDisableVBOMapping) +	if (map_range && gGLManager.mHasMapBufferRange && mMappable)  	{  		return mMappedIndexData;  	} @@ -1619,6 +1660,13 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)  	}  } +static LLFastTimer::DeclareTimer FTM_VBO_UNMAP("VBO Unmap"); +static LLFastTimer::DeclareTimer FTM_VBO_FLUSH_RANGE("Flush VBO Range"); + + +static LLFastTimer::DeclareTimer FTM_IBO_UNMAP("IBO Unmap"); +static LLFastTimer::DeclareTimer FTM_IBO_FLUSH_RANGE("Flush IBO Range"); +  void LLVertexBuffer::unmapBuffer()  {  	LLMemType mt2(LLMemType::MTYPE_VERTEX_UNMAP_BUFFER); @@ -1631,10 +1679,11 @@ void LLVertexBuffer::unmapBuffer()  	if (mMappedData && mVertexLocked)  	{ +		LLFastTimer t(FTM_VBO_UNMAP);  		bindGLBuffer(true);  		updated_all = mIndexLocked; //both vertex and index buffers done updating -		if(sDisableVBOMapping) +		if(!mMappable)  		{  			if (!mMappedVertexRegions.empty())  			{ @@ -1644,7 +1693,7 @@ void LLVertexBuffer::unmapBuffer()  					const MappedRegion& region = mMappedVertexRegions[i];  					S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;  					S32 length = sTypeSize[region.mType]*region.mCount; -					glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, offset, length, mMappedData+offset); +					glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, offset, length, (U8*) mMappedData+offset);  					stop_glerror();  				} @@ -1653,7 +1702,7 @@ void LLVertexBuffer::unmapBuffer()  			else  			{  				stop_glerror(); -				glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), mMappedData); +				glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), (U8*) mMappedData);  				stop_glerror();  			}  		} @@ -1671,6 +1720,7 @@ void LLVertexBuffer::unmapBuffer()  						S32 length = sTypeSize[region.mType]*region.mCount;  						if (gGLManager.mHasMapBufferRange)  						{ +							LLFastTimer t(FTM_VBO_FLUSH_RANGE);  #ifdef GL_ARB_map_buffer_range  							glFlushMappedBufferRange(GL_ARRAY_BUFFER_ARB, offset, length);  #endif @@ -1698,8 +1748,9 @@ void LLVertexBuffer::unmapBuffer()  	if (mMappedIndexData && mIndexLocked)  	{ +		LLFastTimer t(FTM_IBO_UNMAP);  		bindGLIndices(); -		if(sDisableVBOMapping) +		if(!mMappable)  		{  			if (!mMappedIndexRegions.empty())  			{ @@ -1708,7 +1759,7 @@ void LLVertexBuffer::unmapBuffer()  					const MappedRegion& region = mMappedIndexRegions[i];  					S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;  					S32 length = sizeof(U16)*region.mCount; -					glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, mMappedIndexData+offset); +					glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length, (U8*) mMappedIndexData+offset);  					stop_glerror();  				} @@ -1717,7 +1768,7 @@ void LLVertexBuffer::unmapBuffer()  			else  			{  				stop_glerror(); -				glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), mMappedIndexData); +				glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), (U8*) mMappedIndexData);  				stop_glerror();  			}  		} @@ -1734,6 +1785,7 @@ void LLVertexBuffer::unmapBuffer()  						S32 length = sizeof(U16)*region.mCount;  						if (gGLManager.mHasMapBufferRange)  						{ +							LLFastTimer t(FTM_IBO_FLUSH_RANGE);  #ifdef GL_ARB_map_buffer_range  							glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER_ARB, offset, length);  #endif @@ -1778,7 +1830,7 @@ template <class T,S32 type> struct VertexBufferStrider  	{  		if (type == LLVertexBuffer::TYPE_INDEX)  		{ -			U8* ptr = vbo.mapIndexBuffer(index, count, map_range); +			volatile U8* ptr = vbo.mapIndexBuffer(index, count, map_range);  			if (ptr == NULL)  			{ @@ -1794,7 +1846,7 @@ template <class T,S32 type> struct VertexBufferStrider  		{  			S32 stride = LLVertexBuffer::sTypeSize[type]; -			U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range); +			volatile U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range);  			if (ptr == NULL)  			{ @@ -2109,7 +2161,7 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)  {  	LLMemType mt2(LLMemType::MTYPE_VERTEX_SETUP_VERTEX_BUFFER);  	stop_glerror(); -	U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData; +	volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;  	/*if ((data_mask & mTypeMask) != data_mask)  	{ diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 3e6f6a959a..e1cbfd3b61 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -60,10 +60,10 @@ public:  	U32 mType;  	//size MUST be a power of 2 -	U8* allocate(U32& name, U32 size); +	volatile U8* allocate(U32& name, U32 size);  	//size MUST be the size provided to allocate that returned the given name -	void release(U32 name, U8* buffer, U32 size); +	void release(U32 name, volatile U8* buffer, U32 size);  	//destroy all records in mFreeList  	void cleanup(); @@ -72,7 +72,7 @@ public:  	{  	public:  		U32 mGLName; -		U8* mClientData; +		volatile U8* mClientData;  	};  	typedef std::list<Record> record_list_t; @@ -208,8 +208,8 @@ public:  	LLVertexBuffer(U32 typemask, S32 usage);  	// map for data access -	U8*		mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range); -	U8*		mapIndexBuffer(S32 index, S32 count, bool map_range); +	volatile U8*		mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range); +	volatile U8*		mapIndexBuffer(S32 index, S32 count, bool map_range);  	// set for rendering  	virtual void	setBuffer(U32 data_mask); 	// calls  setupVertexBuffer() if data_mask is not 0 @@ -244,16 +244,17 @@ public:  	S32 getNumVerts() const					{ return mNumVerts; }  	S32 getNumIndices() const				{ return mNumIndices; } -	U8* getIndicesPointer() const			{ return useVBOs() ? (U8*) mAlignedIndexOffset : mMappedIndexData; } -	U8* getVerticesPointer() const			{ return useVBOs() ? (U8*) mAlignedOffset : mMappedData; } +	volatile U8* getIndicesPointer() const			{ return useVBOs() ? (U8*) mAlignedIndexOffset : mMappedIndexData; } +	volatile U8* getVerticesPointer() const			{ return useVBOs() ? (U8*) mAlignedOffset : mMappedData; }  	U32 getTypeMask() const					{ return mTypeMask; }  	bool hasDataType(S32 type) const		{ return ((1 << type) & getTypeMask()); }  	S32 getSize() const;  	S32 getIndicesSize() const				{ return mIndicesSize; } -	U8* getMappedData() const				{ return mMappedData; } -	U8* getMappedIndices() const			{ return mMappedIndexData; } +	volatile U8* getMappedData() const				{ return mMappedData; } +	volatile U8* getMappedIndices() const			{ return mMappedIndexData; }  	S32 getOffset(S32 type) const			{ return mOffsets[type]; }  	S32 getUsage() const					{ return mUsage; } +	BOOL isWriteable() const				{ return (mMappable || mUsage == GL_STREAM_DRAW_ARB) ? TRUE : FALSE; }  	void draw(U32 mode, U32 count, U32 indices_offset) const;  	void drawArrays(U32 mode, U32 offset, U32 count) const; @@ -278,12 +279,13 @@ protected:  	U32		mGLIndices;		// GL IBO handle  	U32		mGLArray;		// GL VAO handle -	U8*		mMappedData;	// pointer to currently mapped data (NULL if unmapped) -	U8*		mMappedIndexData;	// pointer to currently mapped indices (NULL if unmapped) +	volatile U8* mMappedData;	// pointer to currently mapped data (NULL if unmapped) +	volatile U8* mMappedIndexData;	// pointer to currently mapped indices (NULL if unmapped)  	BOOL	mVertexLocked;			// if TRUE, vertex buffer is being or has been written to in client memory  	BOOL	mIndexLocked;			// if TRUE, index buffer is being or has been written to in client memory  	BOOL	mFinal;			// if TRUE, buffer can not be mapped again  	BOOL	mEmpty;			// if TRUE, client buffer is empty (or NULL). Old values have been discarded.	 +	mutable BOOL	mMappable;     // if TRUE, use memory mapping to upload data (otherwise doublebuffer and use glBufferSubData)  	S32		mOffsets[TYPE_MAX];  	std::vector<MappedRegion> mMappedVertexRegions; diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 7a5f9f9fd6..c025cd7939 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -976,7 +976,7 @@ void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)  			gGL.matrixMode(LLRender::MM_MODELVIEW);  			LLUI::pushMatrix();  			{ -				LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom, 0.f); +				LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom);  				child->draw();  			} diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 89d8842393..806d2ef3f6 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -613,7 +613,7 @@ void LLComboBox::showList()  	}  	mList->setOrigin(rect.mLeft, rect.mBottom);  	mList->reshape(rect.getWidth(), rect.getHeight()); -	mList->translateIntoRect(root_view_local, FALSE); +	mList->translateIntoRect(root_view_local);  	// Make sure we didn't go off bottom of screen  	S32 x, y; diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp index 42e6c3c786..5f69c6af31 100644 --- a/indra/llui/lldraghandle.cpp +++ b/indra/llui/lldraghandle.cpp @@ -244,7 +244,7 @@ void LLDragHandleTop::reshapeTitleBox()  	const LLFontGL* font = LLFontGL::getFontSansSerif();  	S32 title_width = getRect().getWidth();  	title_width -= LEFT_PAD + 2 * BORDER_PAD + getButtonsRect().getWidth(); -	S32 title_height = llround(font->getLineHeight()); +	S32 title_height = font->getLineHeight();  	LLRect title_rect;  	title_rect.setLeftTopAndSize(   		LEFT_PAD,  diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index cedc4c0aee..f49b4edb98 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -68,10 +68,10 @@ namespace LLInitParam  {  	void TypeValues<LLFloaterEnums::EOpenPositioning>::declareValues()  	{ -		declare("none",       LLFloaterEnums::OPEN_POSITIONING_NONE); -		declare("cascading",  LLFloaterEnums::OPEN_POSITIONING_CASCADING); -		declare("centered",   LLFloaterEnums::OPEN_POSITIONING_CENTERED); -		declare("specified",  LLFloaterEnums::OPEN_POSITIONING_SPECIFIED); +		declare("relative",   LLFloaterEnums::POSITIONING_RELATIVE); +		declare("cascading",  LLFloaterEnums::POSITIONING_CASCADING); +		declare("centered",   LLFloaterEnums::POSITIONING_CENTERED); +		declare("specified",  LLFloaterEnums::POSITIONING_SPECIFIED);  	}  } @@ -177,9 +177,7 @@ LLFloater::Params::Params()  	save_visibility("save_visibility", false),  	can_dock("can_dock", false),  	show_title("show_title", true), -	open_positioning("open_positioning", LLFloaterEnums::OPEN_POSITIONING_NONE), -	specified_left("specified_left"), -	specified_bottom("specified_bottom"), +	positioning("positioning", LLFloaterEnums::POSITIONING_RELATIVE),  	header_height("header_height", 0),  	legacy_header_height("legacy_header_height", 0),  	close_image("close_image"), @@ -249,9 +247,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	mCanClose(p.can_close),  	mDragOnLeft(p.can_drag_on_left),  	mResizable(p.can_resize), -	mOpenPositioning(p.open_positioning), -	mSpecifiedLeft(p.specified_left), -	mSpecifiedBottom(p.specified_bottom), +	mPositioning(p.positioning),  	mMinWidth(p.min_width),  	mMinHeight(p.min_height),  	mHeaderHeight(p.header_height), @@ -270,6 +266,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	mMinimizeSignal(NULL)  //	mNotificationContext(NULL)  { +	mPosition.setFloater(*this);  //	mNotificationContext = new LLFloaterNotificationContext(getHandle());  	// Clicks stop here. @@ -546,10 +543,18 @@ LLFloater::~LLFloater()  void LLFloater::storeRectControl()  { -	if( mRectControl.size() > 1 ) +	if (!mRectControl.empty())  	{  		getControlGroup()->setRect( mRectControl, getRect() );  	} +	if (!mPosXControl.empty() && mPositioning == LLFloaterEnums::POSITIONING_RELATIVE) +	{ +		getControlGroup()->setF32( mPosXControl, mPosition.mX ); +	} +	if (!mPosYControl.empty() && mPositioning == LLFloaterEnums::POSITIONING_RELATIVE) +	{ +		getControlGroup()->setF32( mPosYControl, mPosition.mY ); +	}  }  void LLFloater::storeVisibilityControl() @@ -568,23 +573,6 @@ void LLFloater::storeDockStateControl()  	}  } -LLRect LLFloater::getSavedRect() const -{ -	LLRect rect; - -	if (mRectControl.size() > 1) -	{ -		rect = getControlGroup()->getRect(mRectControl); -	} - -	return rect; -} - -bool LLFloater::hasSavedRect() const -{ -	return !getSavedRect().isEmpty(); -} -  // static  std::string LLFloater::getControlName(const std::string& name, const LLSD& key)  { @@ -862,7 +850,7 @@ void LLFloater::applyControlsAndPosition(LLFloater* other)  	{  		if (!applyRectControl())  		{ -			applyPositioning(other); +			applyPositioning(other, true);  		}  	}  } @@ -876,20 +864,41 @@ bool LLFloater::applyRectControl()  	{  		// other floaters in our group, position ourselves relative to them and don't save the rect  		mRectControl.clear(); -		mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP; +		mPositioning = LLFloaterEnums::POSITIONING_CASCADE_GROUP;  	} -	else if (mRectControl.size() > 1) +	else  	{ -		// If we have a saved rect, use it -		const LLRect& rect = getControlGroup()->getRect(mRectControl); -		saved_rect = rect.notEmpty(); -		if (saved_rect) +		if (!mRectControl.empty())  		{ -			setOrigin(rect.mLeft, rect.mBottom); +			// If we have a saved rect, use it +			const LLRect& rect = getControlGroup()->getRect(mRectControl); +			if (rect.notEmpty()) saved_rect = true; +			if (saved_rect) +			{ +				setOrigin(rect.mLeft, rect.mBottom); + +				if (mResizable) +				{ +					reshape(llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight())); +				} +			} +		} -			if (mResizable) +		if (!mPosXControl.empty() && !mPosYControl.empty()) +		{ +			LLControlVariablePtr x_control = getControlGroup()->getControl(mPosXControl); +			LLControlVariablePtr y_control = getControlGroup()->getControl(mPosYControl); +			if (x_control.notNull()  +				&& y_control.notNull() +				&& !x_control->isDefault() +				&& !y_control->isDefault())  			{ -				reshape(llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight())); +				mPosition.mX = x_control->getValue().asReal(); +				mPosition.mY = y_control->getValue().asReal(); +				mPositioning = LLFloaterEnums::POSITIONING_RELATIVE; +				applyRelativePosition(); + +				saved_rect = true;  			}  		}  	} @@ -910,50 +919,53 @@ bool LLFloater::applyDockState()  	return docked;  } -void LLFloater::applyPositioning(LLFloater* other) +void LLFloater::applyPositioning(LLFloater* other, bool on_open)  {  	// Otherwise position according to the positioning code -	switch (mOpenPositioning) +	switch (mPositioning)  	{ -	case LLFloaterEnums::OPEN_POSITIONING_CENTERED: +	case LLFloaterEnums::POSITIONING_CENTERED:  		center();  		break; -	case LLFloaterEnums::OPEN_POSITIONING_SPECIFIED: -		{ -			// Translate relative to snap rect -			setOrigin(mSpecifiedLeft, mSpecifiedBottom); -			const LLRect& snap_rect = gFloaterView->getSnapRect(); -			translate(snap_rect.mLeft, snap_rect.mBottom); -			translateIntoRect(snap_rect, FALSE); -		} +	case LLFloaterEnums::POSITIONING_SPECIFIED: +		//translateIntoRect(gFloaterView->getSnapRect());  		break; -	case LLFloaterEnums::OPEN_POSITIONING_CASCADE_GROUP: -	case LLFloaterEnums::OPEN_POSITIONING_CASCADING: -		if (other != NULL && other != this) -		{ -			stackWith(*other); -		} -		else +	case LLFloaterEnums::POSITIONING_CASCADE_GROUP: +	case LLFloaterEnums::POSITIONING_CASCADING: +		if (on_open)  		{ -			static const U32 CASCADING_FLOATER_HOFFSET = 0; -			static const U32 CASCADING_FLOATER_VOFFSET = 0; +			if (other != NULL && other != this) +			{ +				stackWith(*other); +			} +			else +			{ +				static const U32 CASCADING_FLOATER_HOFFSET = 0; +				static const U32 CASCADING_FLOATER_VOFFSET = 0; -			const LLRect& snap_rect = gFloaterView->getSnapRect(); +				const LLRect& snap_rect = gFloaterView->getSnapRect(); -			const S32 horizontal_offset = CASCADING_FLOATER_HOFFSET; -			const S32 vertical_offset = snap_rect.getHeight() - CASCADING_FLOATER_VOFFSET; +				const S32 horizontal_offset = CASCADING_FLOATER_HOFFSET; +				const S32 vertical_offset = snap_rect.getHeight() - CASCADING_FLOATER_VOFFSET; -			S32 rect_height = getRect().getHeight(); -			setOrigin(horizontal_offset, vertical_offset - rect_height); +				S32 rect_height = getRect().getHeight(); +				setOrigin(horizontal_offset, vertical_offset - rect_height); -			translate(snap_rect.mLeft, snap_rect.mBottom); -			translateIntoRect(snap_rect, FALSE); +				translate(snap_rect.mLeft, snap_rect.mBottom); +			} +			//mPositioning = LLFloaterEnums::POSITIONING_SPECIFIED; +			setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);  		}  		break; -	case LLFloaterEnums::OPEN_POSITIONING_NONE: +	case LLFloaterEnums::POSITIONING_RELATIVE: +		{ +			applyRelativePosition(); + +			break; +		}  	default:  		// Do nothing  		break; @@ -1071,7 +1083,9 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user)  	if (by_user && !isMinimized())  	{  		storeRectControl(); -		mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE; +		mPositioning = LLFloaterEnums::POSITIONING_RELATIVE; +		LLRect screen_rect = calcScreenRect(); +		mPosition = LLCoordGL(screen_rect.getCenterX(), screen_rect.getCenterY()).convert();  	}  	// if not minimized, adjust all snapped dependents to new shape @@ -1249,6 +1263,7 @@ void LLFloater::setMinimized(BOOL minimize)  		// Reshape *after* setting mMinimized  		reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE ); +		applyPositioning(NULL, false);  	}  	make_ui_sound("UISndWindowClose"); @@ -1589,7 +1604,7 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)  		if (mDocked)  		{  			setMinimized(FALSE); -			mOpenPositioning = LLFloaterEnums::OPEN_POSITIONING_NONE; +			mPositioning = LLFloaterEnums::POSITIONING_RELATIVE;  		}  		updateTitleButtons(); @@ -1623,7 +1638,7 @@ void LLFloater::onClickTearOff(LLFloater* self)  		self->openFloater(self->getKey());  		// only force position for floaters that don't have that data saved -		if (self->mRectControl.size() <= 1) +		if (self->mRectControl.empty())  		{  			new_rect.setLeftTopAndSize(host_floater->getRect().mLeft + 5, host_floater->getRect().mTop - floater_header_size - 5, self->getRect().getWidth(), self->getRect().getHeight());  			self->setRect(new_rect); @@ -1802,7 +1817,7 @@ void LLFloater::draw()  				const LLFontGL* font = LLFontGL::getFontSansSerif();  				LLRect r = getRect(); -				gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - (S32)font->getLineHeight() - 1,  +				gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - font->getLineHeight() - 1,   					titlebar_focus_color % alpha, 0, TRUE);  			}  		} @@ -2163,19 +2178,14 @@ LLFloaterView::LLFloaterView (const Params& p)  	mSnapOffsetBottom(0),  	mSnapOffsetRight(0)  { +	mSnapView = getHandle();  }  // By default, adjust vertical.  void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)  { -	S32 old_right = mLastSnapRect.mRight; -	S32 old_top = mLastSnapRect.mTop; -  	LLView::reshape(width, height, called_from_parent); -	S32 new_right = getSnapRect().mRight; -	S32 new_top = getSnapRect().mTop; -  	mLastSnapRect = getSnapRect();  	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) @@ -2188,35 +2198,39 @@ void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)  			continue;  		} -		if (!floaterp->isMinimized()) +		if (!floaterp->isMinimized() && floaterp->getCanDrag())  		{ -			LLRect r = floaterp->getRect(); +			LLRect old_rect = floaterp->getRect(); +			floaterp->applyPositioning(NULL, false); +			LLRect new_rect = floaterp->getRect(); -			// Compute absolute distance from each edge of screen -			S32 left_offset = llabs(r.mLeft - 0); -			S32 right_offset = llabs(old_right - r.mRight); +			//LLRect r = floaterp->getRect(); -			S32 top_offset = llabs(old_top - r.mTop); -			S32 bottom_offset = llabs(r.mBottom - 0); +			//// Compute absolute distance from each edge of screen +			//S32 left_offset = llabs(r.mLeft - 0); +			//S32 right_offset = llabs(old_right - r.mRight); -			S32 translate_x = 0; -			S32 translate_y = 0; +			//S32 top_offset = llabs(old_top - r.mTop); +			//S32 bottom_offset = llabs(r.mBottom - 0); -			if (left_offset > right_offset) -			{ -				translate_x = new_right - old_right; -			} +			S32 translate_x = new_rect.mLeft - old_rect.mLeft; +			S32 translate_y = new_rect.mBottom - old_rect.mBottom; -			if (top_offset < bottom_offset) -			{ -				translate_y = new_top - old_top; -			} +			//if (left_offset > right_offset) +			//{ +			//	translate_x = new_right - old_right; +			//} + +			//if (top_offset < bottom_offset) +			//{ +			//	translate_y = new_top - old_top; +			//}  			// don't reposition immovable floaters -			if (floaterp->getCanDrag()) -			{ -				floaterp->translate(translate_x, translate_y); -			} +			//if (floaterp->getCanDrag()) +			//{ +			//	floaterp->translate(translate_x, translate_y); +			//}  			BOOST_FOREACH(LLHandle<LLFloater> dependent_floater, floaterp->mDependents)  			{  				if (dependent_floater.get()) @@ -2643,6 +2657,8 @@ void LLFloaterView::refresh()  	}  } +const S32 FLOATER_MIN_VISIBLE_PIXELS = 16; +  void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside)  {  	if (floater->getParent() != this) @@ -2696,7 +2712,7 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out  	}  	// move window fully onscreen -	if (floater->translateIntoRect( getSnapRect(), allow_partial_outside )) +	if (floater->translateIntoRect( getSnapRect(), allow_partial_outside ? FLOATER_MIN_VISIBLE_PIXELS : S32_MAX ))  	{  		floater->clearSnapTarget();  	} @@ -2910,9 +2926,11 @@ void LLFloater::setInstanceName(const std::string& name)  		std::string ctrl_name = getControlName(mInstanceName, mKey);  		// save_rect and save_visibility only apply to registered floaters -		if (!mRectControl.empty()) +		if (mSaveRect)  		{  			mRectControl = LLFloaterReg::declareRectControl(ctrl_name); +			mPosXControl = LLFloaterReg::declarePosXControl(ctrl_name); +			mPosYControl = LLFloaterReg::declarePosYControl(ctrl_name);  		}  		if (!mVisibilityControl.empty())  		{ @@ -2969,7 +2987,10 @@ void LLFloater::initFromParams(const LLFloater::Params& p)  	LLPanel::initFromParams(p);  	// override any follows flags -	setFollows(FOLLOWS_NONE); +	if (mPositioning != LLFloaterEnums::POSITIONING_SPECIFIED) +	{ +		setFollows(FOLLOWS_NONE); +	}  	mTitle = p.title;  	mShortTitle = p.short_title; @@ -2988,14 +3009,9 @@ void LLFloater::initFromParams(const LLFloater::Params& p)  	mSingleInstance = p.single_instance;  	mReuseInstance = p.reuse_instance.isProvided() ? p.reuse_instance : p.single_instance; -	mOpenPositioning = p.open_positioning; -	mSpecifiedLeft = p.specified_left; -	mSpecifiedBottom = p.specified_bottom; +	mPositioning = p.positioning; -	if (p.save_rect && mRectControl.empty()) -	{ -		mRectControl = "t"; // flag to build mRectControl name once mInstanceName is set -	} +	mSaveRect = p.save_rect;  	if (p.save_visibility)  	{  		mVisibilityControl = "t"; // flag to build mVisibilityControl name once mInstanceName is set @@ -3110,7 +3126,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::str  		params.rect.left.set(0);  	}  	params.from_xui = true; -	applyXUILayout(params, parent); +	applyXUILayout(params, parent, parent == gFloaterView ? gFloaterView->getSnapRect() : parent->getLocalRect());   	initFromParams(params);  	initFloater(params); @@ -3269,5 +3285,137 @@ void LLFloater::stackWith(LLFloater& other)  	next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight());  	setShape(next_rect); + +	//other.mPositioning = LLFloaterEnums::POSITIONING_SPECIFIED; +	other.setFollows(FOLLOWS_LEFT | FOLLOWS_TOP);  } +void LLFloater::applyRelativePosition() +{ +	LLRect snap_rect = gFloaterView->getSnapRect(); +	LLRect floater_view_screen_rect = gFloaterView->calcScreenRect(); +	snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom); +	LLRect floater_screen_rect = calcScreenRect(); + +	LLCoordGL new_center = mPosition.convert(); +	LLCoordGL cur_center(floater_screen_rect.getCenterX(), floater_screen_rect.getCenterY()); +	translate(new_center.mX - cur_center.mX, new_center.mY - cur_center.mY); +} + + +LLCoordFloater::LLCoordFloater(F32 x, F32 y, LLFloater& floater) +:	coord_t(x, y) +{ +	mFloater = floater.getHandle(); +} + + +LLCoordFloater::LLCoordFloater(const LLCoordCommon& other, LLFloater& floater) +{ +	mFloater = floater.getHandle(); +	convertFromCommon(other); +} + +LLCoordFloater& LLCoordFloater::operator=(const LLCoordFloater& other) +{ +	mFloater = other.mFloater; +	coord_t::operator =(other); +	return *this; +} + +void LLCoordFloater::setFloater(LLFloater& floater) +{ +	mFloater = floater.getHandle(); +} + +bool LLCoordFloater::operator==(const LLCoordFloater& other) const  +{  +	return mX == other.mX && mY == other.mY && mFloater == other.mFloater;  +} + +LLCoordCommon LL_COORD_FLOATER::convertToCommon() const +{ +	const LLCoordFloater& self = static_cast<const LLCoordFloater&>(LLCoordFloater::getTypedCoords(*this)); + +	LLRect snap_rect = gFloaterView->getSnapRect(); +	LLRect floater_view_screen_rect = gFloaterView->calcScreenRect(); +	snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom); + +	LLFloater* floaterp = mFloater.get(); +	S32 floater_width = floaterp ? floaterp->getRect().getWidth() : 0; +	S32 floater_height = floaterp ? floaterp->getRect().getHeight() : 0; +	LLCoordCommon out; +	if (self.mX < -0.5f) +	{ +		out.mX = llround(rescale(self.mX, -1.f, -0.5f, snap_rect.mLeft - (floater_width - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mLeft)); +	} +	else if (self.mX > 0.5f) +	{ +		out.mX = llround(rescale(self.mX, 0.5f, 1.f, snap_rect.mRight - floater_width, snap_rect.mRight - FLOATER_MIN_VISIBLE_PIXELS)); +	} +	else +	{ +		out.mX = llround(rescale(self.mX, -0.5f, 0.5f, snap_rect.mLeft, snap_rect.mRight - floater_width)); +	} + +	if (self.mY < -0.5f) +	{ +		out.mY = llround(rescale(self.mY, -1.f, -0.5f, snap_rect.mBottom - (floater_height - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mBottom)); +	} +	else if (self.mY > 0.5f) +	{ +		out.mY = llround(rescale(self.mY, 0.5f, 1.f, snap_rect.mTop - floater_height, snap_rect.mTop - FLOATER_MIN_VISIBLE_PIXELS)); +	} +	else +	{ +		out.mY = llround(rescale(self.mY, -0.5f, 0.5f, snap_rect.mBottom, snap_rect.mTop - floater_height)); +	} + +	// return center point instead of lower left +	out.mX += floater_width / 2; +	out.mY += floater_height / 2; + +	return out; +} + +void LL_COORD_FLOATER::convertFromCommon(const LLCoordCommon& from) +{ +	LLCoordFloater& self = static_cast<LLCoordFloater&>(LLCoordFloater::getTypedCoords(*this)); +	LLRect snap_rect = gFloaterView->getSnapRect(); +	LLRect floater_view_screen_rect = gFloaterView->calcScreenRect(); +	snap_rect.translate(floater_view_screen_rect.mLeft, floater_view_screen_rect.mBottom); + + +	LLFloater* floaterp = mFloater.get(); +	S32 floater_width = floaterp ? floaterp->getRect().getWidth() : 0; +	S32 floater_height = floaterp ? floaterp->getRect().getHeight() : 0; + +	S32 from_x = from.mX - floater_width / 2; +	S32 from_y = from.mY - floater_height / 2; + +	if (from_x < snap_rect.mLeft) +	{ +		self.mX = rescale(from_x, snap_rect.mLeft - (floater_width - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mLeft, -1.f, -0.5f); +	} +	else if (from_x + floater_width > snap_rect.mRight) +	{ +		self.mX = rescale(from_x, snap_rect.mRight - floater_width, snap_rect.mRight - FLOATER_MIN_VISIBLE_PIXELS, 0.5f, 1.f); +	} +	else +	{ +		self.mX = rescale(from_x, snap_rect.mLeft, snap_rect.mRight - floater_width, -0.5f, 0.5f); +	} + +	if (from_y < snap_rect.mBottom) +	{ +		self.mY = rescale(from_y, snap_rect.mBottom - (floater_height - FLOATER_MIN_VISIBLE_PIXELS), snap_rect.mBottom, -1.f, -0.5f); +	} +	else if (from_y + floater_height > snap_rect.mTop) +	{ +		self.mY = rescale(from_y, snap_rect.mTop - floater_height, snap_rect.mTop - FLOATER_MIN_VISIBLE_PIXELS, 0.5f, 1.f); +	} +	else +	{ +		self.mY = rescale(from_y, snap_rect.mBottom, snap_rect.mTop - floater_height, -0.5f, 0.5f); +	} +} diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 59b35d206f..64d6dcea04 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -64,12 +64,12 @@ namespace LLFloaterEnums  {  	enum EOpenPositioning  	{ -		OPEN_POSITIONING_NONE, -		OPEN_POSITIONING_CASCADING, -		OPEN_POSITIONING_CASCADE_GROUP, -		OPEN_POSITIONING_CENTERED, -		OPEN_POSITIONING_SPECIFIED, -		OPEN_POSITIONING_COUNT +		POSITIONING_RELATIVE, +		POSITIONING_CASCADING, +		POSITIONING_CASCADE_GROUP, +		POSITIONING_CENTERED, +		POSITIONING_SPECIFIED, +		POSITIONING_COUNT  	};  } @@ -82,6 +82,37 @@ namespace LLInitParam  	};  } +struct LL_COORD_FLOATER +{ +	typedef F32 value_t; + +	LLCoordCommon convertToCommon() const; +	void convertFromCommon(const LLCoordCommon& from); +protected: +	LLHandle<LLFloater> mFloater; +}; + +struct LLCoordFloater : LLCoord<LL_COORD_FLOATER> +{ +	typedef LLCoord<LL_COORD_FLOATER> coord_t; + +	LLCoordFloater() {} +	LLCoordFloater(F32 x, F32 y, LLFloater& floater); +	LLCoordFloater(const LLCoordCommon& other, LLFloater& floater); + +	LLCoordFloater& operator=(const LLCoordCommon& other) +	{ +		convertFromCommon(other); +		return *this; +	} + +	LLCoordFloater& operator=(const LLCoordFloater& other); + +	bool operator==(const LLCoordFloater& other) const; +	bool operator!=(const LLCoordFloater& other) const { return !(*this == other); } + +	void setFloater(LLFloater& floater); +};  class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>  { @@ -132,10 +163,7 @@ public:  								can_dock,  								show_title; -		Optional<LLFloaterEnums::EOpenPositioning>	open_positioning; -		Optional<S32>								specified_left; -		Optional<S32>								specified_bottom; - +		Optional<LLFloaterEnums::EOpenPositioning>	positioning;  		Optional<S32>			header_height,  								legacy_header_height; // HACK see initFromXML() @@ -184,7 +212,7 @@ public:  	bool initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node = NULL);  	/*virtual*/ void handleReshape(const LLRect& new_rect, bool by_user = false); -	/*virtual*/ BOOL canSnapTo(const LLView* other_view); +	/*virtual*/ BOOL canSnapTo(const LLView* other_view);   	/*virtual*/ void setSnappedTo(const LLView* snap_view);  	/*virtual*/ void setFocus( BOOL b );  	/*virtual*/ void setIsChrome(BOOL is_chrome); @@ -241,8 +269,6 @@ public:  	BOOL			isResizable() const				{ return mResizable; }  	void			setResizeLimits( S32 min_width, S32 min_height );  	void			getResizeLimits( S32* min_width, S32* min_height ) { *min_width = mMinWidth; *min_height = mMinHeight; } -	LLRect			getSavedRect() const; -	bool			hasSavedRect() const;  	static std::string		getControlName(const std::string& name, const LLSD& key);  	static LLControlGroup*	getControlGroup(); @@ -324,7 +350,7 @@ public:  	void			enableResizeCtrls(bool enable, bool width = true, bool height = true); -	bool			isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mOpenPositioning); } +	bool			isPositioning(LLFloaterEnums::EOpenPositioning p) const { return (p == mPositioning); }  protected:  	void			applyControlsAndPosition(LLFloater* other); @@ -332,7 +358,9 @@ protected:  	virtual bool	applyRectControl();  	bool			applyDockState(); -	void			applyPositioning(LLFloater* other); +	void			applyPositioning(LLFloater* other, bool on_open); +	void			applyRelativePosition(); +  	void			storeRectControl();  	void			storeVisibilityControl();  	void			storeDockStateControl(); @@ -396,7 +424,10 @@ public:  	commit_signal_t* mMinimizeSignal;  protected: +	bool			mSaveRect;  	std::string		mRectControl; +	std::string		mPosXControl; +	std::string		mPosYControl;  	std::string		mVisibilityControl;  	std::string		mDocStateControl;  	LLSD			mKey;				// Key used for retrieving instances; set (for now) by LLFLoaterReg @@ -422,9 +453,8 @@ private:  	BOOL			mDragOnLeft;  	BOOL			mResizable; -	LLFloaterEnums::EOpenPositioning	mOpenPositioning; -	S32									mSpecifiedLeft; -	S32									mSpecifiedBottom; +	LLFloaterEnums::EOpenPositioning	mPositioning; +	LLCoordFloater	mPosition;  	S32				mMinWidth;  	S32				mMinHeight; diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index e144b68f5e..ef55e74166 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -96,7 +96,7 @@ LLFloater* LLFloaterReg::getLastFloaterCascading()  		{  			LLFloater* inst = *iter; -			if (inst->getVisible() && inst->isPositioning(LLFloaterEnums::OPEN_POSITIONING_CASCADING)) +			if (inst->getVisible() && inst->isPositioning(LLFloaterEnums::POSITIONING_CASCADING))  			{  				if (candidate_rect.mTop > inst->getRect().mTop)  				{ @@ -358,9 +358,7 @@ void LLFloaterReg::restoreVisibleInstances()  //static  std::string LLFloaterReg::getRectControlName(const std::string& name)  { -	std::string res = std::string("floater_rect_") + name; -	LLStringUtil::replaceChar( res, ' ', '_' ); -	return res; +	return std::string("floater_rect_") + getBaseControlName(name);  }  //static @@ -368,19 +366,48 @@ std::string LLFloaterReg::declareRectControl(const std::string& name)  {  	std::string controlname = getRectControlName(name);  	LLFloater::getControlGroup()->declareRect(controlname, LLRect(), -												 llformat("Window Position and Size for %s", name.c_str()), +												 llformat("Window Size for %s", name.c_str()),  												 TRUE);  	return controlname;  } +std::string LLFloaterReg::declarePosXControl(const std::string& name) +{ +	std::string controlname = std::string("floater_pos_x_") + getBaseControlName(name); +	LLFloater::getControlGroup()->declareF32(controlname,  +											10.f, +											llformat("Window X Position for %s", name.c_str()), +											TRUE); +	return controlname; +} + +std::string LLFloaterReg::declarePosYControl(const std::string& name) +{ +	std::string controlname = std::string("floater_pos_y_") + getBaseControlName(name); +	LLFloater::getControlGroup()->declareF32(controlname, +											10.f, +											llformat("Window Y Position for %s", name.c_str()), +											TRUE); + +	return controlname; +} + +  //static  std::string LLFloaterReg::getVisibilityControlName(const std::string& name)  { -	std::string res = std::string("floater_vis_") + name; +	return std::string("floater_vis_") + getBaseControlName(name); +} + +//static  +std::string LLFloaterReg::getBaseControlName(const std::string& name) +{ +	std::string res(name);  	LLStringUtil::replaceChar( res, ' ', '_' );  	return res;  } +  //static  std::string LLFloaterReg::declareVisibilityControl(const std::string& name)  { diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h index 534cf8b40a..a1e1f8a988 100644 --- a/indra/llui/llfloaterreg.h +++ b/indra/llui/llfloaterreg.h @@ -115,9 +115,11 @@ public:  	// Control Variables  	static std::string getRectControlName(const std::string& name);  	static std::string declareRectControl(const std::string& name); +	static std::string declarePosXControl(const std::string& name); +	static std::string declarePosYControl(const std::string& name);  	static std::string getVisibilityControlName(const std::string& name);  	static std::string declareVisibilityControl(const std::string& name); - +	static std::string getBaseControlName(const std::string& name);  	static std::string declareDockStateControl(const std::string& name);  	static std::string getDockStateControlName(const std::string& name); diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 2f1c2a47c9..ae262f794e 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -36,7 +36,7 @@  #include "llcriticaldamp.h"  #include "boost/foreach.hpp" -static const F32 MIN_FRACTIONAL_SIZE = 0.0001f; +static const F32 MIN_FRACTIONAL_SIZE = 0.0f;  static const F32 MAX_FRACTIONAL_SIZE = 1.f;  static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack"); @@ -129,6 +129,12 @@ void LLLayoutPanel::setOrientation( LLLayoutStack::ELayoutOrientation orientatio  		? getRect().getWidth()  		: getRect().getHeight())); +	if (mAutoResize == FALSE  +		&& mUserResize == TRUE  +		&& mMinDim == -1 ) +	{ +		setMinDim(layout_dim); +	}  	mTargetDim = llmax(layout_dim, getMinDim());  } @@ -306,7 +312,6 @@ void LLLayoutStack::updateLayout()  	bool animation_in_progress = animatePanels();  	F32 total_visible_fraction = 0.f; -	F32 total_open_fraction = 0.f;  	S32 space_to_distribute = (mOrientation == HORIZONTAL)  							? getRect().getWidth()  							: getRect().getHeight(); @@ -318,20 +323,17 @@ void LLLayoutStack::updateLayout()  		if (panelp->mAutoResize)  		{  			panelp->mTargetDim = panelp->getRelevantMinDim(); -			if (!panelp->mCollapsed && panelp->getVisible()) -			{ -				total_open_fraction += panelp->mFractionalSize; -			}  		}  		space_to_distribute -= panelp->getVisibleDim() + llround((F32)mPanelSpacing * panelp->getVisibleAmount()); -		total_visible_fraction += panelp->mFractionalSize; +		total_visible_fraction += panelp->mFractionalSize * panelp->getAutoResizeFactor();  	} -	llassert(total_visible_fraction < 1.01f); +	llassert(total_visible_fraction < 1.05f);  	// don't need spacing after last panel  	space_to_distribute += panelp ? llround((F32)mPanelSpacing * panelp->getVisibleAmount()) : 0; +	S32 remaining_space = space_to_distribute;  	F32 fraction_distributed = 0.f;  	if (space_to_distribute > 0 && total_visible_fraction > 0.f)  	{	// give space proportionally to visible auto resize panels @@ -343,26 +345,23 @@ void LLLayoutStack::updateLayout()  				S32 delta = llround((F32)space_to_distribute * fraction_to_distribute);  				fraction_distributed += fraction_to_distribute;  				panelp->mTargetDim += delta; +				remaining_space -= delta;  			}  		}  	} -	if (fraction_distributed < total_visible_fraction) -	{	// distribute any left over pixels to non-collapsed, visible panels -		F32 fraction_left = total_visible_fraction - fraction_distributed; -		S32 space_left = llround((F32)space_to_distribute * (fraction_left / total_visible_fraction)); +	// distribute any left over pixels to non-collapsed, visible panels +	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) +	{ +		if (remaining_space == 0) break; -		BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) +		if (panelp->mAutoResize  +			&& !panelp->mCollapsed  +			&& panelp->getVisible())  		{ -			if (panelp->mAutoResize  -				&& !panelp->mCollapsed  -				&& panelp->getVisible()) -			{ -				S32 space_for_panel = llmax(0, llround((F32)space_left * (panelp->mFractionalSize / total_open_fraction))); -				panelp->mTargetDim += space_for_panel; -				space_left -= space_for_panel; -				total_open_fraction -= panelp->mFractionalSize; -			} +			S32 space_for_panel = remaining_space > 0 ? 1 : -1; +			panelp->mTargetDim += space_for_panel; +			remaining_space -= space_for_panel;  		}  	} @@ -494,33 +493,46 @@ void LLLayoutStack::updateClass()  void LLLayoutStack::updateFractionalSizes()  { -	F32 total_resizable_dim = 0; -	S32 num_auto_resize_panels = 0; +	F32 total_resizable_dim = 0.f;  	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)  	{  		if (panelp->mAutoResize)  		{  			total_resizable_dim += llmax(0, panelp->getLayoutDim() - panelp->getRelevantMinDim()); -			num_auto_resize_panels++;  		}  	} -	F32 total_fractional_size = 0.f; -	  	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels)  	{  		if (panelp->mAutoResize)  		{  			F32 panel_resizable_dim = llmax(MIN_FRACTIONAL_SIZE, (F32)(panelp->getLayoutDim() - panelp->getRelevantMinDim()));  			panelp->mFractionalSize = panel_resizable_dim > 0.f  -										? llclamp(panel_resizable_dim / total_resizable_dim, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE) -										: MIN_FRACTIONAL_SIZE; -			total_fractional_size += panelp->mFractionalSize; +				? llclamp(panel_resizable_dim / total_resizable_dim, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE) +				: MIN_FRACTIONAL_SIZE;  			llassert(!llisnan(panelp->mFractionalSize));  		}  	} +	normalizeFractionalSizes(); +} + + +void LLLayoutStack::normalizeFractionalSizes() +{ +	S32 num_auto_resize_panels = 0; +	F32 total_fractional_size = 0.f; +	 +	BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) +	{ +		if (panelp->mAutoResize) +		{ +			total_fractional_size += panelp->mFractionalSize; +			num_auto_resize_panels++; +		} +	} +  	if (total_fractional_size == 0.f)  	{ // equal distribution  		BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) @@ -632,7 +644,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  	F32 total_visible_fraction = 0.f;  	F32 delta_auto_resize_headroom = 0.f; -	F32 total_auto_resize_headroom = 0.f; +	F32 original_auto_resize_headroom = 0.f;  	LLLayoutPanel* other_resize_panel = NULL;  	LLLayoutPanel* following_panel = NULL; @@ -641,8 +653,11 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  	{  		if (panelp->mAutoResize)  		{ -			total_auto_resize_headroom += (F32)(panelp->mTargetDim - panelp->getRelevantMinDim()); -			total_visible_fraction += panelp->mFractionalSize * panelp->getAutoResizeFactor(); +			original_auto_resize_headroom += (F32)(panelp->mTargetDim - panelp->getRelevantMinDim()); +			if (panelp->getVisible() && !panelp->mCollapsed) +			{ +				total_visible_fraction += panelp->mFractionalSize; +			}  		}  		if (panelp == resized_panel) @@ -656,18 +671,25 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  		}  	} -	if (resized_panel->mAutoResize == FALSE) + +	if (resized_panel->mAutoResize)  	{ -		delta_auto_resize_headroom += -delta_dim; +		if (!other_resize_panel || !other_resize_panel->mAutoResize) +		{ +			delta_auto_resize_headroom += delta_dim;	 +		}  	} -	if (other_resize_panel && other_resize_panel->mAutoResize == FALSE) +	else   	{ -		delta_auto_resize_headroom += delta_dim; +		if (!other_resize_panel || other_resize_panel->mAutoResize) +		{ +			delta_auto_resize_headroom -= delta_dim; +		}  	}  	F32 fraction_given_up = 0.f;  	F32 fraction_remaining = 1.f; -	F32 updated_auto_resize_headroom = total_auto_resize_headroom + delta_auto_resize_headroom; +	F32 updated_auto_resize_headroom = original_auto_resize_headroom + delta_auto_resize_headroom;  	enum  	{ @@ -691,14 +713,15 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  		case BEFORE_RESIZED_PANEL:  			if (panelp->mAutoResize)  			{	// freeze current size as fraction of overall auto_resize space -				F32 fractional_adjustment_factor = total_auto_resize_headroom / updated_auto_resize_headroom; +				F32 fractional_adjustment_factor = updated_auto_resize_headroom == 0.f +													? 1.f +													: original_auto_resize_headroom / updated_auto_resize_headroom;  				F32 new_fractional_size = llclamp(panelp->mFractionalSize * fractional_adjustment_factor,  													MIN_FRACTIONAL_SIZE,  													MAX_FRACTIONAL_SIZE); -				F32 fraction_delta = (new_fractional_size - panelp->mFractionalSize); -				fraction_given_up -= fraction_delta; +				fraction_given_up -= new_fractional_size - panelp->mFractionalSize;  				fraction_remaining -= panelp->mFractionalSize; -				panelp->mFractionalSize += fraction_delta; +				panelp->mFractionalSize = new_fractional_size;  				llassert(!llisnan(panelp->mFractionalSize));  			}  			else @@ -711,7 +734,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			{	// freeze new size as fraction  				F32 new_fractional_size = (updated_auto_resize_headroom == 0.f)  					? MAX_FRACTIONAL_SIZE -					: llclamp((F32)(new_dim - panelp->getRelevantMinDim()) / updated_auto_resize_headroom, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE); +					: llclamp(total_visible_fraction * (F32)(new_dim - panelp->getRelevantMinDim()) / updated_auto_resize_headroom, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);  				fraction_given_up -= new_fractional_size - panelp->mFractionalSize;  				fraction_remaining -= panelp->mFractionalSize;  				panelp->mFractionalSize = new_fractional_size; @@ -720,7 +743,6 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			else  			{	// freeze new size as original size  				panelp->mTargetDim = new_dim; -				fraction_remaining -= fraction_given_up;  			}  			which_panel = NEXT_PANEL;  			break; @@ -728,14 +750,14 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			if (panelp->mAutoResize)  			{  				fraction_remaining -= panelp->mFractionalSize; -				if (fraction_given_up != 0.f) +				if (resized_panel->mAutoResize)  				{  					panelp->mFractionalSize = llclamp(panelp->mFractionalSize + fraction_given_up, MIN_FRACTIONAL_SIZE, MAX_FRACTIONAL_SIZE);  					fraction_given_up = 0.f;  				}  				else  				{ -					F32 new_fractional_size = llclamp((F32)(panelp->mTargetDim - panelp->getRelevantMinDim() + delta_auto_resize_headroom)  +					F32 new_fractional_size = llclamp(total_visible_fraction * (F32)(panelp->mTargetDim - panelp->getRelevantMinDim() + delta_auto_resize_headroom)   														/ updated_auto_resize_headroom,  													MIN_FRACTIONAL_SIZE,  													MAX_FRACTIONAL_SIZE); @@ -750,7 +772,7 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			which_panel = AFTER_RESIZED_PANEL;  			break;  		case AFTER_RESIZED_PANEL: -			if (panelp->mAutoResize) +			if (panelp->mAutoResize && fraction_given_up != 0.f)  			{  				panelp->mFractionalSize = llclamp(panelp->mFractionalSize + (panelp->mFractionalSize / fraction_remaining) * fraction_given_up,  												MIN_FRACTIONAL_SIZE, @@ -760,6 +782,8 @@ void LLLayoutStack::updatePanelRect( LLLayoutPanel* resized_panel, const LLRect&  			break;  		}  	} +	updateLayout(); +	normalizeFractionalSizes();  }  void LLLayoutStack::reshape(S32 width, S32 height, BOOL called_from_parent) diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index efe93f6def..d32caec5f9 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -72,7 +72,7 @@ public:  	/*virtual*/ void draw();  	/*virtual*/ void removeChild(LLView*);  	/*virtual*/ BOOL postBuild(); -	/*virtual*/ bool addChild(LLView* child, S32 tab_group = 0); +	/*virtual*/ bool addChild(LLView* child, S32 tab_groupdatefractuiona = 0);  	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -112,6 +112,7 @@ private:  	LLLayoutPanel* findEmbeddedPanel(LLPanel* panelp) const;  	LLLayoutPanel* findEmbeddedPanelByName(const std::string& name) const;  	void updateFractionalSizes(); +	void normalizeFractionalSizes();  	void updatePanelRect( LLLayoutPanel* param1, const LLRect& new_rect );  	S32 mPanelSpacing; @@ -154,10 +155,10 @@ public:  	void setVisible(BOOL visible);  	S32 getLayoutDim() const; -	S32 getMinDim() const { return (mMinDim >= 0 || mAutoResize) ? llmax(0, mMinDim) : getLayoutDim(); } +	S32 getMinDim() const { return llmax(0, mMinDim); }  	void setMinDim(S32 value) { mMinDim = value; } -	S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : mMinDim; } +	S32 getExpandedMinDim() const { return mExpandedMinDim >= 0 ? mExpandedMinDim : getMinDim(); }  	void setExpandedMinDim(S32 value) { mExpandedMinDim = value; }  	S32 getRelevantMinDim() const diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index e961cfb14f..ff85afdf25 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -1623,7 +1623,7 @@ void LLLineEditor::draw()  	LLRect background( 0, getRect().getHeight(), getRect().getWidth(), 0 );  	background.stretch( -mBorderThickness ); -	S32 lineeditor_v_pad = llround((background.getHeight() - mGLFont->getLineHeight())/2); +	S32 lineeditor_v_pad = (background.getHeight() - mGLFont->getLineHeight()) / 2;  	drawBackground(); diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index c624ae2e92..ff6928ffda 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -317,7 +317,7 @@ void LLMenuItemGL::setJumpKey(KEY key)  // virtual   U32 LLMenuItemGL::getNominalHeight( void ) const   {  -	return llround(mFont->getLineHeight()) + MENU_ITEM_PADDING;  +	return mFont->getLineHeight() + MENU_ITEM_PADDING;  }  //virtual @@ -1966,7 +1966,7 @@ void LLMenuGL::arrange( void )  		// *FIX: create the item first and then ask for its dimensions?  		S32 spillover_item_width = PLAIN_PAD_PIXELS + LLFontGL::getFontSansSerif()->getWidth( std::string("More") ); // *TODO: Translate -		S32 spillover_item_height = llround(LLFontGL::getFontSansSerif()->getLineHeight()) + MENU_ITEM_PADDING; +		S32 spillover_item_height = LLFontGL::getFontSansSerif()->getLineHeight() + MENU_ITEM_PADDING;  		// Scrolling support  		item_list_t::iterator first_visible_item_iter; @@ -3082,7 +3082,7 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)  		mouse_y + MOUSE_CURSOR_PADDING,   		CURSOR_WIDTH + MOUSE_CURSOR_PADDING * 2,   		CURSOR_HEIGHT + MOUSE_CURSOR_PADDING * 2); -	menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect, FALSE ); +	menu->translateIntoRectWithExclusion( menu_region_rect, mouse_rect );  	menu->getParent()->sendChildToFront(menu);  } @@ -3425,7 +3425,7 @@ void LLMenuHolderGL::draw()  		LLUI::pushMatrix();  		{ -			LLUI::translate((F32)item_rect.mLeft, (F32)item_rect.mBottom, 0.f); +			LLUI::translate((F32)item_rect.mLeft, (F32)item_rect.mBottom);  			selecteditem->getMenu()->drawBackground(selecteditem, interpolant);  			selecteditem->draw();  		} diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp index b087602a56..8000efad0e 100644 --- a/indra/llui/llscrolllistcell.cpp +++ b/indra/llui/llscrolllistcell.cpp @@ -232,7 +232,7 @@ BOOL LLScrollListText::getVisible() const  //virtual   S32 LLScrollListText::getHeight() const  { -	return llround(mFont->getLineHeight()); +	return mFont->getLineHeight();  } @@ -306,7 +306,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col  			break;  		}  		LLRect highlight_rect(left - 2,  -				llround(mFont->getLineHeight()) + 1,  +				mFont->getLineHeight() + 1,   				left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,   				1);  		mRoundedRectImage->draw(highlight_rect, highlight_color); diff --git a/indra/llui/llscrolllistitem.cpp b/indra/llui/llscrolllistitem.cpp index d95752e31c..5a1e96ab03 100644 --- a/indra/llui/llscrolllistitem.cpp +++ b/indra/llui/llscrolllistitem.cpp @@ -138,7 +138,7 @@ void LLScrollListItem::draw(const LLRect& rect, const LLColor4& fg_color, const  		LLUI::pushMatrix();  		{ -			LLUI::translate((F32) cur_x, (F32) rect.mBottom, 0.0f); +			LLUI::translate((F32) cur_x, (F32) rect.mBottom);  			cell->draw( fg_color, highlight_color );  		} diff --git a/indra/llui/llscrolllistitem.h b/indra/llui/llscrolllistitem.h index 611df729b4..13655b5873 100644 --- a/indra/llui/llscrolllistitem.h +++ b/indra/llui/llscrolllistitem.h @@ -33,10 +33,10 @@  #include "v4color.h"  #include "llinitparam.h"  #include "llscrolllistcell.h" +#include "llcoord.h"  #include <vector> -class LLCoordGL;  class LLCheckBoxCtrl;  class LLResizeBar;  class LLScrollListCtrl; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index e3c9c3c561..7aeeae298f 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1192,7 +1192,10 @@ void LLTextBase::reflow()  		// shrink document to minimum size (visible portion of text widget)  		// to force inlined widgets with follows set to shrink -		mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); +		if (mWordWrap) +		{ +			mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight()); +		}  		S32 cur_top = 0; @@ -2157,7 +2160,7 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const  	{   		// return default height rect in upper left  		local_rect = content_window_rect; -		local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight()); +		local_rect.mBottom = local_rect.mTop - mDefaultFont->getLineHeight();  		return local_rect;  	} @@ -2380,6 +2383,9 @@ S32 LLTextBase::getEditableIndex(S32 index, bool increasing_direction)  void LLTextBase::updateRects()  { +	LLRect old_text_rect = mVisibleTextRect; +	mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect(); +  	if (mLineInfoList.empty())   	{  		mTextBoundingRect = LLRect(0, mVPad, mHPad, 0); @@ -2395,10 +2401,24 @@ void LLTextBase::updateRects()  		}  		mTextBoundingRect.mTop += mVPad; -		//// subtract a pixel off the bottom to deal with rounding errors in measuring font height -		//mTextBoundingRect.mBottom -= 1; -		S32 delta_pos = -mTextBoundingRect.mBottom; +		S32 delta_pos = 0; +		 +		switch(mVAlign) +		{ +		case LLFontGL::TOP: +			delta_pos = llmax(mVisibleTextRect.getHeight() - mTextBoundingRect.mTop, -mTextBoundingRect.mBottom); +			break; +		case LLFontGL::VCENTER: +			delta_pos = (llmax(mVisibleTextRect.getHeight() - mTextBoundingRect.mTop, -mTextBoundingRect.mBottom) + (mVisibleTextRect.mBottom - mTextBoundingRect.mBottom)) / 2; +			break; +		case LLFontGL::BOTTOM: +			delta_pos = mVisibleTextRect.mBottom - mTextBoundingRect.mBottom; +			break; +		case LLFontGL::BASELINE: +			// do nothing +			break; +		}  		// move line segments to fit new document rect  		for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)  		{ @@ -2408,8 +2428,9 @@ void LLTextBase::updateRects()  	}  	// update document container dimensions according to text contents -	LLRect doc_rect = mTextBoundingRect; +	LLRect doc_rect;  	// use old mVisibleTextRect constraint document to width of viewable region +	doc_rect.mBottom = llmin(mVisibleTextRect.mBottom,  mTextBoundingRect.mBottom);  	doc_rect.mLeft = 0;  	// allow horizontal scrolling? @@ -2419,11 +2440,22 @@ void LLTextBase::updateRects()  	doc_rect.mRight = mScroller   		? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)  		: mVisibleTextRect.getWidth(); +	doc_rect.mTop = llmax(mVisibleTextRect.mTop, mTextBoundingRect.mTop);  	if (!mScroller)  	{  		// push doc rect to top of text widget -		doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop); +		switch(mVAlign) +		{ +		case LLFontGL::TOP: +			doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop); +			break; +		case LLFontGL::VCENTER: +			doc_rect.translate(0, (mVisibleTextRect.getHeight() - doc_rect.mTop) / 2); +		case LLFontGL::BOTTOM: +		default: +			break; +		}  	}  	mDocumentView->setShape(doc_rect); @@ -2431,7 +2463,6 @@ void LLTextBase::updateRects()  	//update mVisibleTextRect *after* mDocumentView has been resized  	// so that scrollbars are added if document needs to scroll  	// since mVisibleTextRect does not include scrollbars -	LLRect old_text_rect = mVisibleTextRect;  	mVisibleTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();  	//FIXME: replace border with image?  	if (mBorderVisible) @@ -2444,9 +2475,27 @@ void LLTextBase::updateRects()  	}  	// update document container again, using new mVisibleTextRect (that has scrollbars enabled as needed) +	doc_rect.mBottom = llmin(mVisibleTextRect.mBottom,  mTextBoundingRect.mBottom); +	doc_rect.mLeft = 0;  	doc_rect.mRight = mScroller   		? llmax(mVisibleTextRect.getWidth(), mTextBoundingRect.mRight)  		: mVisibleTextRect.getWidth(); +	doc_rect.mTop = llmax(mVisibleTextRect.mTop, mTextBoundingRect.mTop); +	if (!mScroller) +	{ +		// push doc rect to top of text widget +		switch(mVAlign) +		{ +		case LLFontGL::TOP: +			doc_rect.translate(0, mVisibleTextRect.getHeight() - doc_rect.mTop); +			break; +		case LLFontGL::VCENTER: +			doc_rect.translate(0, (mVisibleTextRect.getHeight() - doc_rect.mTop) / 2); +		case LLFontGL::BOTTOM: +		default: +			break; +		} +	}  	mDocumentView->setShape(doc_rect);  } @@ -2560,8 +2609,7 @@ BOOL LLTextSegment::handleScrollWheel(S32 x, S32 y, S32 clicks) { return FALSE;  BOOL LLTextSegment::handleToolTip(S32 x, S32 y, MASK mask) { return FALSE; }  const std::string&	LLTextSegment::getName() const   { -	static std::string empty_string(""); -	return empty_string;  +	return LLStringUtil::null;  }  void LLTextSegment::onMouseCaptureLost() {}  void LLTextSegment::screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const {} @@ -2578,7 +2626,7 @@ LLNormalTextSegment::LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 e  	mToken(NULL),  	mEditor(editor)  { -	mFontHeight = llceil(mStyle->getFont()->getLineHeight()); +	mFontHeight = mStyle->getFont()->getLineHeight();  	LLUIImagePtr image = mStyle->getImage();  	if (image.notNull()) @@ -2594,7 +2642,7 @@ LLNormalTextSegment::LLNormalTextSegment( const LLColor4& color, S32 start, S32  {  	mStyle = new LLStyle(LLStyle::Params().visible(is_visible).color(color)); -	mFontHeight = llceil(mStyle->getFont()->getLineHeight()); +	mFontHeight = mStyle->getFont()->getLineHeight();  }  LLNormalTextSegment::~LLNormalTextSegment() @@ -2962,11 +3010,11 @@ LLLineBreakTextSegment::LLLineBreakTextSegment(S32 pos):LLTextSegment(pos,pos+1)  {  	LLStyleSP s( new LLStyle(LLStyle::Params().visible(true))); -	mFontHeight = llceil(s->getFont()->getLineHeight()); +	mFontHeight = s->getFont()->getLineHeight();  }  LLLineBreakTextSegment::LLLineBreakTextSegment(LLStyleConstSP style,S32 pos):LLTextSegment(pos,pos+1)  { -	mFontHeight = llceil(style->getFont()->getLineHeight()); +	mFontHeight = style->getFont()->getLineHeight();  }  LLLineBreakTextSegment::~LLLineBreakTextSegment()  { @@ -3003,7 +3051,7 @@ static const S32 IMAGE_HPAD = 3;  bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const  {  	width = 0; -	height = llceil(mStyle->getFont()->getLineHeight());; +	height = mStyle->getFont()->getLineHeight();  	LLUIImagePtr image = mStyle->getImage();  	if( num_chars>0 && image.notNull()) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index ffe012c110..141602ad2e 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1984,7 +1984,7 @@ void LLTextEditor::drawPreeditMarker()  		return;  	} -	const S32 line_height = llround( mDefaultFont->getLineHeight() ); +	const S32 line_height = mDefaultFont->getLineHeight();  	S32 line_start = getLineStart(cur_line);  	S32 line_y = mVisibleTextRect.mTop - line_height; @@ -2707,7 +2707,7 @@ BOOL LLTextEditor::getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect      const LLWString textString(getWText());  	const llwchar * const text = textString.c_str(); -	const S32 line_height = llround(mDefaultFont->getLineHeight()); +	const S32 line_height = mDefaultFont->getLineHeight();  	if (coord)  	{ @@ -2810,7 +2810,7 @@ void LLTextEditor::markAsPreedit(S32 position, S32 length)  S32 LLTextEditor::getPreeditFontSize() const  { -	return llround(mDefaultFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]); +	return llround((F32)mDefaultFont->getLineHeight() * LLUI::sGLScaleFactor.mV[VY]);  }  BOOL LLTextEditor::isDirty() const diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 9b31a6449d..81ea0ebf0c 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -827,7 +827,7 @@ void LLToolBar::draw()  	// rect may have shifted during layout  	LLUI::popMatrix();  	LLUI::pushMatrix(); -	LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom, 0.f); +	LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom);  	// Position the caret   	LLIconCtrl* caret = getChild<LLIconCtrl>("caret"); diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 23cdd9ad9a..f737d48abf 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -180,6 +180,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	params.font = p.font;  	params.use_ellipses = true;  	params.wrap = p.wrap; +	params.font_valign = LLFontGL::VCENTER;  	params.parse_urls = false; // disallow hyperlinks in tooltips, as they want to spawn their own explanatory tooltips  	mTextBox = LLUICtrlFactory::create<LLTextBox> (params);  	addChild(mTextBox); @@ -190,7 +191,6 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	{  		LLButton::Params icon_params;  		icon_params.name = "tooltip_info"; -		icon_params.label(""); // provid label but set to empty so name does not overwrite it -angela  		LLRect icon_rect;  		LLUIImage* imagep = p.image;  		TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16); @@ -291,6 +291,12 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)  	S32 text_width = llmin(p.max_width(), mTextBox->getTextPixelWidth());  	S32 text_height = mTextBox->getTextPixelHeight();  	mTextBox->reshape(text_width, text_height); +	if (mInfoButton) +	{ +		LLRect text_rect = mTextBox->getRect(); +		LLRect icon_rect = mInfoButton->getRect(); +		mTextBox->translate(0, icon_rect.getCenterY() - text_rect.getCenterY()); +	}  	// reshape tooltip panel to fit text box  	LLRect tooltip_rect = calcBoundingRect(); @@ -299,6 +305,8 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)  	tooltip_rect.mBottom = 0;  	tooltip_rect.mLeft = 0; +	mTextBox->reshape(mTextBox->getRect().getWidth(), llmax(mTextBox->getRect().getHeight(), tooltip_rect.getHeight() - 2 * mPadding)); +  	setShape(tooltip_rect);  } diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 6b74c5a6be..31ccec0d2a 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1688,21 +1688,22 @@ void LLUI::translate(F32 x, F32 y, F32 z)  	gGL.translateUI(x,y,z);  	LLFontGL::sCurOrigin.mX += (S32) x;  	LLFontGL::sCurOrigin.mY += (S32) y; -	LLFontGL::sCurOrigin.mZ += z; +	LLFontGL::sCurDepth += z;  }  //static  void LLUI::pushMatrix()  {  	gGL.pushUIMatrix(); -	LLFontGL::sOriginStack.push_back(LLFontGL::sCurOrigin); +	LLFontGL::sOriginStack.push_back(std::make_pair(LLFontGL::sCurOrigin, LLFontGL::sCurDepth));  }  //static  void LLUI::popMatrix()  {  	gGL.popUIMatrix(); -	LLFontGL::sCurOrigin = *LLFontGL::sOriginStack.rbegin(); +	LLFontGL::sCurOrigin = LLFontGL::sOriginStack.back().first; +	LLFontGL::sCurDepth = LLFontGL::sOriginStack.back().second;  	LLFontGL::sOriginStack.pop_back();  } @@ -1712,7 +1713,7 @@ void LLUI::loadIdentity()  	gGL.loadUIIdentity();   	LLFontGL::sCurOrigin.mX = 0;  	LLFontGL::sCurOrigin.mY = 0; -	LLFontGL::sCurOrigin.mZ = 0; +	LLFontGL::sCurDepth = 0.f;  }  //static @@ -1735,10 +1736,7 @@ void LLUI::setMousePositionScreen(S32 x, S32 y)  	screen_x = llround((F32)x * sGLScaleFactor.mV[VX]);  	screen_y = llround((F32)y * sGLScaleFactor.mV[VY]); -	LLCoordWindow window_point; -	LLView::getWindow()->convertCoords(LLCoordGL(screen_x, screen_y), &window_point); - -	LLView::getWindow()->setCursorPosition(window_point); +	LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert());  }  //static  @@ -1746,8 +1744,7 @@ void LLUI::getMousePositionScreen(S32 *x, S32 *y)  {  	LLCoordWindow cursor_pos_window;  	getWindow()->getCursorPosition(&cursor_pos_window); -	LLCoordGL cursor_pos_gl; -	getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); +	LLCoordGL cursor_pos_gl(cursor_pos_window.convert());  	*x = llround((F32)cursor_pos_gl.mX / sGLScaleFactor.mV[VX]);  	*y = llround((F32)cursor_pos_gl.mY / sGLScaleFactor.mV[VX]);  } @@ -2052,7 +2049,7 @@ void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)  	// Start at spawn position (using left/top)  	view->setOrigin( local_x, local_y - view->getRect().getHeight());  	// Make sure we're on-screen and not overlapping the mouse -	view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect, FALSE ); +	view->translateIntoRectWithExclusion( virtual_window_rect, mouse_rect );  }  LLView* LLUI::resolvePath(LLView* context, const std::string& path) diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index e1ee0a5b14..356d5c31d1 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1106,7 +1106,7 @@ void LLView::drawChildren()  				{  					LLUI::pushMatrix();  					{ -						LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom, 0.f); +						LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom);  						// flag the fact we are in draw here, in case overridden draw() method attempts to remove this widget  						viewp->mInDraw = true;  						viewp->draw(); @@ -1159,7 +1159,7 @@ void LLView::drawDebugRect()  		if (getUseBoundingRect())  		{ -			LLUI::translate((F32)mBoundingRect.mLeft - (F32)mRect.mLeft, (F32)mBoundingRect.mBottom - (F32)mRect.mBottom, 0.f); +			LLUI::translate((F32)mBoundingRect.mLeft - (F32)mRect.mLeft, (F32)mBoundingRect.mBottom - (F32)mRect.mBottom);  		}  		LLRect debug_rect = getUseBoundingRect() ? mBoundingRect : mRect; @@ -1231,7 +1231,7 @@ void LLView::drawChild(LLView* childp, S32 x_offset, S32 y_offset, BOOL force_dr  			gGL.matrixMode(LLRender::MM_MODELVIEW);  			LLUI::pushMatrix();  			{ -				LLUI::translate((F32)childp->getRect().mLeft + x_offset, (F32)childp->getRect().mBottom + y_offset, 0.f); +				LLUI::translate((F32)childp->getRect().mLeft + x_offset, (F32)childp->getRect().mBottom + y_offset);  				childp->draw();  			}  			LLUI::popMatrix(); @@ -1300,7 +1300,10 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent)  			S32 delta_x = child_rect.mLeft - viewp->getRect().mLeft;  			S32 delta_y = child_rect.mBottom - viewp->getRect().mBottom;  			viewp->translate( delta_x, delta_y ); -			viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); +			if (child_rect.getWidth() != viewp->getRect().getWidth() || child_rect.getHeight() != viewp->getRect().getHeight()) +			{ +				viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); +			}  		}  	} @@ -1616,59 +1619,30 @@ LLView* LLView::findNextSibling(LLView* child)  } -LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BOOL allow_partial_outside) +LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, S32 min_overlap_pixels)  {  	LLCoordGL delta; -	if (allow_partial_outside) -	{ -		const S32 KEEP_ONSCREEN_PIXELS = 16; +	const S32 KEEP_ONSCREEN_PIXELS_WIDTH = llmin(min_overlap_pixels, input.getWidth()); +	const S32 KEEP_ONSCREEN_PIXELS_HEIGHT = llmin(min_overlap_pixels, input.getHeight()); -		if( input.mRight - KEEP_ONSCREEN_PIXELS < constraint.mLeft ) -		{ -			delta.mX = constraint.mLeft - (input.mRight - KEEP_ONSCREEN_PIXELS); -		} -		else -		if( input.mLeft + KEEP_ONSCREEN_PIXELS > constraint.mRight ) -		{ -			delta.mX = constraint.mRight - (input.mLeft + KEEP_ONSCREEN_PIXELS); -		} +	if( input.mRight - KEEP_ONSCREEN_PIXELS_WIDTH < constraint.mLeft ) +	{ +		delta.mX = constraint.mLeft - (input.mRight - KEEP_ONSCREEN_PIXELS_WIDTH); +	} +	else if( input.mLeft + KEEP_ONSCREEN_PIXELS_WIDTH > constraint.mRight ) +	{ +		delta.mX = constraint.mRight - (input.mLeft + KEEP_ONSCREEN_PIXELS_WIDTH); +	} -		if( input.mTop > constraint.mTop ) -		{ -			delta.mY = constraint.mTop - input.mTop; -		} -		else -		if( input.mTop - KEEP_ONSCREEN_PIXELS < constraint.mBottom ) -		{ -			delta.mY = constraint.mBottom - (input.mTop - KEEP_ONSCREEN_PIXELS); -		} +	if( input.mTop > constraint.mTop ) +	{ +		delta.mY = constraint.mTop - input.mTop;  	}  	else +	if( input.mTop - KEEP_ONSCREEN_PIXELS_HEIGHT < constraint.mBottom )  	{ -		if( input.mLeft < constraint.mLeft ) -		{ -			delta.mX = constraint.mLeft - input.mLeft; -		} -		else -		if( input.mRight > constraint.mRight ) -		{ -			delta.mX = constraint.mRight - input.mRight; -			// compensate for left edge possible going off screen -			delta.mX += llmax( 0, input.getWidth() - constraint.getWidth() ); -		} - -		if( input.mTop > constraint.mTop ) -		{ -			delta.mY = constraint.mTop - input.mTop; -		} -		else -		if( input.mBottom < constraint.mBottom ) -		{ -			delta.mY = constraint.mBottom - input.mBottom; -			// compensate for top edge possible going off screen -			delta.mY -= llmax( 0, input.getHeight() - constraint.getHeight() ); -		} +		delta.mY = constraint.mBottom - (input.mTop - KEEP_ONSCREEN_PIXELS_HEIGHT);  	}  	return delta; @@ -1677,9 +1651,9 @@ LLCoordGL getNeededTranslation(const LLRect& input, const LLRect& constraint, BO  // Moves the view so that it is entirely inside of constraint.  // If the view will not fit because it's too big, aligns with the top and left.  // (Why top and left?  That's where the drag bars are for floaters.) -BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outside ) +BOOL LLView::translateIntoRect(const LLRect& constraint, S32 min_overlap_pixels)  { -	LLCoordGL translation = getNeededTranslation(getRect(), constraint, allow_partial_outside); +	LLCoordGL translation = getNeededTranslation(getRect(), constraint, min_overlap_pixels);  	if (translation.mX != 0 || translation.mY != 0)  	{ @@ -1691,9 +1665,9 @@ BOOL LLView::translateIntoRect(const LLRect& constraint, BOOL allow_partial_outs  // move this view into "inside" but not onto "exclude"  // NOTE: if this view is already contained in "inside", we ignore the "exclude" rect -BOOL LLView::translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside ) +BOOL LLView::translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, S32 min_overlap_pixels)  { -	LLCoordGL translation = getNeededTranslation(getRect(), inside, allow_partial_outside); +	LLCoordGL translation = getNeededTranslation(getRect(), inside, min_overlap_pixels);  	if (translation.mX != 0 || translation.mY != 0)  	{ @@ -2251,145 +2225,163 @@ static bool get_last_child_rect(LLView* parent, LLRect *rect)  }  //static -void LLView::applyXUILayout(LLView::Params& p, LLView* parent) +void LLView::applyXUILayout(LLView::Params& p, LLView* parent, LLRect layout_rect)  { +	if (!parent) return; +  	const S32 VPAD = 4;  	const S32 MIN_WIDGET_HEIGHT = 10;  	// *NOTE:  This will confuse export of floater/panel coordinates unless  	// the default is also "topleft".  JC -	if (p.layout().empty() && parent) +	if (p.layout().empty())  	{  		p.layout = parent->getLayout();  	} -	if (parent) +	if (layout_rect.isEmpty())  	{ -		LLRect parent_rect = parent->getLocalRect(); -		// overwrite uninitialized rect params, using context -		LLRect default_rect = parent->getLocalRect(); +		layout_rect = parent->getLocalRect(); +	} -		bool layout_topleft = (p.layout() == "topleft"); +	// overwrite uninitialized rect params, using context +	LLRect default_rect = parent->getLocalRect(); -		// convert negative or centered coordinates to parent relative values -		// Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock() -		if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth(); -		if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth(); -		if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight(); -		if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight(); +	bool layout_topleft = (p.layout() == "topleft"); +	// convert negative or centered coordinates to parent relative values +	// Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock() +	if (p.rect.left.isProvided())  +	{ +		p.rect.left = p.rect.left + ((p.rect.left >= 0) ? layout_rect.mLeft : layout_rect.mRight); +	} +	if (p.rect.right.isProvided()) +	{ +		p.rect.right = p.rect.right + ((p.rect.right >= 0) ? layout_rect.mLeft : layout_rect.mRight); +	} +	if (p.rect.bottom.isProvided())  +	{ +		p.rect.bottom = p.rect.bottom + ((p.rect.bottom >= 0) ? layout_rect.mBottom : layout_rect.mTop);  		if (layout_topleft)  		{  			//invert top to bottom -			if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top; -			if (p.rect.bottom.isProvided()) p.rect.bottom = parent_rect.getHeight() - p.rect.bottom; +			p.rect.bottom = layout_rect.mBottom + layout_rect.mTop - p.rect.bottom;  		} - -		// DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels -		if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0) +	} +	if (p.rect.top.isProvided()) +	{ +		p.rect.top = p.rect.top + ((p.rect.top >= 0) ? layout_rect.mBottom : layout_rect.mTop); +		if (layout_topleft)  		{ -			p.rect.height = MIN_WIDGET_HEIGHT; +			//invert top to bottom +			p.rect.top = layout_rect.mBottom + layout_rect.mTop - p.rect.top;  		} +	} -		default_rect.translate(0, default_rect.getHeight()); +	// DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels +	if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0) +	{ +		p.rect.height = MIN_WIDGET_HEIGHT; +	} -		// If there was a recently constructed child, use its rectangle -		get_last_child_rect(parent, &default_rect); +	default_rect.translate(0, default_rect.getHeight()); -		if (layout_topleft) +	// If there was a recently constructed child, use its rectangle +	get_last_child_rect(parent, &default_rect); + +	if (layout_topleft) +	{ +		// Invert the sense of bottom_delta for topleft layout +		if (p.bottom_delta.isProvided())  		{ -			// Invert the sense of bottom_delta for topleft layout -			if (p.bottom_delta.isProvided()) -			{ -				p.bottom_delta = -p.bottom_delta; -			} -			else if (p.top_pad.isProvided())  -			{ -				p.bottom_delta = -(p.rect.height + p.top_pad); -			} -			else if (p.top_delta.isProvided()) -			{ -				p.bottom_delta = -					-(p.top_delta + p.rect.height - default_rect.getHeight()); -			} -			else if (!p.left_delta.isProvided() -					 && !p.left_pad.isProvided()) -			{ -				// set default position is just below last rect -				p.bottom_delta.set(-(p.rect.height + VPAD), false); -			} -			else -			{ -				p.bottom_delta.set(0, false); -			} -	 -			// default to same left edge -			if (!p.left_delta.isProvided()) -			{ -				p.left_delta.set(0, false); -			} -			if (p.left_pad.isProvided()) -			{ -				// left_pad is based on prior widget's right edge -				p.left_delta.set(p.left_pad + default_rect.getWidth(), false); -			} -			 -			default_rect.translate(p.left_delta, p.bottom_delta);				 +			p.bottom_delta = -p.bottom_delta;  		} -		else -		{	 -			// set default position is just below last rect -			if (!p.bottom_delta.isProvided()) -			{ -				p.bottom_delta.set(-(p.rect.height + VPAD), false); -			} -			if (!p.left_delta.isProvided()) -			{ -				p.left_delta.set(0, false); -			} -			default_rect.translate(p.left_delta, p.bottom_delta); +		else if (p.top_pad.isProvided())  +		{ +			p.bottom_delta = -(p.rect.height + p.top_pad);  		} - -		// this handles case where *both* x and x_delta are provided -		// ignore x in favor of default x + x_delta -		if (p.bottom_delta.isProvided()) p.rect.bottom.set(0, false); -		if (p.left_delta.isProvided()) p.rect.left.set(0, false); - -		// selectively apply rectangle defaults, making sure that -		// params are not flagged as having been "provided" -		// as rect params are overconstrained and rely on provided flags -		if (!p.rect.left.isProvided()) +		else if (p.top_delta.isProvided())  		{ -			p.rect.left.set(default_rect.mLeft, false); -			//HACK: get around the fact that setting a rect param component value won't invalidate the existing rect object value -			p.rect.paramChanged(p.rect.left, true); +			p.bottom_delta = +				-(p.top_delta + p.rect.height - default_rect.getHeight());  		} -		if (!p.rect.bottom.isProvided()) +		else if (!p.left_delta.isProvided() +					&& !p.left_pad.isProvided())  		{ -			p.rect.bottom.set(default_rect.mBottom, false); -			p.rect.paramChanged(p.rect.bottom, true); +			// set default position is just below last rect +			p.bottom_delta.set(-(p.rect.height + VPAD), false); +		} +		else +		{ +			p.bottom_delta.set(0, false);  		} -		if (!p.rect.top.isProvided()) +	 +		// default to same left edge +		if (!p.left_delta.isProvided())  		{ -			p.rect.top.set(default_rect.mTop, false); -			p.rect.paramChanged(p.rect.top, true); +			p.left_delta.set(0, false);  		} -		if (!p.rect.right.isProvided()) +		if (p.left_pad.isProvided())  		{ -			p.rect.right.set(default_rect.mRight, false); -			p.rect.paramChanged(p.rect.right, true); - +			// left_pad is based on prior widget's right edge +			p.left_delta.set(p.left_pad + default_rect.getWidth(), false);  		} -		if (!p.rect.width.isProvided()) +			 +		default_rect.translate(p.left_delta, p.bottom_delta);				 +	} +	else +	{	 +		// set default position is just below last rect +		if (!p.bottom_delta.isProvided())  		{ -			p.rect.width.set(default_rect.getWidth(), false); -			p.rect.paramChanged(p.rect.width, true); +			p.bottom_delta.set(-(p.rect.height + VPAD), false);  		} -		if (!p.rect.height.isProvided()) +		if (!p.left_delta.isProvided())  		{ -			p.rect.height.set(default_rect.getHeight(), false); -			p.rect.paramChanged(p.rect.height, true); +			p.left_delta.set(0, false);  		} +		default_rect.translate(p.left_delta, p.bottom_delta); +	} + +	// this handles case where *both* x and x_delta are provided +	// ignore x in favor of default x + x_delta +	if (p.bottom_delta.isProvided()) p.rect.bottom.set(0, false); +	if (p.left_delta.isProvided()) p.rect.left.set(0, false); + +	// selectively apply rectangle defaults, making sure that +	// params are not flagged as having been "provided" +	// as rect params are overconstrained and rely on provided flags +	if (!p.rect.left.isProvided()) +	{ +		p.rect.left.set(default_rect.mLeft, false); +		//HACK: get around the fact that setting a rect param component value won't invalidate the existing rect object value +		p.rect.paramChanged(p.rect.left, true); +	} +	if (!p.rect.bottom.isProvided()) +	{ +		p.rect.bottom.set(default_rect.mBottom, false); +		p.rect.paramChanged(p.rect.bottom, true); +	} +	if (!p.rect.top.isProvided()) +	{ +		p.rect.top.set(default_rect.mTop, false); +		p.rect.paramChanged(p.rect.top, true); +	} +	if (!p.rect.right.isProvided()) +	{ +		p.rect.right.set(default_rect.mRight, false); +		p.rect.paramChanged(p.rect.right, true); + +	} +	if (!p.rect.width.isProvided()) +	{ +		p.rect.width.set(default_rect.getWidth(), false); +		p.rect.paramChanged(p.rect.width, true); +	} +	if (!p.rect.height.isProvided()) +	{ +		p.rect.height.set(default_rect.getHeight(), false); +		p.rect.paramChanged(p.rect.height, true);  	}  } diff --git a/indra/llui/llview.h b/indra/llui/llview.h index f1fac5f69c..1c35349510 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -370,8 +370,8 @@ public:  	virtual void	reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);  	virtual void	translate( S32 x, S32 y );  	void			setOrigin( S32 x, S32 y )	{ mRect.translate( x - mRect.mLeft, y - mRect.mBottom ); } -	BOOL			translateIntoRect( const LLRect& constraint, BOOL allow_partial_outside ); -	BOOL			translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, BOOL allow_partial_outside ); +	BOOL			translateIntoRect( const LLRect& constraint, S32 min_overlap_pixels = S32_MAX); +	BOOL			translateIntoRectWithExclusion( const LLRect& inside, const LLRect& exclude, S32 min_overlap_pixels = S32_MAX);  	void			centerWithin(const LLRect& bounds);  	void	setShape(const LLRect& new_rect, bool by_user = false); @@ -505,7 +505,7 @@ public:  	// Set up params after XML load before calling new(),  	// usually to adjust layout. -	static void applyXUILayout(Params& p, LLView* parent); +	static void applyXUILayout(Params& p, LLView* parent, LLRect layout_rect = LLRect());  	// For re-export of floaters and panels, convert the coordinate system  	// to be top-left based. diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp index 3d3ed9f6d4..073b1af2a1 100644 --- a/indra/llvfs/lllfsthread.cpp +++ b/indra/llvfs/lllfsthread.cpp @@ -45,7 +45,7 @@ void LLLFSThread::initClass(bool local_is_threaded)  //static  S32 LLLFSThread::updateClass(U32 ms_elapsed)  { -	sLocal->update(ms_elapsed); +	sLocal->update((F32)ms_elapsed);  	return sLocal->getPending();  } diff --git a/indra/llvfs/llvfsthread.cpp b/indra/llvfs/llvfsthread.cpp index 254f8b55ba..a57e2b15ab 100644 --- a/indra/llvfs/llvfsthread.cpp +++ b/indra/llvfs/llvfsthread.cpp @@ -46,7 +46,7 @@ void LLVFSThread::initClass(bool local_is_threaded)  //static  S32 LLVFSThread::updateClass(U32 ms_elapsed)  { -	sLocal->update(ms_elapsed); +	sLocal->update((F32)ms_elapsed);  	return sLocal->getPending();  } diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp index d4d444eb28..15acddd987 100644 --- a/indra/llwindow/lldragdropwin32.cpp +++ b/indra/llwindow/lldragdropwin32.cpp @@ -124,10 +124,9 @@ class LLDragDropWin32Target:  						ScreenToClient( mAppWindowHandle, &pt2 );  						LLCoordWindow cursor_coord_window( pt2.x, pt2.y ); -						window_imp->convertCoords(cursor_coord_window, &gl_coord);  						MASK mask = gKeyboard->currentMask(TRUE); -						LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,  +						LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( cursor_coord_window.convert(), mask,   							LLWindowCallbacks::DNDA_START_TRACKING, mDropUrl );  						switch (result) @@ -180,10 +179,9 @@ class LLDragDropWin32Target:  					ScreenToClient( mAppWindowHandle, &pt2 );  					LLCoordWindow cursor_coord_window( pt2.x, pt2.y ); -					window_imp->convertCoords(cursor_coord_window, &gl_coord);  					MASK mask = gKeyboard->currentMask(TRUE); -					LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( gl_coord, mask,  +					LLWindowCallbacks::DragNDropResult result = window_imp->completeDragNDropRequest( cursor_coord_window.convert(), mask,   						LLWindowCallbacks::DNDA_TRACK, mDropUrl );  					switch (result) @@ -237,15 +235,13 @@ class LLDragDropWin32Target:  				LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong( mAppWindowHandle, GWL_USERDATA );  				if ( NULL != window_imp )  				{ -					LLCoordGL gl_coord( 0, 0 ); -  					POINT pt_client;  					pt_client.x = pt.x;  					pt_client.y = pt.y;  					ScreenToClient( mAppWindowHandle, &pt_client );  					LLCoordWindow cursor_coord_window( pt_client.x, pt_client.y ); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					LLCoordGL gl_coord(cursor_coord_window.convert());  					llinfos << "### (Drop) URL is: " << mDropUrl << llendl;  					llinfos << "###        raw coords are: " << pt.x << " x " << pt.y << llendl;  					llinfos << "###	    client coords are: " << pt_client.x << " x " << pt_client.y << llendl; diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 2e9e31bfea..5b7424acbb 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -192,6 +192,21 @@ BOOL LLWindow::setSize(LLCoordScreen size)  	return setSizeImpl(size);  } +BOOL LLWindow::setSize(LLCoordWindow size) +{ +	//HACK: we are inconsistently using minimum window dimensions +	// in this case, we are constraining the inner "client" rect and other times +	// we constrain the outer "window" rect +	// There doesn't seem to be a good way to do this consistently without a bunch of platform +	// specific code +	if (!getMaximized()) +	{ +		size.mX = llmax(size.mX, mMinWindowWidth); +		size.mY = llmax(size.mY, mMinWindowHeight); +	} +	return setSizeImpl(size); +} +  // virtual  void LLWindow::setMinSize(U32 min_width, U32 min_height, bool enforce_immediately) @@ -436,3 +451,42 @@ BOOL LLWindowManager::isWindowValid(LLWindow *window)  {  	return sWindowList.find(window) != sWindowList.end();  } + +//coordinate conversion utility funcs that forward to llwindow +LLCoordCommon LL_COORD_TYPE_WINDOW::convertToCommon() const +{ +	const LLCoordWindow& self = LLCoordWindow::getTypedCoords(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL out; +	windowp->convertCoords(self, &out); +	return out.convert(); +} + +void LL_COORD_TYPE_WINDOW::convertFromCommon(const LLCoordCommon& from) +{ +	LLCoordWindow& self = LLCoordWindow::getTypedCoords(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL from_gl(from); +	windowp->convertCoords(from_gl, &self); +} + +LLCoordCommon LL_COORD_TYPE_SCREEN::convertToCommon() const +{ +	const LLCoordScreen& self = LLCoordScreen::getTypedCoords(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL out; +	windowp->convertCoords(self, &out); +	return out.convert(); +} + +void LL_COORD_TYPE_SCREEN::convertFromCommon(const LLCoordCommon& from) +{ +	LLCoordScreen& self = LLCoordScreen::getTypedCoords(*this); + +	LLWindow* windowp = &(*LLWindow::beginInstances()); +	LLCoordGL from_gl(from); +	windowp->convertCoords(from_gl, &self); +} diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index cab2d0a8fb..4da87f4e06 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -39,7 +39,7 @@ class LLWindowCallbacks;  // Refer to llwindow_test in test/common/llwindow for usage example -class LLWindow +class LLWindow : public LLInstanceTracker<LLWindow>  {  public:  	struct LLWindowResolution @@ -73,6 +73,7 @@ public:  	virtual BOOL getSize(LLCoordWindow *size) = 0;  	virtual BOOL setPosition(LLCoordScreen position) = 0;  	BOOL setSize(LLCoordScreen size); +	BOOL setSize(LLCoordWindow size);  	virtual void setMinSize(U32 min_width, U32 min_height, bool enforce_immediately = true);  	virtual BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) = 0;  	virtual BOOL setCursorPosition(LLCoordWindow position) = 0; @@ -172,6 +173,7 @@ protected:  	virtual BOOL canDelete();  	virtual BOOL setSizeImpl(LLCoordScreen size) = 0; +	virtual BOOL setSizeImpl(LLCoordWindow size) = 0;  protected:  	LLWindowCallbacks*	mCallbacks; diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp index c2705bbf74..9712ae1d91 100644 --- a/indra/llwindow/llwindowcallbacks.cpp +++ b/indra/llwindow/llwindowcallbacks.cpp @@ -28,8 +28,6 @@  #include "llwindowcallbacks.h" -#include "llcoord.h" -  //  // LLWindowCallbacks  // diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h index 8572b442f1..7da5959700 100644 --- a/indra/llwindow/llwindowcallbacks.h +++ b/indra/llwindow/llwindowcallbacks.h @@ -26,7 +26,7 @@  #ifndef LLWINDOWCALLBACKS_H  #define LLWINDOWCALLBACKS_H -class LLCoordGL; +#include "llcoord.h"  class LLWindow;  class LLWindowCallbacks diff --git a/indra/llwindow/llwindowheadless.h b/indra/llwindow/llwindowheadless.h index d4a778cb85..1f767f4c97 100644 --- a/indra/llwindow/llwindowheadless.h +++ b/indra/llwindow/llwindowheadless.h @@ -47,6 +47,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size) {return FALSE;};  	/*virtual*/ BOOL setPosition(LLCoordScreen position) {return FALSE;};  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size) {return FALSE;}; +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size) {return FALSE;};  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL) {return FALSE;};  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position) {return FALSE;};  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position) {return FALSE;}; diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index c952f8bbcf..32bb84cba5 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -1266,6 +1266,31 @@ BOOL LLWindowMacOSX::setSizeImpl(const LLCoordScreen size)  	return TRUE;  } +BOOL LLWindowMacOSX::setSizeImpl(const LLCoordWindow size) +{ +	Rect client_rect; +	if (mWindow) +	{ +		OSStatus err = GetWindowBounds(mWindow, kWindowContentRgn, &client_rect); +		if (err == noErr) +		{ +			client_rect.right = client_rect.left + size.mX; +			client_rect.bottom = client_rect.top + size.mY; +			err = SetWindowBounds(mWindow, kWindowContentRgn, &client_rect); +		} +		if (err == noErr) +		{ +			return TRUE; +		} +		else +		{ +			llinfos << "Error setting size" << err << llendl; +			return FALSE; +		} +	} +	return FALSE; +} +  void LLWindowMacOSX::swapBuffers()  {  	aglSwapBuffers(mContext); diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index 073f294b54..52ba8b3bf3 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -59,6 +59,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size);  	/*virtual*/ BOOL setPosition(LLCoordScreen position);  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size); +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 5f5baceef8..3d33af9d9b 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -981,6 +981,25 @@ BOOL LLWindowSDL::setSizeImpl(const LLCoordScreen size)  	return FALSE;  } +BOOL LLWindowSDL::setSizeImpl(const LLCoordWindow size) +{ +	if(mWindow) +	{ +		// Push a resize event onto SDL's queue - we'll handle it +		// when it comes out again. +		SDL_Event event; +		event.type = SDL_VIDEORESIZE; +		event.resize.w = size.mX; +		event.resize.h = size.mY; +		SDL_PushEvent(&event); // copied into queue + +		return TRUE; +	} + +	return FALSE; +} + +  void LLWindowSDL::swapBuffers()  {  	if (mWindow) diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h index 59719e4046..4e2a269ea3 100644 --- a/indra/llwindow/llwindowsdl.h +++ b/indra/llwindow/llwindowsdl.h @@ -64,6 +64,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size);  	/*virtual*/ BOOL setPosition(LLCoordScreen position);  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size); +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 67d1a168e6..bc85acbf45 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -872,10 +872,30 @@ BOOL LLWindowWin32::setSizeImpl(const LLCoordScreen size)  		return FALSE;  	} +	WINDOWPLACEMENT placement; +	placement.length = sizeof(WINDOWPLACEMENT); + +	if (!GetWindowPlacement(mWindowHandle, &placement)) return FALSE; + +	placement.showCmd = SW_RESTORE; + +	if (!SetWindowPlacement(mWindowHandle, &placement)) return FALSE; +  	moveWindow(position, size);  	return TRUE;  } +BOOL LLWindowWin32::setSizeImpl(const LLCoordWindow size) +{ +	RECT window_rect = {0, 0, size.mX, size.mY }; +	DWORD dw_ex_style = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; +	DWORD dw_style = WS_OVERLAPPEDWINDOW; + +	AdjustWindowRectEx(&window_rect, dw_style, FALSE, dw_ex_style); + +	return setSizeImpl(LLCoordScreen(window_rect.right - window_rect.left, window_rect.bottom - window_rect.top)); +} +  // changing fullscreen resolution  BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp)  { @@ -886,12 +906,12 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  	DWORD	current_refresh;  	DWORD	dw_ex_style;  	DWORD	dw_style; -	RECT	window_rect; +	RECT	window_rect = {0, 0, 0, 0};  	S32 width = size.mX;  	S32 height = size.mY;  	BOOL auto_show = FALSE; -	if (mhRC) +	if (mhRC)	  	{  		auto_show = TRUE;  		resetDisplayResolution(); @@ -986,7 +1006,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  			dw_ex_style = WS_EX_APPWINDOW;  			dw_style = WS_POPUP; -			// Move window borders out not to cover window contents +			// Move window borders out not to cover window contents. +			// This converts client rect to window rect, i.e. expands it by the window border size.  			AdjustWindowRectEx(&window_rect, dw_style, FALSE, dw_ex_style);  		}  		// If it failed, we don't want to run fullscreen @@ -1014,6 +1035,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  		dw_style = WS_OVERLAPPEDWINDOW;  	} +  	// don't post quit messages when destroying old windows  	mPostQuit = FALSE; @@ -1545,24 +1567,16 @@ void LLWindowWin32::moveWindow( const LLCoordScreen& position, const LLCoordScre  BOOL LLWindowWin32::setCursorPosition(const LLCoordWindow position)  { -	LLCoordScreen screen_pos; -  	mMousePositionModified = TRUE;  	if (!mWindowHandle)  	{  		return FALSE;  	} -	if (!convertCoords(position, &screen_pos)) -	{ -		return FALSE; -	}  	// Inform the application of the new mouse position (needed for per-frame  	// hover/picking to function). -	LLCoordGL gl_pos; -	convertCoords(position, &gl_pos); -	mCallbacks->handleMouseMove(this, gl_pos, (MASK)0); +	mCallbacks->handleMouseMove(this, position.convert(), (MASK)0);  	// DEV-18951 VWR-8524 Camera moves wildly when alt-clicking.  	// Because we have preemptively notified the application of the new @@ -1572,24 +1586,23 @@ BOOL LLWindowWin32::setCursorPosition(const LLCoordWindow position)  	while (PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE))  	{ } -	return SetCursorPos(screen_pos.mX, screen_pos.mY); +	LLCoordScreen screen_pos(position.convert()); +	return ::SetCursorPos(screen_pos.mX, screen_pos.mY);  }  BOOL LLWindowWin32::getCursorPosition(LLCoordWindow *position)  {  	POINT cursor_point; -	LLCoordScreen screen_pos; -	if (!mWindowHandle || -		!GetCursorPos(&cursor_point)) +	if (!mWindowHandle  +		|| !GetCursorPos(&cursor_point) +		|| !position)  	{  		return FALSE;  	} -	screen_pos.mX = cursor_point.x; -	screen_pos.mY = cursor_point.y; - -	return convertCoords(screen_pos, position); +	*position = LLCoordScreen(cursor_point.x, cursor_point.y).convert(); +	return TRUE;  }  void LLWindowWin32::hideCursor() @@ -1807,6 +1820,10 @@ static LLFastTimer::DeclareTimer FTM_MOUSEHANDLER("Handle Mouse");  LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_param, LPARAM l_param)  { +	// Ignore clicks not originated in the client area, i.e. mouse-up events not preceded with a WM_LBUTTONDOWN. +	// This helps prevent avatar walking after maximizing the window by double-clicking the title bar. +	static bool sHandleLeftMouseUp = true; +  	LLWindowWin32 *window_imp = (LLWindowWin32 *)GetWindowLong(h_wnd, GWL_USERDATA); @@ -2153,10 +2170,20 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  			window_imp->handleUnicodeUTF16((U16)w_param, gKeyboard->currentMask(FALSE));  			return 0; +		case WM_NCLBUTTONDOWN: +			{ +				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_NCLBUTTONDOWN"); +				// A click in a non-client area, e.g. title bar or window border. +				sHandleLeftMouseUp = false; +			} +			break; +  		case WM_LBUTTONDOWN:  			{  				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_LBUTTONDOWN");  				LLFastTimer t2(FTM_MOUSEHANDLER); +				sHandleLeftMouseUp = true; +  				if (LLWinImm::isAvailable() && window_imp->mPreeditor)  				{  					window_imp->interruptLanguageTextInput(); @@ -2167,15 +2194,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2197,15 +2224,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2221,6 +2248,13 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  			{  				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_LBUTTONUP");  				LLFastTimer t2(FTM_MOUSEHANDLER); + +				if (!sHandleLeftMouseUp) +				{ +					sHandleLeftMouseUp = true; +					break; +				} +  				//if (gDebugClicks)  				//{  				//	LL_INFOS("Window") << "WndProc left button up" << LL_ENDL; @@ -2230,15 +2264,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2265,15 +2299,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2294,15 +2328,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2329,15 +2363,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2358,15 +2392,15 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  				// If we don't do this, many clicks could get buffered up, and if the  				// first click changes the cursor position, all subsequent clicks  				// will occur at the wrong location.  JC -				LLCoordWindow cursor_coord_window;  				if (window_imp->mMousePositionModified)  				{ +					LLCoordWindow cursor_coord_window;  					window_imp->getCursorPosition(&cursor_coord_window); -					window_imp->convertCoords(cursor_coord_window, &gl_coord); +					gl_coord = cursor_coord_window.convert();  				}  				else  				{ -					window_imp->convertCoords(window_coord, &gl_coord); +					gl_coord = window_coord.convert();  				}  				MASK mask = gKeyboard->currentMask(TRUE);  				// generate move event to update mouse coordinates @@ -2438,9 +2472,8 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  		case WM_MOUSEMOVE:  			{  				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_MOUSEMOVE"); -				window_imp->convertCoords(window_coord, &gl_coord);  				MASK mask = gKeyboard->currentMask(TRUE); -				window_imp->mCallbacks->handleMouseMove(window_imp, gl_coord, mask); +				window_imp->mCallbacks->handleMouseMove(window_imp, window_coord.convert(), mask);  				return 0;  			} @@ -3328,7 +3361,7 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )  			LLWinImm::setCompositionWindow( himc, &ime_form ); -			sWinIMEWindowPosition.set( win_pos.mX, win_pos.mY ); +			sWinIMEWindowPosition = win_pos;  		}  		LLWinImm::releaseContext(mWindowHandle, himc); diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index b3602be8b7..54c9ac4d4d 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -58,6 +58,7 @@ public:  	/*virtual*/ BOOL getSize(LLCoordWindow *size);  	/*virtual*/ BOOL setPosition(LLCoordScreen position);  	/*virtual*/ BOOL setSizeImpl(LLCoordScreen size); +	/*virtual*/ BOOL setSizeImpl(LLCoordWindow size);  	/*virtual*/ BOOL switchContext(BOOL fullscreen, const LLCoordScreen &size, BOOL disable_vsync, const LLCoordScreen * const posp = NULL);  	/*virtual*/ BOOL setCursorPosition(LLCoordWindow position);  	/*virtual*/ BOOL getCursorPosition(LLCoordWindow *position); diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index bf38a8b062..597031ec70 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -92,6 +92,8 @@ typedef enum e_control_type  class LLControlVariable : public LLRefCount  { +	LOG_CLASS(LLControlVariable); +  	friend class LLControlGroup;  public: @@ -180,6 +182,8 @@ T convert_from_llsd(const LLSD& sd, eControlType type, const std::string& contro  //const U32 STRING_CACHE_SIZE = 10000;  class LLControlGroup : public LLInstanceTracker<LLControlGroup, std::string>  { +	LOG_CLASS(LLControlGroup); +  protected:  	typedef std::map<std::string, LLControlVariablePtr > ctrl_name_table_t;  	ctrl_name_table_t mNameTable; diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp index 3d4e6f9a0b..2ffb0d8503 100644 --- a/indra/llxml/llxmlnode.cpp +++ b/indra/llxml/llxmlnode.cpp @@ -801,7 +801,7 @@ bool LLXMLNode::parseStream(  	while(str.good())  	{  		str.read((char*)buffer, BUFSIZE); -		int count = str.gcount(); +		int count = (int)str.gcount();  		if (XML_Parse(my_parser, (const char *)buffer, count, !str.good()) != XML_STATUS_OK)  		{ diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index 999f754dcf..24328202cb 100644 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -705,7 +705,7 @@ private:  		// look up "Display Name" in meta data  		OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;  		QTMetaDataItem item = kQTMetaDataItemUninitialized; -		result = QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,  +		result = (OSErr)QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard,   										0, kQTMetaDataKeyFormatCommon,   										(const UInt8 *)&meta_data_key,   										sizeof( meta_data_key ), &item ); @@ -714,14 +714,14 @@ private:  		// find the size of the title  		ByteCount size; -		result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size ); +		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );  		if ( noErr != result || size <= 0 /*|| size > 1024  FIXME: arbitrary limit */ )   			return false;  		// allocate some space and grab it  		UInt8* item_data = new UInt8[ size + 1 ];  		memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) ); -		result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL ); +		result = (OSErr)QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );  		if ( noErr != result )   		{  			delete [] item_data; diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 47f8dcd545..1812abd7d5 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -991,7 +991,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  		{  			if(message_name == "set_volume")  			{ -				F32 volume = message_in.getValueReal("volume"); +				F32 volume = (F32)message_in.getValueReal("volume");  				setVolume(volume);  			}  		} @@ -1057,9 +1057,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  				S32 height = message_in.getValueS32("height");  				S32 texture_width = message_in.getValueS32("texture_width");  				S32 texture_height = message_in.getValueS32("texture_height"); -				mBackgroundR = message_in.getValueReal("background_r"); -				mBackgroundG = message_in.getValueReal("background_g"); -				mBackgroundB = message_in.getValueReal("background_b"); +				mBackgroundR = (F32)message_in.getValueReal("background_r"); +				mBackgroundG = (F32)message_in.getValueReal("background_g"); +				mBackgroundB = (F32)message_in.getValueReal("background_b");  //				mBackgroundA = message_in.setValueReal("background_a");		// Ignore any alpha  				if(!name.empty()) @@ -1245,9 +1245,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			if(message_name == "js_agent_location")  			{  #if LLQTWEBKIT_API_VERSION >= 9 -				F32 x = message_in.getValueReal("x"); -				F32 y = message_in.getValueReal("y"); -				F32 z = message_in.getValueReal("z"); +				F32 x = (F32)message_in.getValueReal("x"); +				F32 y = (F32)message_in.getValueReal("y"); +				F32 z = (F32)message_in.getValueReal("z");  				LLQtWebKit::getInstance()->setAgentLocation( x, y, z );  				LLQtWebKit::getInstance()->emitLocation();  #endif @@ -1256,9 +1256,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			if(message_name == "js_agent_global_location")  			{  #if LLQTWEBKIT_API_VERSION >= 9 -				F32 x = message_in.getValueReal("x"); -				F32 y = message_in.getValueReal("y"); -				F32 z = message_in.getValueReal("z"); +				F32 x = (F32)message_in.getValueReal("x"); +				F32 y = (F32)message_in.getValueReal("y"); +				F32 z = (F32)message_in.getValueReal("z");  				LLQtWebKit::getInstance()->setAgentGlobalLocation( x, y, z );  				LLQtWebKit::getInstance()->emitLocation();  #endif @@ -1267,7 +1267,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			if(message_name == "js_agent_orientation")  			{  #if LLQTWEBKIT_API_VERSION >= 9 -				F32 angle = message_in.getValueReal("angle"); +				F32 angle = (F32)message_in.getValueReal("angle");  				LLQtWebKit::getInstance()->setAgentOrientation( angle );  				LLQtWebKit::getInstance()->emitLocation();  #endif @@ -1323,7 +1323,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)  			else if(message_name == "set_page_zoom_factor")  			{  #if LLQTWEBKIT_API_VERSION >= 15 -				F32 factor = message_in.getValueReal("factor"); +				F32 factor = (F32)message_in.getValueReal("factor");  				LLQtWebKit::getInstance()->setPageZoomFactor(factor);  #else  				llwarns << "Ignoring setPageZoomFactor message (llqtwebkit version is too old)." << llendl; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 325c2a12a6..0593475c54 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -41,6 +41,7 @@ include(UnixInstall)  include(LLKDU)  include(ViewerMiscLibs)  include(LLLogin) +include(VisualLeakDetector)  include(GLOD)  include(CMakeCopyIfDifferent) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 62b8052a50..ee659ee39e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -621,6 +621,28 @@        <key>Value</key>        <string>http://lecs-viewer-web-components.s3.amazonaws.com/v3.0/[GRID_LOWERCASE]/avatars.html</string>      </map> +    <key>AvatarRotateThresholdSlow</key> +    <map> +      <key>Comment</key> +      <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving slowly (degrees)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>60</integer> +    </map>   +    <key>AvatarRotateThresholdFast</key> +    <map> +      <key>Comment</key> +      <string>Angle between avatar facing and camera facing at which avatar turns to face same direction as camera, when moving fast (degrees)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>        <key>AvatarBakedTextureUploadTimeout</key>      <map>        <key>Comment</key> @@ -1828,6 +1850,28 @@        <key>Value</key>        <integer>0</integer>      </map> +  <key>CurlMaximumNumberOfHandles</key> +  <map> +    <key>Comment</key> +    <string>Maximum number of handles curl can use (requires restart)</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>S32</string> +    <key>Value</key> +    <integer>256</integer> +  </map> +  <key>CurlRequestTimeOut</key> +  <map> +    <key>Comment</key> +    <string>Max idle time of a curl request before killed (requires restart)</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <real>120.0</real> +  </map>    <key>CurlUseMultipleThreads</key>    <map>      <key>Comment</key> @@ -9068,6 +9112,28 @@        <key>Value</key>        <integer>1</integer>      </map> +  <key>RenderAutoMuteByteLimit</key> +  <map> +    <key>Comment</key> +    <string>Maximum bytes of attachments before an avatar is automatically visually muted (0 for no limit).</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>RenderAutoMuteSurfaceAreaLimit</key> +  <map> +    <key>Comment</key> +    <string>Maximum surface area of attachments before an avatar is automatically visually muted (0 for no limit).</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>F32</string> +    <key>Value</key> +    <integer>0</integer> +  </map>      <key>RenderUseShaderLOD</key>      <map>        <key>Comment</key> @@ -9575,18 +9641,29 @@        <key>Value</key>        <integer>1</integer>      </map> -    <key>ShowConsoleWindow</key> -    <map> -      <key>Comment</key> -      <string>Show log in separate OS window</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>0</integer> -    </map> -    <key>NavBarShowCoordinates</key> +  <key>ShowConsoleWindow</key> +  <map> +    <key>Comment</key> +    <string>Show log in separate OS window</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>EnableVisualLeakDetector</key> +  <map> +    <key>Comment</key> +    <string>EnableVisualLeakDetector</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>NavBarShowCoordinates</key>      <map>        <key>Comment</key>        <string>Show coordinates in navigation bar</string> @@ -12722,7 +12799,7 @@      <key>WindowX</key>      <map>        <key>Comment</key> -      <string>X coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +      <string>X coordinate of upper left corner of SL viewer window, relative to upper left corner of primary display (pixels)</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> @@ -12733,7 +12810,7 @@      <key>WindowY</key>      <map>        <key>Comment</key> -      <string>Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +      <string>Y coordinate of upper left corner of SL viewer window, relative to upper left corner of primary display (pixels)</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl index 0170ad4b55..40b0cf47ac 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl @@ -61,17 +61,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -79,7 +79,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 93b1a114db..8c96d55342 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -70,17 +70,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -88,7 +88,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 @@ -123,7 +123,6 @@ void main()  	col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z);  	vary_pointlight_col = col.rgb*diffuse_color.rgb; -  	col.rgb = vec3(0,0,0);  	// Add windlight lights diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl index d7b90978ba..c0edddc40a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl @@ -65,17 +65,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -83,7 +83,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl index 5a3955ef00..83815b1786 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl @@ -63,21 +63,21 @@ uniform vec3 light_diffuse[8];  float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)  { -	//get light vector +//get light vector  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -85,7 +85,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 9540ddd2e8..1660f9687e 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -69,17 +69,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -87,7 +87,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl index 9c7a332417..84c27edb26 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl @@ -66,17 +66,17 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  	vec3 lv = lp.xyz-v;  	//get distance -	float d = length(lv); +	float d = dot(lv,lv);  	float da = 0.0;  	if (d > 0.0 && la > 0.0 && fa > 0.0)  	{  		//normalize light vector -		lv *= 1.0/d; +		lv = normalize(lv);  		//distance attenuation -		float dist2 = d*d/(la*la); +		float dist2 = d/la;  		da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);  		// spotlight coefficient. @@ -84,7 +84,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= spot*spot; // GL_SPOT_EXPONENT=2  		//angular attenuation -		da *= calcDirectionalLight(n, lv); +		da *= max(dot(n, lv), 0.0);		  	}  	return da;	 diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 54ad3cd187..ab9b5ff436 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3314,6 +3314,7 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *  	}  	llinfos << "Received cached texture response for " << num_results << " textures." << llendl; +	gAgentAvatarp->outputRezTiming("Fetched agent wearables textures from cache. Will now load them");  	gAgentAvatarp->updateMeshTextures(); diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index dd7e509e8d..dd02a74a38 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -185,6 +185,7 @@ void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)  {   	if (avatar)  	{ +		avatar->outputRezTiming("Sending wearables request");  		sendAgentWearablesRequest();  	}  } @@ -818,7 +819,7 @@ void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index)  		mWearableDatas[type].erase(mWearableDatas[type].begin() + index);  		if (isAgentAvatarValid())  		{ -			gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE); +		gAgentAvatarp->wearableUpdated(wearable->getType(), TRUE);  		}  		wearable->setLabelUpdated();  	} @@ -952,6 +953,11 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  	if (mInitialWearablesUpdateReceived)  		return; +	if (isAgentAvatarValid()) +	{ +		gAgentAvatarp->outputRezTiming("Received initial wearables update"); +	} +  	// notify subscribers that wearables started loading. See EXT-7777  	// *TODO: find more proper place to not be called from deprecated method.  	// Seems such place is found: LLInitialWearablesFetch::processContents() @@ -1622,6 +1628,11 @@ void LLAgentWearables::queryWearableCache()  	//VWR-22113: gAgent.getRegion() can return null if invalid, seen here on logout  	if(gAgent.getRegion())  	{ +		if (isAgentAvatarValid()) +		{ +			gAgentAvatarp->outputRezTiming("Fetching textures from cache"); +		} +  		llinfos << "Requesting texture cache entry for " << num_queries << " baked textures" << llendl;  		gMessageSystem->sendReliable(gAgent.getRegion()->getHost());  		gAgentQueryManager.mNumPendingQueries++; diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 1edc96e165..8cba54347e 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -87,6 +87,10 @@ public:  LLInitialWearablesFetch::LLInitialWearablesFetch(const LLUUID& cof_id) :  	LLInventoryFetchDescendentsObserver(cof_id)  { +	if (isAgentAvatarValid()) +	{ +		gAgentAvatarp->outputRezTiming("Initial wearables fetch started"); +	}  }  LLInitialWearablesFetch::~LLInitialWearablesFetch() @@ -101,6 +105,10 @@ void LLInitialWearablesFetch::done()  	// idle tick instead.  	gInventory.removeObserver(this);  	doOnIdleOneTime(boost::bind(&LLInitialWearablesFetch::processContents,this)); +	if (isAgentAvatarValid()) +	{ +		gAgentAvatarp->outputRezTiming("Initial wearables fetch done"); +	}  }  void LLInitialWearablesFetch::add(InitialWearableData &data) @@ -111,6 +119,12 @@ void LLInitialWearablesFetch::add(InitialWearableData &data)  void LLInitialWearablesFetch::processContents()  { +	if(!gAgentAvatarp) //no need to process wearables if the agent avatar is deleted. +	{ +		delete this; +		return ; +	} +  	// Fetch the wearable items from the Current Outfit Folder  	LLInventoryModel::cat_array_t cat_array;  	LLInventoryModel::item_array_t wearable_array; diff --git a/indra/newview/llagentwearablesfetch.h b/indra/newview/llagentwearablesfetch.h index 7dafab4a33..bedc445c0e 100644 --- a/indra/newview/llagentwearablesfetch.h +++ b/indra/newview/llagentwearablesfetch.h @@ -40,6 +40,8 @@  //--------------------------------------------------------------------  class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver  { +	LOG_CLASS(LLInitialWearablesFetch); +  public:  	LLInitialWearablesFetch(const LLUUID& cof_id);  	~LLInitialWearablesFetch(); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 663257042e..33f5373d7e 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -268,6 +268,8 @@ struct LLFoundData  class LLWearableHoldingPattern  { +	LOG_CLASS(LLWearableHoldingPattern); +  public:  	LLWearableHoldingPattern();  	~LLWearableHoldingPattern(); @@ -436,6 +438,11 @@ void LLWearableHoldingPattern::checkMissingWearables()  void LLWearableHoldingPattern::onAllComplete()  { +	if (isAgentAvatarValid()) +	{ +		gAgentAvatarp->outputRezTiming("Agent wearables fetch complete"); +	} +  	if (!isMostRecent())  	{  		llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl; @@ -2363,6 +2370,8 @@ void LLAppearanceMgr::autopopulateOutfits()  // Handler for anything that's deferred until avatar de-clouds.  void LLAppearanceMgr::onFirstFullyVisible()  { +	gAgentAvatarp->outputRezTiming("Avatar fully loaded"); +	gAgentAvatarp->reportAvatarRezTime();  	gAgentAvatarp->debugAvatarVisible();  	// The auto-populate is failing at the point of generating outfits diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index a455d359bf..49fbdbf1df 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -722,7 +722,9 @@ bool LLAppViewer::init()      // *NOTE:Mani - LLCurl::initClass is not thread safe.       // Called before threads are created. -    LLCurl::initClass(gSavedSettings.getBOOL("CurlUseMultipleThreads")); +    LLCurl::initClass(gSavedSettings.getF32("CurlRequestTimeOut"),  +						gSavedSettings.getS32("CurlMaximumNumberOfHandles"),  +						gSavedSettings.getBOOL("CurlUseMultipleThreads"));  	LL_INFOS("InitInfo") << "LLCurl initialized." << LL_ENDL ;      LLMachineID::init(); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 647ace7ee3..bad60a9757 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -26,11 +26,16 @@  #include "llviewerprecompiledheaders.h" +#ifdef INCLUDE_VLD +#include "vld.h" +#endif +  #include "llappviewerwin32.h"  #include "llmemtype.h" -#include "llwindowwin32.cpp" // *FIX: for setting gIconResource. +#include "llwindowwin32.h" // *FIX: for setting gIconResource. +#include "llgl.h"  #include "res/resource.h" // *FIX: for setting gIconResource.  #include <fcntl.h>		//_O_APPEND @@ -104,6 +109,14 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,                       LPSTR     lpCmdLine,                       int       nCmdShow)  { +#ifdef INCLUDE_VLD +	// only works for debug builds (hard coded into vld.h) +	#ifdef _DEBUG +		// start with Visual Leak Detector turned off +		VLDGlobalDisable(); +	#endif // _DEBUG +#endif // INCLUDE_VLD +  	LLMemType mt1(LLMemType::MTYPE_STARTUP);  	const S32 MAX_HEAPS = 255; diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 9a7cdcfa21..f618af9536 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -738,6 +738,11 @@ void LLAvatarActions::shareWithAvatars()  	LLFloaterAvatarPicker* picker =  		LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE); +	if (!picker) +	{ +		return; +	} +  	picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable));  	picker->openFriendsTab();  	LLNotificationsUtil::add("ShareNotification"); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index debac9dcbf..21b21c152a 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -1077,6 +1077,7 @@ BOOL LLDrawable::isVisible() const  LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask)  : LLSpatialPartition(data_mask, render_by_group, GL_STREAM_DRAW_ARB)  { +	mBridge = this;  	mDrawable = root;  	root->setSpatialBridge(this); @@ -1105,6 +1106,15 @@ LLSpatialBridge::~LLSpatialBridge()  	{  		group->mSpatialPartition->remove(this, group);  	} + +	//delete octree here so listeners will still be able to access bridge specific state +	destroyTree(); +} + +void LLSpatialBridge::destroyTree() +{ +	delete mOctree; +	mOctree = NULL;  }  void LLSpatialBridge::updateSpatialExtents() diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 55b314fbb1..b002c11af5 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1285,7 +1285,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  		face->setGeomIndex(0);  		face->setIndicesIndex(0); -		if (buffer.isNull() || buffer->getTypeMask() != data_mask) +		if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())  		{ //make a new buffer  			if (sShaderLevel > 0)  			{ @@ -1319,7 +1319,9 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*  		LLMatrix3 mat_normal(mat3);				  		//let getGeometryVolume know if alpha should override shiny -		if (face->getFaceColor().mV[3] < 1.f) +		U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture()); + +		if (type == LLDrawPool::POOL_ALPHA)  		{  			face->setPoolType(LLDrawPool::POOL_ALPHA);  		} diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index 2abfbf37ca..935dcb74b0 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -55,7 +55,7 @@ public:  		else  		{  			width = mEditor.getDocumentView()->getRect().getWidth() - mEditor.getHPad();  -			height = llceil(mStyle->getFont()->getLineHeight()); +			height = mStyle->getFont()->getLineHeight();  		}  		return true;  	} diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 6dbeae6677..cd33a19a2a 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -693,6 +693,49 @@ static void xform(LLVector2 &tex_coord, F32 cosAng, F32 sinAng, F32 offS, F32 of  	tex_coord.mV[1] = t;  } +// Transform the texture coordinates for this face. +static void xform4a(LLVector4a &tex_coord, const LLVector4a& trans, const LLVector4Logical& mask, const LLVector4a& rot0, const LLVector4a& rot1, const LLVector4a& offset, const LLVector4a& scale)  +{ +	//tex coord is two coords, <s0, t0, s1, t1> +	LLVector4a st; + +	// Texture transforms are done about the center of the face. +	st.setAdd(tex_coord, trans); +	 +	// Handle rotation +	LLVector4a rot_st; +		 +	// <s0 * cosAng, s0*-sinAng, s1*cosAng, s1*-sinAng> +	LLVector4a s0; +	s0.splat(st, 0); +	LLVector4a s1; +	s1.splat(st, 2); +	LLVector4a ss; +	ss.setSelectWithMask(mask, s1, s0); + +	LLVector4a a;  +	a.setMul(rot0, ss); +	 +	// <t0*sinAng, t0*cosAng, t1*sinAng, t1*cosAng> +	LLVector4a t0; +	t0.splat(st, 1); +	LLVector4a t1; +	t1.splat(st, 3); +	LLVector4a tt; +	tt.setSelectWithMask(mask, t1, t0); + +	LLVector4a b; +	b.setMul(rot1, tt); +		 +	st.setAdd(a,b); + +	// Then scale +	st.mul(scale); + +	// Then offset +	tex_coord.setAdd(st, offset); +} +  bool less_than_max_mag(const LLVector4a& vec)  { @@ -1060,6 +1103,16 @@ static LLFastTimer::DeclareTimer FTM_FACE_GEOM_EMISSIVE("Emissive");  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights");  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal");  static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX_TAIL("Tail"); +static LLFastTimer::DeclareTimer FTM_FACE_POSITION_STORE("Pos"); +static LLFastTimer::DeclareTimer FTM_FACE_TEXTURE_INDEX_STORE("TexIdx"); +static LLFastTimer::DeclareTimer FTM_FACE_POSITION_PAD("Pad"); +static LLFastTimer::DeclareTimer FTM_FACE_TEX_DEFAULT("Default"); +static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK("Quick"); +static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_NO_XFORM("No Xform"); +static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_XFORM("Xform"); + +static LLFastTimer::DeclareTimer FTM_FACE_TEX_QUICK_PLANAR("Quick Planar");  BOOL LLFace::getGeometryVolume(const LLVolume& volume,  							   const S32 &f, @@ -1078,7 +1131,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		updateRebuildFlags();  	} -	bool map_range = gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange; + +	//don't use map range (generates many redundant unmap calls) +	bool map_range = false; //gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange;  	if (mVertexBuffer.notNull())  	{ @@ -1104,16 +1159,12 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	}  	LLStrider<LLVector3> vert; -	LLVector4a* vertices = NULL;  	LLStrider<LLVector2> tex_coords;  	LLStrider<LLVector2> tex_coords2; -	LLVector4a* normals = NULL;  	LLStrider<LLVector3> norm;  	LLStrider<LLColor4U> colors; -	LLVector4a* binormals = NULL;  	LLStrider<LLVector3> binorm;  	LLStrider<U16> indicesp; -	LLVector4a* weights = NULL;  	LLStrider<LLVector4> wght;  	BOOL full_rebuild = force_rebuild || mDrawablep->isState(LLDrawable::REBUILD_VOLUME); @@ -1202,7 +1253,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		LLFastTimer t(FTM_FACE_GEOM_INDEX);  		mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range); -		__m128i* dst = (__m128i*) indicesp.get(); +		volatile __m128i* dst = (__m128i*) indicesp.get();  		__m128i* src = (__m128i*) vf.mIndices;  		__m128i offset = _mm_set1_epi16(index_offset); @@ -1211,12 +1262,17 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		for (S32 i = 0; i < end; i++)  		{  			__m128i res = _mm_add_epi16(src[i], offset); -			_mm_storeu_si128(dst+i, res); +			_mm_storeu_si128((__m128i*) dst++, res);  		} -		for (S32 i = end*8; i < num_indices; ++i)  		{ -			indicesp[i] = vf.mIndices[i]+index_offset; +			LLFastTimer t(FTM_FACE_GEOM_INDEX_TAIL); +			U16* idx = (U16*) dst; + +			for (S32 i = end*8; i < num_indices; ++i) +			{ +				*idx++ = vf.mIndices[i]+index_offset; +			}  		}  		if (map_range) @@ -1373,19 +1429,48 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			if (texgen != LLTextureEntry::TEX_GEN_PLANAR)  			{ +				LLFastTimer t(FTM_FACE_TEX_QUICK);  				if (!do_tex_mat)  				{  					if (!do_xform)  					{ +						LLFastTimer t(FTM_FACE_TEX_QUICK_NO_XFORM);  						LLVector4a::memcpyNonAliased16((F32*) tex_coords.get(), (F32*) vf.mTexCoords, num_vertices*2*sizeof(F32));  					}  					else  					{ -						for (S32 i = 0; i < num_vertices; i++) +						LLFastTimer t(FTM_FACE_TEX_QUICK_XFORM); +						F32* dst = (F32*) tex_coords.get(); +						LLVector4a* src = (LLVector4a*) vf.mTexCoords; + +						LLVector4a trans; +						trans.splat(-0.5f); + +						LLVector4a rot0; +						rot0.set(cos_ang, -sin_ang, cos_ang, -sin_ang); + +						LLVector4a rot1; +						rot1.set(sin_ang, cos_ang, sin_ang, cos_ang); + +						LLVector4a scale; +						scale.set(ms, mt, ms, mt); + +						LLVector4a offset; +						offset.set(os+0.5f, ot+0.5f, os+0.5f, ot+0.5f); + +						LLVector4Logical mask; +						mask.clear(); +						mask.setElement<2>(); +						mask.setElement<3>(); + +						U32 count = num_vertices/2 + num_vertices%2; + +						for (S32 i = 0; i < count; i++)  						{	 -							LLVector2 tc(vf.mTexCoords[i]); -							xform(tc, cos_ang, sin_ang, os, ot, ms, mt); -							*tex_coords++ = tc;	 +							LLVector4a res = *src++; +							xform4a(res, trans, mask, rot0, rot1, offset, scale); +							res.store4a(dst); +							dst += 4;  						}  					}  				} @@ -1407,6 +1492,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			}  			else  			{ //no bump, no atlas, tex gen planar +				LLFastTimer t(FTM_FACE_TEX_QUICK_PLANAR);  				if (do_tex_mat)  				{  					for (S32 i = 0; i < num_vertices; i++) @@ -1451,6 +1537,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		}  		else  		{ //either bump mapped or in atlas, just do the whole expensive loop +			LLFastTimer t(FTM_FACE_TEX_DEFAULT);  			mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);  			std::vector<LLVector2> bump_tc; @@ -1642,44 +1729,55 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		llassert(num_vertices > 0);  		mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range); -		vertices = (LLVector4a*) vert.get(); -	 +			 +  		LLMatrix4a mat_vert;  		mat_vert.loadu(mat_vert_in);  		LLVector4a* src = vf.mPositions; -		LLVector4a* dst = vertices; +		volatile F32* dst = (volatile F32*) vert.get(); -		LLVector4a* end = dst+num_vertices; -		do -		{	 -			mat_vert.affineTransform(*src++, *dst++); -		} -		while(dst < end); +		volatile F32* end = dst+num_vertices*4; +		LLVector4a res; -		F32 index = (F32) (mTextureIndex < 255 ? mTextureIndex : 0); +		LLVector4a texIdx; +		F32 index = (F32) (mTextureIndex < 255 ? mTextureIndex : 0);  		llassert(index <= LLGLSLShader::sIndexedTextureChannels-1); -		F32 *index_dst = (F32*) vertices; -		F32 *index_end = (F32*) end; -		index_dst += 3; -		index_end += 3; -		do +		LLVector4Logical mask; +		mask.clear(); +		mask.setElement<3>(); +		 +		texIdx.set(0,0,0,index); +  		{ -			*index_dst = index; -			index_dst += 4; +			LLFastTimer t(FTM_FACE_POSITION_STORE); +			LLVector4a tmp; + +			do +			{	 +				mat_vert.affineTransform(*src++, res); +				tmp.setSelectWithMask(mask, texIdx, res); +				tmp.store4a((F32*) dst); +				dst += 4; +			} +			while(dst < end);  		} -		while (index_dst < index_end); -		 -		S32 aligned_pad_vertices = mGeomCount - num_vertices; -		LLVector4a* last_vec = end - 1; -		while (aligned_pad_vertices > 0) +  		{ -			--aligned_pad_vertices; -			*dst++ = *last_vec; +			LLFastTimer t(FTM_FACE_POSITION_PAD); +			S32 aligned_pad_vertices = mGeomCount - num_vertices; +			res.set(res[0], res[1], res[2], 0.f); + +			while (aligned_pad_vertices > 0) +			{ +				--aligned_pad_vertices; +				res.store4a((F32*) dst); +				dst += 4; +			}  		} -		 +  		if (map_range)  		{  			mVertexBuffer->flush(); @@ -1690,14 +1788,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	{  		LLFastTimer t(FTM_FACE_GEOM_NORMAL);  		mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range); -		normals = (LLVector4a*) norm.get(); +		F32* normals = (F32*) norm.get();  		for (S32 i = 0; i < num_vertices; i++)  		{	  			LLVector4a normal;  			mat_normal.rotate(vf.mNormals[i], normal);  			normal.normalize3fast(); -			normals[i] = normal; +			normal.store4a(normals); +			normals += 4;  		}  		if (map_range) @@ -1710,14 +1809,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	{  		LLFastTimer t(FTM_FACE_GEOM_BINORMAL);  		mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range); -		binormals = (LLVector4a*) binorm.get(); +		F32* binormals = (F32*) binorm.get();  		for (S32 i = 0; i < num_vertices; i++)  		{	  			LLVector4a binormal;  			mat_normal.rotate(vf.mBinormals[i], binormal);  			binormal.normalize3fast(); -			binormals[i] = binormal; +			binormal.store4a(binormals); +			binormals += 4;  		}  		if (map_range) @@ -1730,8 +1830,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	{  		LLFastTimer t(FTM_FACE_GEOM_WEIGHTS);  		mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range); -		weights = (LLVector4a*) wght.get(); -		LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32)); +		F32* weights = (F32*) wght.get(); +		LLVector4a::memcpyNonAliased16(weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32));  		if (map_range)  		{  			mVertexBuffer->flush(); @@ -1750,7 +1850,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		src.loadua((F32*) vec); -		LLVector4a* dst = (LLVector4a*) colors.get(); +		F32* dst = (F32*) colors.get();  		S32 num_vecs = num_vertices/4;  		if (num_vertices%4 > 0)  		{ @@ -1759,7 +1859,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		for (S32 i = 0; i < num_vecs; i++)  		{	 -			dst[i] = src; +			src.store4a(dst); +			dst += 4;  		}  		if (map_range) @@ -1789,7 +1890,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		src.loadua((F32*) vec); -		LLVector4a* dst = (LLVector4a*) emissive.get(); +		F32* dst = (F32*) emissive.get();  		S32 num_vecs = num_vertices/4;  		if (num_vertices%4 > 0)  		{ @@ -1798,7 +1899,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		for (S32 i = 0; i < num_vecs; i++)  		{	 -			dst[i] = src; +			src.store4a(dst); +			dst += 4;  		}  		if (map_range) @@ -1821,6 +1923,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  		mTexExtents[1][1] *= et ;  	} +  	mLastVertexBuffer = mVertexBuffer;  	mLastGeomCount = mGeomCount;  	mLastGeomIndex = mGeomIndex; diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 233038daba..9664aa7dbe 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -149,7 +149,7 @@ BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask)  LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)  { -	S32 idx = (getRect().getHeight() - y) / ((S32) LLFontGL::getFontMonospace()->getLineHeight()+2) - 5; +	S32 idx = (getRect().getHeight() - y) / (LLFontGL::getFontMonospace()->getLineHeight()+2) - 5;  	if (idx >= 0 && idx < (S32)ft_display_idx.size())  	{ @@ -552,7 +552,7 @@ void LLFastTimerView::draw()  	// update rectangle that includes timer bars  	mBarRect.mLeft = xleft;  	mBarRect.mRight = getRect().getWidth(); -	mBarRect.mTop = ytop - ((S32)LLFontGL::getFontMonospace()->getLineHeight() + 4); +	mBarRect.mTop = ytop - (LLFontGL::getFontMonospace()->getLineHeight() + 4);  	mBarRect.mBottom = margin + LINE_GRAPH_HEIGHT;  	y = ytop; @@ -846,7 +846,7 @@ void LLFastTimerView::draw()  				tdesc = llformat("%4.2f ms", ms);  			x = mGraphRect.mRight - LLFontGL::getFontMonospace()->getWidth(tdesc)-5; -			y = mGraphRect.mTop - ((S32)LLFontGL::getFontMonospace()->getLineHeight()); +			y = mGraphRect.mTop - LLFontGL::getFontMonospace()->getLineHeight();  			LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white,  										 LLFontGL::LEFT, LLFontGL::TOP); diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h index f1ffb6547f..b7854c5697 100644 --- a/indra/newview/llfloateranimpreview.h +++ b/indra/newview/llfloateranimpreview.h @@ -32,6 +32,7 @@  #include "lldynamictexture.h"  #include "llcharacter.h"  #include "llquaternion.h" +#include "llextendedstatus.h"  class LLVOAvatar;  class LLViewerJointMesh; diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index aa66fcf9b8..0290e7cdf0 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -63,6 +63,11 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback,  	// *TODO: Use a key to allow this not to be an effective singleton  	LLFloaterAvatarPicker* floater =   		LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); +	if (!floater) +	{ +		llwarns << "Cannot instantiate avatar picker" << llendl; +		return NULL; +	}  	floater->mSelectionCallback = callback;  	floater->setAllowMultiple(allow_multiple); diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index ee8487b160..087b0007e1 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -239,8 +239,9 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,  		// Compute icon for this item  		BOOL item_is_multi = FALSE; -		if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED  +		if (( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED  			|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) +			&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))  		{  			item_is_multi = TRUE;  		} diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index a7388d21a3..bca4b5e447 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -210,7 +210,9 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		LLSD row;  		BOOL item_is_multi = FALSE; -		if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED ) +		if ((inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED +			|| inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) +			&& !(inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK))  		{  			item_is_multi = TRUE;  		} diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index d449c4ff1b..7791d4688b 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -90,6 +90,12 @@ public:  		if(mFloater)  		{  			mFloater->addGesture(inv_item,NULL,mFloater->getChild<LLScrollListCtrl>("gesture_list")); + +			// EXP-1909 (Pasted gesture displayed twice) +			// The problem is that addGesture is called here for the second time for the same item (which is copied) +			// First time addGesture is called from LLFloaterGestureObserver::changed(), which is a callback for inventory +			// change. So we need to refresh the gesture list to avoid duplicates. +			mFloater->refreshAll();  		}  	}  }; diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index a34e0353ec..fb905eae11 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -1123,8 +1123,12 @@ bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const  void LLPanelObjectTools::onClickSet()  { +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2));  	// grandparent is a floater, which can have a dependent -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelObjectTools::callbackAvatarID, this, _1,_2))); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  void LLPanelObjectTools::onClickSetBySelection(void* data) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index d8e4aa03f7..ee18c95b34 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2474,27 +2474,6 @@ void LLPanelLandAccess::refresh()  				mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix);  			}  		} -		 -		LLCheckBoxWithTBAcess* maturity_checkbox = (LLCheckBoxWithTBAcess*) getChild<LLCheckBoxCtrl>( "public_access"); -		LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion(); -		if(region) -		{ -			LLTextBox* maturity_textbox = maturity_checkbox->getTextBox(); -			insert_maturity_into_textbox(maturity_textbox, gFloaterView->getParentFloater(this), getString("allow_public_access")); -			maturity_checkbox->reshape(maturity_checkbox->getRect().getWidth(), maturity_checkbox->getRect().getHeight(), FALSE); -		} -		else -		{ -			std::string maturity_string = getString("allow_public_access"); -			size_t maturity_pos = maturity_string.find(MATURITY); - -			if (maturity_pos != std::string::npos) -			{ -				maturity_string.replace(maturity_pos, MATURITY.length(), std::string("")); -			} - -			maturity_checkbox->setLabel(maturity_string); -		}  		if(parcel->getRegionDenyAnonymousOverride())  		{ @@ -2760,7 +2739,12 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)  void LLPanelLandAccess::onClickAddAccess()  { -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)) ); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( +		boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids) @@ -2804,7 +2788,12 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data)  // static  void LLPanelLandAccess::onClickAddBanned()  { -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1))); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( +		boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1)); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  // static diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 64bdcccd9f..9122e5a8f5 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -3969,7 +3969,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  				U32 num_indices = mVertexBuffer[5][mdl][i]->getNumIndices();  				if (num_indices > 2)  				{ -					glodInsertElements(mObject[mdl], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, mVertexBuffer[5][mdl][i]->getIndicesPointer(), 0, 0.f); +					glodInsertElements(mObject[mdl], i, GL_TRIANGLES, num_indices, GL_UNSIGNED_SHORT, (U8*) mVertexBuffer[5][mdl][i]->getIndicesPointer(), 0, 0.f);  				}  				tri_count += num_indices/3;  				stop_gloderror(); @@ -4083,14 +4083,14 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  				{  					buff->allocateBuffer(sizes[i*2+1], sizes[i*2], true);  					buff->setBuffer(type_mask); -					glodFillElements(mObject[base], names[i], GL_UNSIGNED_SHORT, buff->getIndicesPointer()); +					glodFillElements(mObject[base], names[i], GL_UNSIGNED_SHORT, (U8*) buff->getIndicesPointer());  					stop_gloderror();  				}  				else  				{ //this face was eliminated, create a dummy triangle (one vertex, 3 indices, all 0)  					buff->allocateBuffer(1, 3, true); -					memset(buff->getMappedData(), 0, buff->getSize()); -					memset(buff->getIndicesPointer(), 0, buff->getIndicesSize()); +					memset((U8*) buff->getMappedData(), 0, buff->getSize()); +					memset((U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize());  				}  				buff->validateRange(0, buff->getNumVerts()-1, buff->getNumIndices(), 0); @@ -4880,8 +4880,8 @@ void LLModelPreview::addEmptyFace( LLModel* pTarget )  	LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(type_mask, 0);  	buff->allocateBuffer(1, 3, true); -	memset( buff->getMappedData(), 0, buff->getSize() ); -	memset( buff->getIndicesPointer(), 0, buff->getIndicesSize() ); +	memset( (U8*) buff->getMappedData(), 0, buff->getSize() ); +	memset( (U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize() );  	buff->validateRange( 0, buff->getNumVerts()-1, buff->getNumIndices(), 0 ); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index a333989e7e..173b0e538c 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -741,7 +741,8 @@ void LLFloaterPreference::onClose(bool app_quitting)  void LLFloaterPreference::onOpenHardwareSettings()  { -	LLFloaterReg::showInstance("prefs_hardware_settings"); +	LLFloater* floater = LLFloaterReg::showInstance("prefs_hardware_settings"); +	addDependentFloater(floater, FALSE);  }  // static   void LLFloaterPreference::onBtnOK() @@ -1800,7 +1801,46 @@ void LLPanelPreference::updateMediaAutoPlayCheckbox(LLUICtrl* ctrl)  	}  } +class LLPanelPreferencePrivacy : public LLPanelPreference +{ +public: +	LLPanelPreferencePrivacy() +	{ +		mAccountIndependentSettings.push_back("VoiceCallsFriendsOnly"); +		mAccountIndependentSettings.push_back("AutoDisengageMic"); +	} + +	/*virtual*/ void saveSettings() +	{ +		LLPanelPreference::saveSettings(); + +		// Don't save (=erase from the saved values map) per-account privacy settings +		// if we're not logged in, otherwise they will be reset to defaults on log off. +		if (LLStartUp::getStartupState() != STATE_STARTED) +		{ +			// Erase only common settings, assuming there are no color settings on Privacy page. +			for (control_values_map_t::iterator it = mSavedValues.begin(); it != mSavedValues.end(); ) +			{ +				const std::string setting = it->first->getName(); +				if (std::find(mAccountIndependentSettings.begin(), +					mAccountIndependentSettings.end(), setting) == mAccountIndependentSettings.end()) +				{ +					mSavedValues.erase(it++); +				} +				else +				{ +					++it; +				} +			} +		} +	} + +private: +	std::list<std::string> mAccountIndependentSettings; +}; +  static LLRegisterPanelClassWrapper<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); +static LLRegisterPanelClassWrapper<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy");  BOOL LLPanelPreferenceGraphics::postBuild()  { diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 7ee3294478..ec5994e917 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -198,15 +198,17 @@ public:  	virtual void saveSettings();  	class Updater; + +protected: +	typedef std::map<LLControlVariable*, LLSD> control_values_map_t; +	control_values_map_t mSavedValues; +  private:  	//for "Only friends and groups can call or IM me"  	static void showFriendsOnlyWarning(LLUICtrl*, const LLSD&);  	//for "Show my Favorite Landmarks at Login"  	static void showFavoritesOnLoginWarning(LLUICtrl* checkbox, const LLSD& value); -	typedef std::map<LLControlVariable*, LLSD> control_values_map_t; -	control_values_map_t mSavedValues; -  	typedef std::map<std::string, LLColor4> string_color_map_t;  	string_color_map_t mSavedColors; diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 676059779c..17850ff35d 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -650,7 +650,10 @@ void LLPanelRegionGeneralInfo::onClickKick()  	// in order to set up floater dependency  	LLFloater* parent_floater = gFloaterView->getParentFloater(this);  	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1), FALSE, TRUE); -	parent_floater->addDependentFloater(child_floater); +	if (child_floater) +	{ +		parent_floater->addDependentFloater(child_floater); +	}  }  void LLPanelRegionGeneralInfo::onKickCommit(const uuid_vec_t& ids) @@ -1470,7 +1473,10 @@ void LLPanelEstateInfo::onClickKickUser()  	// in order to set up floater dependency  	LLFloater* parent_floater = gFloaterView->getParentFloater(this);  	LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1), FALSE, TRUE); -	parent_floater->addDependentFloater(child_floater); +	if (child_floater) +	{ +		parent_floater->addDependentFloater(child_floater); +	}  }  void LLPanelEstateInfo::onKickUserCommit(const uuid_vec_t& ids) @@ -1891,6 +1897,26 @@ void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_  	gAgent.sendReliableMessage();  } +// static +void LLPanelEstateInfo::updateEstateOwnerName(const std::string& name) +{ +	LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); +	if (panelp) +	{ +		panelp->setOwnerName(name); +	} +} + +// static +void LLPanelEstateInfo::updateEstateName(const std::string& name) +{ +	LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); +	if (panelp) +	{ +		panelp->getChildRef<LLTextBox>("estate_name").setText(name); +	} +} +  void LLPanelEstateInfo::updateControls(LLViewerRegion* region)  {  	BOOL god = gAgent.isGodlike(); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index c402de66e8..e36ef4604b 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -33,6 +33,7 @@  #include "llfloater.h"  #include "llhost.h"  #include "llpanel.h" +#include "llextendedstatus.h"  #include "llenvmanager.h" // for LLEnvironmentSettings @@ -293,6 +294,9 @@ public:  	void updateControls(LLViewerRegion* region); +	static void updateEstateName(const std::string& name); +	static void updateEstateOwnerName(const std::string& name); +  	virtual bool refreshFromRegion(LLViewerRegion* region);  	virtual bool estateUpdate(LLMessageSystem* msg); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index c08848b1ea..3ec1e372eb 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -285,7 +285,11 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)  void LLFloaterReporter::onClickSelectAbuser()  { -	gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE )); +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE ); +	if (picker) +	{ +		gFloaterView->getParentFloater(this)->addDependentFloater(picker); +	}  }  void LLFloaterReporter::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index cd98f7be57..7d68431710 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -31,6 +31,7 @@  #include "llfloater.h"  #include "lluuid.h"  #include "v3math.h" +#include "llextendedstatus.h"  class LLAvatarName;  class LLMessageSystem; diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 3434841d09..64c0dfa023 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -392,8 +392,12 @@ void LLFloaterSellLandUI::onChangeValue(LLUICtrl *ctrl, void *userdata)  void LLFloaterSellLandUI::doSelectAgent()  { +	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE);  	// grandparent is a floater, in order to set up dependency -	addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE)); +	if (picker) +	{ +		addDependentFloater(picker); +	}  }  void LLFloaterSellLandUI::callbackAvatarPick(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index be7a53491d..5385977d95 100644 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -59,7 +59,10 @@ LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_na  	LLView* view = findChildView(panel_name, true);  	if (!view) return NULL; -	openFloater(); +	if (!getVisible()) +	{ +		openFloater(); +	}  	LLPanel* panel = NULL; diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 5c8f5a5cc1..6978e6a430 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1192,8 +1192,6 @@ void LLFloaterTools::updateLandImpacts()  void LLFloaterTools::getMediaState()  { -	if (!LLFloaterMediaSettings::instanceExists()) return; -  	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();  	LLViewerObject* first_object = selected_objects->getFirstObject();  	LLTextBox* media_info = getChild<LLTextBox>("media_info"); diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp index 030fed0575..227720bee3 100644 --- a/indra/newview/llfloatervoiceeffect.cpp +++ b/indra/newview/llfloatervoiceeffect.cpp @@ -145,7 +145,9 @@ void LLFloaterVoiceEffect::refreshEffectList()  		for (voice_effect_list_t::const_iterator it = template_list.begin(); it != template_list.end(); ++it)  		{  			const LLUUID& effect_id = it->second; -			std::string effect_name = getString("effect_" + it->first); // will throw an error if the effect is not listed in the XML + +			std::string localized_effect = "effect_" + it->first; +			std::string effect_name = hasString(localized_effect) ? getString(localized_effect) : it->first;  // XML contains localized effects names  			LLSD effect_properties = effect_interface->getVoiceEffectProperties(effect_id); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 52cc70aee7..c0db2e366c 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -255,7 +255,7 @@ LLFolderView::LLFolderView(const Params& p)  	LLRect new_r = LLRect(rect.mLeft + ICON_PAD,  			      rect.mTop - TEXT_PAD,  			      rect.mRight, -			      rect.mTop - TEXT_PAD - llfloor(font->getLineHeight())); +			      rect.mTop - TEXT_PAD - font->getLineHeight());  	text_p.rect(new_r);  	text_p.name(std::string(p.name));  	text_p.font(font); @@ -414,7 +414,7 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen  		getRoot()->getFilter()->getShowFolderState();  	S32 total_width = LEFT_PAD; -	S32 running_height = mDebugFilters ? llceil(LLFontGL::getFontMonospace()->getLineHeight()) : 0; +	S32 running_height = mDebugFilters ? LLFontGL::getFontMonospace()->getLineHeight() : 0;  	S32 target_height = running_height;  	S32 parent_item_height = getRect().getHeight(); @@ -912,7 +912,7 @@ void LLFolderView::draw()  	}  	else if (mShowEmptyMessage)  	{ -		if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration()) +		if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())  		{  			mStatusText = LLTrans::getString("Searching");  		} @@ -1996,7 +1996,7 @@ void LLFolderView::scrollToShowSelection()  	// However we allow scrolling for folder views with mAutoSelectOverride  	// (used in Places SP) as an exception because the selection in them  	// is not reset during items filtering. See STORM-133. -	if ( (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mAutoSelectOverride) +	if ( (!LLInventoryModelBackgroundFetch::instance().folderFetchActive() || mAutoSelectOverride)  			&& mSelectedItems.size() )  	{  		mNeedsScroll = TRUE; @@ -2024,7 +2024,7 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr  		LLRect visible_doc_rect = mScrollContainer->getVisibleContentRect();  		S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();  -		S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());  +		S32 label_height = getLabelFontForStyle(mLabelStyle)->getLineHeight();   		// when navigating with keyboard, only move top of opened folder on screen, otherwise show whole folder  		S32 max_height_to_show = item->isOpen() && mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();  diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 0b4baf52f9..712d3e4583 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -1046,7 +1046,7 @@ void LLFolderViewItem::draw()  	}  	if ((mIsLoading  		&&	mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) -			||	(LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() +			||	(LLInventoryModelBackgroundFetch::instance().folderFetchActive()  				&&	root_is_loading  				&&	mShowLoadStatus))  	{ diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp index bf6cf52298..a12ec390af 100644 --- a/indra/newview/llinspectremoteobject.cpp +++ b/indra/newview/llinspectremoteobject.cpp @@ -60,12 +60,10 @@ public:  private:  	void update(); -	void onNameCache(const LLUUID& id, const std::string& name, bool is_group);  private:  	LLUUID		 mObjectID;  	LLUUID		 mOwnerID; -	std::string  mOwnerLegacyName;  	std::string  mSLurl;  	std::string  mName;  	bool         mGroupOwned; @@ -75,7 +73,6 @@ LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) :  	LLInspect(LLSD()),  	mObjectID(NULL),  	mOwnerID(NULL), -	mOwnerLegacyName(),  	mSLurl(""),  	mName(""),  	mGroupOwned(false) @@ -111,14 +108,6 @@ void LLInspectRemoteObject::onOpen(const LLSD& data)  	mGroupOwned = data["group_owned"].asBoolean();  	mSLurl      = data["slurl"].asString(); -	// work out the owner's name -	mOwnerLegacyName = ""; -	if (gCacheName) -	{ -		gCacheName->get(mOwnerID, mGroupOwned,  // muting -			boost::bind(&LLInspectRemoteObject::onNameCache, this, _1, _2, _3)); -	} -  	// update the inspector with the current object state  	update(); @@ -144,8 +133,7 @@ void LLInspectRemoteObject::onClickMap()  void LLInspectRemoteObject::onClickBlock()  { -	LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT; -	LLMute mute(mOwnerID, mOwnerLegacyName, mute_type); +	LLMute mute(mObjectID, mName, LLMute::OBJECT);  	LLMuteList::getInstance()->add(mute);  	LLPanelBlockedList::showPanelAndSelect(mute.mID);  	closeFloater(); @@ -156,12 +144,6 @@ void LLInspectRemoteObject::onClickClose()  	closeFloater();  } -void LLInspectRemoteObject::onNameCache(const LLUUID& id, const std::string& name, bool is_group) -{ -	mOwnerLegacyName = name; -	update(); -} -  void LLInspectRemoteObject::update()  {  	// show the object name as the inspector's title @@ -198,8 +180,8 @@ void LLInspectRemoteObject::update()  	// disable the Map button if we don't have a SLurl  	getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty()); -	// disable the Block button if we don't have the owner ID -	getChild<LLUICtrl>("block_btn")->setEnabled(! mOwnerID.isNull()); +	// disable the Block button if we don't have the object ID (will this ever happen?) +	getChild<LLUICtrl>("block_btn")->setEnabled(! mObjectID.isNull());  }  ////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp index d7b82667d1..f4fe5dec01 100644 --- a/indra/newview/llinspecttoast.cpp +++ b/indra/newview/llinspecttoast.cpp @@ -72,6 +72,8 @@ LLInspectToast::LLInspectToast(const LLSD& notification_id) :  LLInspectToast::~LLInspectToast()  {  	LLTransientFloaterMgr::getInstance()->removeControlView(this); + +	mConnection.disconnect();  }  // virtual diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index cac1dbfe4a..d55fb6a089 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -73,7 +73,7 @@  #include "llwearablelist.h"  // Marketplace outbox current disabled -#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU	1 +#define ENABLE_MERCHANT_OUTBOX_CONTEXT_MENU	0  #define ENABLE_MERCHANT_SEND_TO_MARKETPLACE_CONTEXT_MENU 0  #define BLOCK_WORN_ITEMS_IN_OUTBOX 1 @@ -113,6 +113,13 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response  bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);  void teleport_via_landmark(const LLUUID& asset_id);  static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); +static bool check_category(LLInventoryModel* model, +						   const LLUUID& cat_id, +						   LLFolderView* active_folder_view, +						   LLInventoryFilter* filter); +static bool check_item(const LLUUID& item_id, +					   LLFolderView* active_folder_view, +					   LLInventoryFilter* filter);  // Helper functions @@ -403,6 +410,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*  	for(; it != end; ++it)  	{  		gInventory.moveObject((*it), trash_id); +		model->updateItem(gInventory.getItem(*it));  	}  	// notify inventory observers. @@ -1346,6 +1354,7 @@ void LLItemBridge::selectItem()  	LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());  	if(item && !item->isFinished())  	{ +		//item->fetchFromServer();  		LLInventoryModelBackgroundFetch::instance().start(item->getUUID(), false);  	}  } @@ -1986,6 +1995,12 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  	if (!isAgentAvatarValid()) return FALSE;  	if (!isAgentInventory()) return FALSE; // cannot drag categories into library +	LLInventoryPanel* destination_panel = mInventoryPanel.get(); +	if (!destination_panel) return false; + +	LLInventoryFilter* filter = destination_panel->getFilter(); +	if (!filter) return false; +  	const LLUUID &cat_id = inv_cat->getUUID();  	const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);  	const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); @@ -2123,7 +2138,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  							// NOTE: The cargo id's count is a total of categories AND items but we err on the side of  							//       prevention rather than letting too many folders into the hierarchy of the outbox,  							//       when we're dragging the item to a new parent -							dragged_folder_count += LLToolDragAndDrop::instance().getCargoIDsCount(); +							dragged_folder_count += LLToolDragAndDrop::instance().getCargoCount();  						}  					} @@ -2173,6 +2188,39 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  			}  		} +		if (is_movable) +		{ +			LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); +			is_movable = active_panel != NULL; + +			// For a folder to pass the filter all its descendants are required to pass. +			// We make this exception to allow reordering folders within an inventory panel, +			// which has a filter applied, like Recent tab for example. +			// There may be folders which are displayed because some of their descendants pass +			// the filter, but other don't, and thus remain hidden. Without this check, +			// such folders would not be allowed to be moved within a panel. +			if (destination_panel == active_panel) +			{ +				is_movable = true; +			} +			else +			{ +				LLFolderView* active_folder_view = NULL; + +				if (is_movable) +				{ +					active_folder_view = active_panel->getRootFolder(); +					is_movable = active_folder_view != NULL; +				} + +				if (is_movable) +				{ +					// Check whether the folder being dragged from active inventory panel +					// passes the filter of the destination panel. +					is_movable = check_category(model, cat_id, active_folder_view, filter); +				} +			} +		}  		//   		//-------------------------------------------------------------------------------- @@ -2267,7 +2315,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		}  		else  		{ -			accept = move_inv_category_world_to_agent(cat_id, mUUID, drop); +			accept = move_inv_category_world_to_agent(cat_id, mUUID, drop, NULL, NULL, filter);  		}  	}  	else if (LLToolDragAndDrop::SOURCE_LIBRARY == source) @@ -2312,7 +2360,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  									  const LLUUID& category_id,  									  BOOL drop,  									  void (*callback)(S32, void*), -									  void* user_data) +									  void* user_data, +									  LLInventoryFilter* filter)  {  	// Make sure the object exists. If we allowed dragging from  	// anonymous objects, it would be possible to bypass @@ -2336,7 +2385,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  		return FALSE;  	} -	BOOL accept = TRUE; +	BOOL accept = FALSE;  	BOOL is_move = FALSE;  	// coming from a task. Need to figure out if the person can @@ -2345,9 +2394,16 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  	LLInventoryObject::object_list_t::iterator end = inventory_objects.end();  	for ( ; it != end; ++it)  	{ +		LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(it->get()); +		if (!item) +		{ +			llwarns << "Invalid inventory item for drop" << llendl; +			continue; +		} +  		// coming from a task. Need to figure out if the person can  		// move/copy this item. -		LLPermissions perm(((LLInventoryItem*)((LLInventoryObject*)(*it)))->getPermissions()); +		LLPermissions perm(item->getPermissions());  		if((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())  			&& perm.allowTransferTo(gAgent.getID())))  //			|| gAgent.isGodlike()) @@ -2362,9 +2418,14 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  			is_move = TRUE;  			accept = TRUE;  		} -		else + +		if (filter && accept) +		{ +			accept = filter->check(item); +		} + +		if (!accept)  		{ -			accept = FALSE;  			break;  		}  	} @@ -2852,18 +2913,62 @@ void LLFolderBridge::pasteFromClipboard()  	if (model && (isClipboardPasteable() || LLClipboard::getInstance()->isCutMode()))  	{  		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); +		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +  		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); - -		const LLUUID parent_id(mUUID); +		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);  		LLDynamicArray<LLUUID> objects;  		LLClipboard::getInstance()->pasteFromClipboard(objects); + +		if (move_is_into_outbox) +		{ +			LLFolderViewItem * outbox_itemp = mRoot->getItemByID(mUUID); + +			if (outbox_itemp) +			{ +				LLToolDragAndDrop::instance().setCargoCount(objects.size()); + +				BOOL can_list = TRUE; + +				for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin(); +					(iter != objects.end()) && (can_list == TRUE); +					++iter) +				{ +					const LLUUID& item_id = (*iter); +					LLInventoryItem *item = model->getItem(item_id); + +					if (item) +					{ +						MASK mask = 0x0; +						BOOL drop = FALSE; +						EDragAndDropType cargo_type = LLViewerAssetType::lookupDragAndDropType(item->getActualType()); +						void * cargo_data = (void *) item; +						std::string tooltip_msg; + +						can_list = outbox_itemp->getListener()->dragOrDrop(mask, drop, cargo_type, cargo_data, tooltip_msg); +					} +				} + +				LLToolDragAndDrop::instance().resetCargoCount(); + +				if (can_list == FALSE) +				{ +					// Notify user of failure somehow -- play error sound?  modal dialog? +					return; +				} +			} +		} + +		const LLUUID parent_id(mUUID); +  		for (LLDynamicArray<LLUUID>::const_iterator iter = objects.begin();  			 iter != objects.end();  			 ++iter)  		{  			const LLUUID& item_id = (*iter); +  			LLInventoryItem *item = model->getItem(item_id);  			LLInventoryObject *obj = model->getObject(item_id);  			if (obj) @@ -2934,8 +3039,17 @@ void LLFolderBridge::pasteLinkFromClipboard()  	if(model)  	{  		const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); +		const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); +  		const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);  		const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); +		const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); + +		if (move_is_into_outbox) +		{ +			// Notify user of failure somehow -- play error sound?  modal dialog? +			return; +		}  		const LLUUID parent_id(mUUID); @@ -3597,7 +3711,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	const BOOL move_is_into_favorites = (mUUID == favorites_id);  	const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  	const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); -	const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); //(mUUID == outbox_id); +	const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id);  	const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_item->getUUID(), outbox_id);  	LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); @@ -3676,7 +3790,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			{  				const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(outbox_id, mUUID); -				int existing_item_count = LLToolDragAndDrop::instance().getCargoIDsCount(); +				int existing_item_count = LLToolDragAndDrop::instance().getCargoCount();  				if (master_folder != NULL)  				{ @@ -3702,10 +3816,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  		// passes the filter of the destination panel.  		if (accept && active_panel)  		{ -			LLFolderView* active_folder_viev = active_panel->getRootFolder(); -			if (!active_folder_viev) return false; +			LLFolderView* active_folder_view = active_panel->getRootFolder(); +			if (!active_folder_view) return false; -			LLFolderViewItem* fv_item = active_folder_viev->getItemByID(inv_item->getUUID()); +			LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID());  			if (!fv_item) return false;  			accept = filter->check(fv_item); @@ -3721,9 +3835,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			// If an item is being dragged between windows, unselect everything in the active window   			// so that we don't follow the selection to its new location (which is very annoying).  			if (active_panel && (destination_panel != active_panel)) -			{ -				active_panel->unSelectAll(); -			} +				{ +					active_panel->unSelectAll(); +				}  			//--------------------------------------------------------------------------------  			// Destination folder logic @@ -3925,10 +4039,10 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			// passes the filter of the destination panel.  			if (accept && active_panel)  			{ -				LLFolderView* active_folder_viev = active_panel->getRootFolder(); -				if (!active_folder_viev) return false; +				LLFolderView* active_folder_view = active_panel->getRootFolder(); +				if (!active_folder_view) return false; -				LLFolderViewItem* fv_item = active_folder_viev->getItemByID(inv_item->getUUID()); +				LLFolderViewItem* fv_item = active_folder_view->getItemByID(inv_item->getUUID());  				if (!fv_item) return false;  				accept = filter->check(fv_item); @@ -3968,6 +4082,69 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  	return accept;  } +// static +bool check_category(LLInventoryModel* model, +					const LLUUID& cat_id, +					LLFolderView* active_folder_view, +					LLInventoryFilter* filter) +{ +	if (!model || !active_folder_view || !filter) +		return false; + +	if (!filter->checkFolder(cat_id)) +	{ +		return false; +	} + +	LLInventoryModel::cat_array_t descendent_categories; +	LLInventoryModel::item_array_t descendent_items; +	model->collectDescendents(cat_id, descendent_categories, descendent_items, TRUE); + +	S32 num_descendent_categories = descendent_categories.count(); +	S32 num_descendent_items = descendent_items.count(); + +	if (num_descendent_categories + num_descendent_items == 0) +	{ +		// Empty folder should be checked as any other folder view item. +		// If we are filtering by date the folder should not pass because +		// it doesn't have its own creation date. See LLInvFVBridge::getCreationDate(). +		return check_item(cat_id, active_folder_view, filter); +	} + +	for (S32 i = 0; i < num_descendent_categories; ++i) +	{ +		LLInventoryCategory* category = descendent_categories[i]; +		if(!check_category(model, category->getUUID(), active_folder_view, filter)) +		{ +			return false; +		} +	} + +	for (S32 i = 0; i < num_descendent_items; ++i) +	{ +		LLViewerInventoryItem* item = descendent_items[i]; +		if(!check_item(item->getUUID(), active_folder_view, filter)) +		{ +			return false; +		} +	} + +	return true; +} + +// static +bool check_item(const LLUUID& item_id, +				LLFolderView* active_folder_view, +				LLInventoryFilter* filter) +{ +	if (!active_folder_view || !filter) return false; + +	LLFolderViewItem* fv_item = active_folder_view->getItemByID(item_id); +	if (!fv_item) return false; + +	return filter->check(fv_item); +} +  // +=================================================+  // |        LLTextureBridge                          |  // +=================================================+ diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index f13ff15bc5..dc9e88d54d 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -35,6 +35,7 @@  #include "llviewercontrol.h"  #include "llwearable.h" +class LLInventoryFilter;  class LLInventoryPanel;  class LLInventoryModel;  class LLMenuGL; @@ -643,7 +644,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,  									  const LLUUID& category_id,  									  BOOL drop,  									  void (*callback)(S32, void*) = NULL, -									  void* user_data = NULL); +									  void* user_data = NULL, +									  LLInventoryFilter* filter = NULL);  // Utility function to hide all entries except those in the list  // Can be called multiple times on the same menu (e.g. if multiple items diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 7b803888e2..c127d7ac88 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -127,7 +127,29 @@ bool LLInventoryFilter::check(const LLInventoryItem* item)  	return passed;  } -bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) +bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const +{ +	if (!folder) +	{ +		llwarns << "The filter can not be checked on an invalid folder." << llendl; +		llassert(false); // crash in development builds +		return false; +	} + +	const LLFolderViewEventListener* listener = folder->getListener(); +	if (!listener) +	{ +		llwarns << "Folder view event listener not found." << llendl; +		llassert(false); // crash in development builds +		return false; +	} + +	const LLUUID folder_id = listener->getUUID(); + +	return checkFolder(folder_id); +} + +bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  {  	// we're showing all folders, overriding filter  	if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS) @@ -135,9 +157,6 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder)  		return true;  	} -	const LLFolderViewEventListener* listener = folder->getListener(); -	const LLUUID folder_id = listener->getUUID(); -	  	if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY)  	{  		// Can only filter categories for items in your inventory @@ -291,19 +310,9 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLInventoryItem* item) cons  	// Pass if this item is within the date range.  	if (filterTypes & FILTERTYPE_DATE)  	{ -		const U16 HOURS_TO_SECONDS = 3600; -		time_t earliest = time_corrected() - mFilterOps.mHoursAgo * HOURS_TO_SECONDS; -		if (mFilterOps.mMinDate > time_min() && mFilterOps.mMinDate < earliest) -		{ -			earliest = mFilterOps.mMinDate; -		} -		else if (!mFilterOps.mHoursAgo) -		{ -			earliest = 0; -		} -		if (item->getCreationDate() < earliest || -			item->getCreationDate() > mFilterOps.mMaxDate) -			return false; +		// We don't get the updated item creation date for the task inventory or +		// a notecard embedded item. See LLTaskInvFVBridge::getCreationDate(). +		return false;  	}  	return true; @@ -581,7 +590,15 @@ void LLInventoryFilter::setDateRange(time_t min_date, time_t max_date)  		mFilterOps.mMaxDate = llmax(mFilterOps.mMinDate, max_date);  		setModified();  	} -	mFilterOps.mFilterTypes |= FILTERTYPE_DATE; + +	if (areDateLimitsSet()) +	{ +		mFilterOps.mFilterTypes |= FILTERTYPE_DATE; +	} +	else +	{ +		mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	}  }  void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl) @@ -593,10 +610,18 @@ void LLInventoryFilter::setDateRangeLastLogoff(BOOL sl)  	}  	if (!sl && isSinceLogoff())  	{ -		setDateRange(0, time_max()); +		setDateRange(time_min(), time_max());  		setModified();  	} -	mFilterOps.mFilterTypes |= FILTERTYPE_DATE; + +	if (areDateLimitsSet()) +	{ +		mFilterOps.mFilterTypes |= FILTERTYPE_DATE; +	} +	else +	{ +		mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	}  }  BOOL LLInventoryFilter::isSinceLogoff() const @@ -641,7 +666,15 @@ void LLInventoryFilter::setHoursAgo(U32 hours)  			setModified(FILTER_RESTART);  		}  	} -	mFilterOps.mFilterTypes |= FILTERTYPE_DATE; + +	if (areDateLimitsSet()) +	{ +		mFilterOps.mFilterTypes |= FILTERTYPE_DATE; +	} +	else +	{ +		mFilterOps.mFilterTypes &= ~FILTERTYPE_DATE; +	}  }  void LLInventoryFilter::setFilterLinks(U64 filter_links) @@ -921,7 +954,7 @@ const std::string& LLInventoryFilter::getFilterText()  		filtered_by_all_types = FALSE;  	} -	if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() +	if (!LLInventoryModelBackgroundFetch::instance().folderFetchActive()  		&& filtered_by_type  		&& !filtered_by_all_types)  	{ @@ -1091,3 +1124,10 @@ const std::string& LLInventoryFilter::getEmptyLookupMessage() const  	return mEmptyLookupMessage;  } + +bool LLInventoryFilter::areDateLimitsSet() +{ +	return     mFilterOps.mMinDate != time_min() +			|| mFilterOps.mMaxDate != time_max() +			|| mFilterOps.mHoursAgo != 0; +} diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index 1ac90788b2..1804637a04 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -117,7 +117,8 @@ public:  	// +-------------------------------------------------------------------+  	BOOL 				check(const LLFolderViewItem* item);  	bool				check(const LLInventoryItem* item); -	bool				checkFolder(const LLFolderViewFolder* folder); +	bool				checkFolder(const LLFolderViewFolder* folder) const; +	bool				checkFolder(const LLUUID& folder_id) const;  	BOOL 				checkAgainstFilterType(const LLFolderViewItem* item) const;  	bool 				checkAgainstFilterType(const LLInventoryItem* item) const;  	BOOL 				checkAgainstPermissions(const LLFolderViewItem* item) const; @@ -180,6 +181,8 @@ public:  	void 				fromLLSD(LLSD& data);  private: +	bool				areDateLimitsSet(); +  	struct FilterOps  	{  		FilterOps(); diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index cb140cf15c..f4d0110b0f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -43,6 +43,7 @@ const S32 MAX_FETCH_RETRIES = 10;  LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :  	mBackgroundFetchActive(FALSE), +	mFolderFetchActive(false),  	mAllFoldersFetched(FALSE),  	mRecursiveInventoryFetchStarted(FALSE),  	mRecursiveLibraryFetchStarted(FALSE), @@ -98,19 +99,20 @@ bool LLInventoryModelBackgroundFetch::isEverythingFetched() const  	return mAllFoldersFetched;  } -BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const +BOOL LLInventoryModelBackgroundFetch::folderFetchActive() const  { -	return mBackgroundFetchActive; +	return mFolderFetchActive;  }  void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)  {  	LLViewerInventoryCategory* cat = gInventory.getCategory(id); -	if (cat || (id.isNull() && !mAllFoldersFetched)) +	if (cat || (id.isNull() && !isEverythingFetched()))  	{	// it's a folder, do a bulk fetch  		LL_DEBUGS("InventoryFetch") << "Start fetching category: " << id << ", recursive: " << recursive << LL_ENDL;  		mBackgroundFetchActive = TRUE; +		mFolderFetchActive = true;  		if (id.isNull())  		{  			if (!mRecursiveInventoryFetchStarted) @@ -159,21 +161,11 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)  void LLInventoryModelBackgroundFetch::findLostItems()  {  	mBackgroundFetchActive = TRUE; +	mFolderFetchActive = true;      mFetchQueue.push_back(FetchQueueInfo(LLUUID::null, TRUE));      gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);  } -void LLInventoryModelBackgroundFetch::stopBackgroundFetch() -{ -	if (mBackgroundFetchActive) -	{ -		mBackgroundFetchActive = FALSE; -		gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); -		mFetchCount=0; -		mMinTimeBetweenFetches=0.0f; -	} -} -  void LLInventoryModelBackgroundFetch::setAllFoldersFetched()  {  	if (mRecursiveInventoryFetchStarted && @@ -181,7 +173,7 @@ void LLInventoryModelBackgroundFetch::setAllFoldersFetched()  	{  		mAllFoldersFetched = TRUE;  	} -	stopBackgroundFetch(); +	mFolderFetchActive = false;  }  void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *) @@ -211,6 +203,9 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			llinfos << "Inventory fetch completed" << llendl;  			setAllFoldersFetched(); +			mBackgroundFetchActive = false; +			mFolderFetchActive = false; +  			return;  		} @@ -240,80 +235,114 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()  			}  			const FetchQueueInfo info = mFetchQueue.front(); -			LLViewerInventoryCategory* cat = gInventory.getCategory(info.mUUID); -			// Category has been deleted, remove from queue. -			if (!cat) +			if (info.mIsCategory)  			{ -				mFetchQueue.pop_front(); -				continue; -			} + +				LLViewerInventoryCategory* cat = gInventory.getCategory(info.mUUID); + +				// Category has been deleted, remove from queue. +				if (!cat) +				{ +					mFetchQueue.pop_front(); +					continue; +				} -			if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&  -				LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) -			{ -				// Category exists but has no children yet, fetch the descendants -				// for now, just request every time and rely on retry timer to throttle. -				if (cat->fetch()) +				if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&  +					LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())  				{ -					mFetchTimer.reset(); -					mTimelyFetchPending = TRUE; +					// Category exists but has no children yet, fetch the descendants +					// for now, just request every time and rely on retry timer to throttle. +					if (cat->fetch()) +					{ +						mFetchTimer.reset(); +						mTimelyFetchPending = TRUE; +					} +					else +					{ +						//  The catagory also tracks if it has expired and here it says it hasn't +						//  yet.  Get out of here because nothing is going to happen until we +						//  update the timers. +						break; +					}  				} -				else +				// Do I have all my children? +				else if (gInventory.isCategoryComplete(info.mUUID))  				{ -					//  The catagory also tracks if it has expired and here it says it hasn't -					//  yet.  Get out of here because nothing is going to happen until we -					//  update the timers. +					// Finished with this category, remove from queue. +					mFetchQueue.pop_front(); + +					// Add all children to queue. +					LLInventoryModel::cat_array_t* categories; +					LLInventoryModel::item_array_t* items; +					gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); +					for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); +						 it != categories->end(); +						 ++it) +					{ +						mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive)); +					} + +					// We received a response in less than the fast time. +					if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time) +					{ +						// Shrink timeouts based on success. +						mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); +						mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); +						lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +					} + +					mTimelyFetchPending = FALSE; +					continue; +				} +				else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches) +				{ +					// Received first packet, but our num descendants does not match db's num descendants +					// so try again later. +					mFetchQueue.pop_front(); + +					if (mNumFetchRetries++ < MAX_FETCH_RETRIES) +					{ +						// push on back of queue +						mFetchQueue.push_back(info); +					} +					mTimelyFetchPending = FALSE; +					mFetchTimer.reset();  					break;  				} + +				// Not enough time has elapsed to do a new fetch +				break;  			} -			// Do I have all my children? -			else if (gInventory.isCategoryComplete(info.mUUID)) +			else  			{ -				// Finished with this category, remove from queue. -				mFetchQueue.pop_front(); +				LLViewerInventoryItem* itemp = gInventory.getItem(info.mUUID); -				// Add all children to queue. -				LLInventoryModel::cat_array_t* categories; -				LLInventoryModel::item_array_t* items; -				gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items); -				for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); -					 it != categories->end(); -					 ++it) +				mFetchQueue.pop_front(); +				if (!itemp)   				{ -					mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive)); +					continue;  				} -				// We received a response in less than the fast time. -				if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time) +				if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches)  				{ -					// Shrink timeouts based on success. -					mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f); -					mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f); -					lldebugs << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl; +					itemp->fetchFromServer(); +					mFetchTimer.reset(); +					mTimelyFetchPending = TRUE;  				} - -				mTimelyFetchPending = FALSE; -				continue; -			} -			else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches) -			{ -				// Received first packet, but our num descendants does not match db's num descendants -				// so try again later. -				mFetchQueue.pop_front(); - -				if (mNumFetchRetries++ < MAX_FETCH_RETRIES) +				else if (itemp->mIsComplete) +				{ +					mTimelyFetchPending = FALSE; +				} +				else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches)  				{ -					// push on back of queue  					mFetchQueue.push_back(info); +					mFetchTimer.reset(); +					mTimelyFetchPending = FALSE;  				} -				mTimelyFetchPending = FALSE; -				mFetchTimer.reset(); +				// Not enough time has elapsed to do a new fetch  				break;  			} - -			// Not enough time has elapsed to do a new fetch -			break;  		}  		// @@ -543,7 +572,6 @@ void LLInventoryModelBackgroundFetch::bulkFetch()  	//Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.  	//If there are items in mFetchQueue, we want to check the time since the last bulkFetch was   	//sent.  If it exceeds our retry time, go ahead and fire off another batch.   -	//Stopbackgroundfetch will be run from the Responder instead of here.    	LLViewerRegion* region = gAgent.getRegion();  	if (!region) return; @@ -574,12 +602,12 @@ void LLInventoryModelBackgroundFetch::bulkFetch()  	LLSD item_request_body;  	LLSD item_request_body_lib; -	while (!(mFetchQueue.empty()) && ((item_count + folder_count) < max_batch_size)) +	while (!mFetchQueue.empty()  +			&& (item_count + folder_count) < max_batch_size)  	{  		const FetchQueueInfo& fetch_info = mFetchQueue.front();  		if (fetch_info.mIsCategory)  		{ -  			const LLUUID &cat_id = fetch_info.mUUID;  			if (cat_id.isNull()) //DEV-17797  			{ diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index 0745407a8c..9dfedddd6d 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -48,7 +48,7 @@ public:  	// This gets triggered when performing a filter-search.  	void start(const LLUUID& cat_id = LLUUID::null, BOOL recursive = TRUE); -	BOOL backgroundFetchActive() const; +	BOOL folderFetchActive() const;  	bool isEverythingFetched() const; // completing the fetch once per session should be sufficient  	bool libraryFetchStarted() const; @@ -67,7 +67,6 @@ protected:  	void backgroundFetch();  	static void backgroundFetchCB(void*); // background fetch idle function -	void stopBackgroundFetch(); // stop fetch process  	void setAllFoldersFetched();  	bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const; @@ -77,6 +76,7 @@ private:  	BOOL mAllFoldersFetched;  	BOOL mBackgroundFetchActive; +	bool mFolderFetchActive;  	S16 mFetchCount;  	BOOL mTimelyFetchPending;  	S32 mNumFetchRetries; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index d569d819dd..a1e17ffbf2 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -829,7 +829,7 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)  	if(handled)  	{  		ECursorType cursor = getWindow()->getCursor(); -		if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && cursor == UI_CURSOR_ARROW) +		if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW)  		{  			// replace arrow cursor with arrow and hourglass cursor  			getWindow()->setCursor(UI_CURSOR_WORKING); diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp index 7e9c3c84a7..c0a323d6cb 100644 --- a/indra/newview/llmemoryview.cpp +++ b/indra/newview/llmemoryview.cpp @@ -220,7 +220,7 @@ void LLMemoryView::draw()  	S32 x, y;  	S32 margin = 10; -	S32 texth = (S32)LLFontGL::getFontMonospace()->getLineHeight(); +	S32 texth = LLFontGL::getFontMonospace()->getLineHeight();  	S32 xleft = margin;  	S32 ytop = height - margin; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index a97e256c89..b02bf79a28 100644..100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -88,6 +88,9 @@ const S32 MAX_MESH_VERSION = 999;  U32 LLMeshRepository::sBytesReceived = 0;  U32 LLMeshRepository::sHTTPRequestCount = 0;  U32 LLMeshRepository::sHTTPRetryCount = 0; +U32 LLMeshRepository::sLODProcessing = 0; +U32 LLMeshRepository::sLODPending = 0; +  U32 LLMeshRepository::sCacheBytesRead = 0;  U32 LLMeshRepository::sCacheBytesWritten = 0;  U32 LLMeshRepository::sPeakKbps = 0; @@ -205,6 +208,12 @@ public:  	LLMeshHeaderResponder(const LLVolumeParams& mesh_params)  		: mMeshParams(mesh_params)  	{ +		LLMeshRepoThread::sActiveHeaderRequests++; +	} + +	~LLMeshHeaderResponder() +	{ +		LLMeshRepoThread::sActiveHeaderRequests--;  	}  	virtual void completedRaw(U32 status, const std::string& reason, @@ -224,6 +233,12 @@ public:  	LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)  		: mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)  	{ +		LLMeshRepoThread::sActiveLODRequests++; +	} + +	~LLMeshLODResponder() +	{ +		LLMeshRepoThread::sActiveLODRequests--;  	}  	virtual void completedRaw(U32 status, const std::string& reason, @@ -497,10 +512,13 @@ void LLMeshRepoThread::run()  					mMutex->lock();  					LODRequest req = mLODReqQ.front();  					mLODReqQ.pop(); +					LLMeshRepository::sLODProcessing--;  					mMutex->unlock(); -					if (fetchMeshLOD(req.mMeshParams, req.mLOD)) +					if (!fetchMeshLOD(req.mMeshParams, req.mLOD, count))//failed, resubmit  					{ -						count++; +						mMutex->lock(); +						mLODReqQ.push(req) ;  +						mMutex->unlock();  					}  				}  			} @@ -512,9 +530,11 @@ void LLMeshRepoThread::run()  					HeaderRequest req = mHeaderReqQ.front();  					mHeaderReqQ.pop();  					mMutex->unlock(); -					if (fetchMeshHeader(req.mMeshParams)) +					if (!fetchMeshHeader(req.mMeshParams, count))//failed, resubmit  					{ -						count++; +						mMutex->lock(); +						mHeaderReqQ.push(req) ; +						mMutex->unlock();  					}  				}  			} @@ -603,6 +623,7 @@ void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)  		{  			LLMutexLock lock(mMutex);  			mLODReqQ.push(req); +			LLMeshRepository::sLODProcessing++;  		}  	}  	else @@ -658,6 +679,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  		return false;  	} +	bool ret = true ;  	U32 header_size = mMeshHeaderSize[mesh_id];  	if (header_size > 0) @@ -673,7 +695,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  			//check VFS for mesh skin info  			LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);  			if (file.getSize() >= offset+size) -			{ +			{				  				LLMeshRepository::sCacheBytesRead += size;  				file.seek(offset);  				U8* buffer = new U8[size]; @@ -689,7 +711,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  				if (!zero)  				{ //attempt to parse  					if (skinInfoReceived(mesh_id, buffer, size)) -					{ +					{						  						delete[] buffer;  						return true;  					} @@ -704,11 +726,13 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  			std::string http_url = constructUrl(mesh_id);  			if (!http_url.empty()) -			{ -				++sActiveLODRequests; -				LLMeshRepository::sHTTPRequestCount++; -				mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size, +			{				 +				ret = mCurlRequest->getByteRange(http_url, headers, offset, size,  										   new LLMeshSkinInfoResponder(mesh_id, offset, size)); +				if(ret) +				{ +					LLMeshRepository::sHTTPRequestCount++; +				}  			}  		}  	} @@ -718,7 +742,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)  	}  	//early out was not hit, effectively fetched -	return true; +	return ret;  }  bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id) @@ -732,7 +756,8 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)  	}  	U32 header_size = mMeshHeaderSize[mesh_id]; - +	bool ret = true ; +	  	if (header_size > 0)  	{  		S32 version = mMeshHeader[mesh_id]["version"].asInteger(); @@ -748,6 +773,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)  			if (file.getSize() >= offset+size)  			{  				LLMeshRepository::sCacheBytesRead += size; +  				file.seek(offset);  				U8* buffer = new U8[size];  				file.read(buffer, size); @@ -777,11 +803,13 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)  			std::string http_url = constructUrl(mesh_id);  			if (!http_url.empty()) -			{ -				++sActiveLODRequests; -				LLMeshRepository::sHTTPRequestCount++; -				mCurlRequest->getByteRange(http_url, headers, offset, size, +			{				 +				ret = mCurlRequest->getByteRange(http_url, headers, offset, size,  										   new LLMeshDecompositionResponder(mesh_id, offset, size)); +				if(ret) +				{ +					LLMeshRepository::sHTTPRequestCount++; +				}  			}  		}  	} @@ -791,7 +819,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)  	}  	//early out was not hit, effectively fetched -	return true; +	return ret;  }  bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) @@ -805,6 +833,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)  	}  	U32 header_size = mMeshHeaderSize[mesh_id]; +	bool ret = true ;  	if (header_size > 0)  	{ @@ -850,11 +879,14 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)  			std::string http_url = constructUrl(mesh_id);  			if (!http_url.empty()) -			{ -				++sActiveLODRequests; -				LLMeshRepository::sHTTPRequestCount++; -				mCurlRequest->getByteRange(http_url, headers, offset, size, +			{				 +				ret = mCurlRequest->getByteRange(http_url, headers, offset, size,  										   new LLMeshPhysicsShapeResponder(mesh_id, offset, size)); + +				if(ret) +				{ +					LLMeshRepository::sHTTPRequestCount++; +				}  			}  		}  		else @@ -868,13 +900,12 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)  	}  	//early out was not hit, effectively fetched -	return true; +	return ret;  } -bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params) +//return false if failed to get header +bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count)  { -	bool retval = false; -  	{  		//look for mesh in asset in vfs  		LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH); @@ -889,36 +920,39 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)  			file.read(buffer, bytes);  			if (headerReceived(mesh_params, buffer, bytes))  			{ //did not do an HTTP request, return false -				return false; +				return true;  			}  		}  	} -	//either cache entry doesn't exist or is corrupt, request header from simulator - +	//either cache entry doesn't exist or is corrupt, request header from simulator	 +	bool retval = true ;  	std::vector<std::string> headers;  	headers.push_back("Accept: application/octet-stream");  	std::string http_url = constructUrl(mesh_params.getSculptID());  	if (!http_url.empty())  	{ -		++sActiveHeaderRequests; -		retval = true;  		//grab first 4KB if we're going to bother with a fetch.  Cache will prevent future fetches if a full mesh fits  		//within the first 4KB -		//NOTE -- this will break of headers ever exceed 4KB -		LLMeshRepository::sHTTPRequestCount++; -		mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params)); +		//NOTE -- this will break of headers ever exceed 4KB		 +		retval = mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params)); +		if(retval) +		{ +			LLMeshRepository::sHTTPRequestCount++; +		} +		count++;  	}  	return retval;  } -bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod) +//return false if failed to get mesh lod. +bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count)  { //protected by mMutex  	mHeaderMutex->lock(); -	bool retval = false; +	bool retval = true;  	LLUUID mesh_id = mesh_params.getSculptID(); @@ -955,7 +989,7 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)  					if (lodReceived(mesh_params, lod, buffer, size))  					{  						delete[] buffer; -						return false; +						return true;  					}  				} @@ -968,12 +1002,15 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)  			std::string http_url = constructUrl(mesh_id);  			if (!http_url.empty()) -			{ -				++sActiveLODRequests; -				retval = true; -				LLMeshRepository::sHTTPRequestCount++; -				mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size, +			{				 +				retval = mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,  										   new LLMeshLODResponder(mesh_params, lod, offset, size)); + +				if(retval) +				{ +					LLMeshRepository::sHTTPRequestCount++; +				} +				count++;  			}  			else  			{ @@ -1045,6 +1082,7 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat  			{  				LODRequest req(mesh_params, iter->second[i]);  				mLODReqQ.push(req); +				LLMeshRepository::sLODProcessing++;  			}  		}  		mPendingLOD.erase(iter); @@ -1540,8 +1578,17 @@ void LLMeshUploadThread::doWholeModelUpload()  		LLSD body = full_model_data["asset_resources"];  		dump_llsd_to_file(body,make_dump_name("whole_model_body_",dump_num));  		LLCurlRequest::headers_t headers; -		mCurlRequest->post(mWholeModelUploadURL, headers, body, -						   new LLWholeModelUploadResponder(this, full_model_data, mUploadObserverHandle), mMeshUploadTimeOut); + +		{ +			LLCurl::ResponderPtr responder = new LLWholeModelUploadResponder(this, full_model_data, mUploadObserverHandle) ; + +			while(!mCurlRequest->post(mWholeModelUploadURL, headers, body, responder, mMeshUploadTimeOut)) +			{ +				//sleep for 10ms to prevent eating a whole core +				apr_sleep(10000); +			} +		} +  		do  		{  			mCurlRequest->process(); @@ -1571,8 +1618,15 @@ void LLMeshUploadThread::requestWholeModelFee()  	mPendingUploads++;  	LLCurlRequest::headers_t headers; -	mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, -					   new LLWholeModelFeeResponder(this,model_data, mFeeObserverHandle), mMeshUploadTimeOut); + +	{ +		LLCurl::ResponderPtr responder = new LLWholeModelFeeResponder(this,model_data, mFeeObserverHandle) ; +		while(!mCurlRequest->post(mWholeModelFeeCapability, headers, model_data, responder, mMeshUploadTimeOut)) +		{ +			//sleep for 10ms to prevent eating a whole core +			apr_sleep(10000); +		} +	}  	do  	{ @@ -1712,7 +1766,6 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,  							  const LLIOPipe::buffer_ptr_t& buffer)  { -	LLMeshRepoThread::sActiveLODRequests--;  	S32 data_size = buffer->countAfter(channels.in(), NULL);  	if (status < 200 || status > 400) @@ -1929,7 +1982,6 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,  							  const LLChannelDescriptors& channels,  							  const LLIOPipe::buffer_ptr_t& buffer)  { -	LLMeshRepoThread::sActiveHeaderRequests--;  	if (status < 200 || status > 400)  	{  		//llwarns @@ -2147,6 +2199,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para  			//first request for this mesh  			mLoadingMeshes[detail][mesh_params].insert(vobj->getID());  			mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail)); +			LLMeshRepository::sLODPending++;  		}  	} @@ -2359,6 +2412,7 @@ void LLMeshRepository::notifyLoadedMeshes()  			LLMeshRepoThread::LODRequest& request = mPendingRequests.front();  			mThread->loadMeshLOD(request.mMeshParams, request.mLOD);  			mPendingRequests.erase(mPendingRequests.begin()); +			LLMeshRepository::sLODPending--;  			push_count--;  		}  	} diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 31b84ea0d9..da81bb057b 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -323,8 +323,8 @@ public:  	virtual void run();  	void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod); -	bool fetchMeshHeader(const LLVolumeParams& mesh_params); -	bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod); +	bool fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count); +	bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count);  	bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size);  	bool lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size);  	bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size); @@ -441,6 +441,8 @@ public:  	static U32 sBytesReceived;  	static U32 sHTTPRequestCount;  	static U32 sHTTPRetryCount; +	static U32 sLODPending; +	static U32 sLODProcessing;  	static U32 sCacheBytesRead;  	static U32 sCacheBytesWritten;  	static U32 sPeakKbps; diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 04e1570081..7a70370fe3 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -29,6 +29,7 @@  #include "llstring.h"  #include "lluuid.h" +#include "llextendedstatus.h"  class LLViewerObject;  class LLMessageSystem; diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 20fcee0814..1f7e7d68c6 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -33,9 +33,9 @@  #include "v3dmath.h"  #include "v4color.h"  #include "llpointer.h" +#include "llcoord.h"  class LLColor4U; -class LLCoordGL;  class LLImageRaw;  class LLViewerTexture;  class LLFloaterMap; diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index ca48e8561b..7a15d93181 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -289,12 +289,12 @@ void LLPanelGroupInvite::impl::callbackClickAdd(void* userdata)  		//Soon the avatar picker will be embedded into this panel  		//instead of being it's own separate floater.  But that is next week.  		//This will do for now. -jwolk May 10, 2006 -		LLFloater* parentp; - -		parentp = gFloaterView->getParentFloater(panelp); -		parentp->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(impl::callbackAddUsers, _1, -																panelp->mImplementation), -																 TRUE)); +		LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( +			boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE); +		if (picker) +		{ +			gFloaterView->getParentFloater(panelp)->addDependentFloater(picker); +		}  	}  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 374afb90be..c3c62920d3 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -567,7 +567,7 @@ void LLPanelMainInventory::updateItemcountText()  	std::string text = ""; -	if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive()) +	if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())  	{  		text = getString("ItemcountFetching", string_args);  	} diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 9c46f04abf..f1380e7a36 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -1162,8 +1162,13 @@ void LLPanelPeople::onAddFriendWizButtonClicked()  {  	// Show add friend wizard.  	LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLPanelPeople::onAvatarPicked, _1, _2), FALSE, TRUE); +	if (!picker) +	{ +		return; +	} +  	// Need to disable 'ok' button when friend occurs in selection -	if (picker)	picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1)); +	picker->setOkBtnEnableCb(boost::bind(&LLPanelPeople::isItemsFreeOfFriends, this, _1));  	LLFloater* root_floater = gFloaterView->getParentFloater(this);  	if (root_floater)  	{ diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 39c0628cbe..76d38f067d 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -818,7 +818,7 @@ bool LLPanelPrimMediaControls::isMouseOver()  		LLCoordGL cursor_pos_gl;  		S32 x, y;  		getWindow()->getCursorPosition(&cursor_pos_window); -		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl); +		cursor_pos_gl = cursor_pos_window.convert();  		if(mMediaControlsStack->getVisible())  		{ diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index 66956181f2..eeb433e306 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -30,9 +30,9 @@  #include "llpanel.h"  #include "llviewermedia.h"  #include "llnotificationptr.h" +#include "llcoord.h"  class LLButton; -class LLCoordWindow;  class LLIconCtrl;  class LLLayoutStack;  class LLProgressBar; diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index 9fbb67a63a..08829c1184 100644 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -83,7 +83,7 @@ void LLPopupView::draw()  			LLUI::pushMatrix();  			{ -				LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f); +				LLUI::translate( (F32) screen_x, (F32) screen_y);  				popup->draw();  			}  			LLUI::popMatrix(); diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 896e17c3c3..759430c3a5 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -32,6 +32,7 @@  #include "llpointer.h"  #include "lluuid.h"  #include "llinventoryobserver.h" +#include "llextendedstatus.h"  #include <map>  class LLInventoryItem; diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 5301955964..d340b304ca 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -195,17 +195,18 @@ LLScreenChannel::~LLScreenChannel()  } -std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher) +std::list<const LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)  { -	std::list<LLToast*> res; +	std::list<const LLToast*> res;  	// collect stored toasts  	for (std::vector<ToastElem>::iterator it = mStoredToastList.begin(); it  			!= mStoredToastList.end(); it++)  	{ -		if (matcher.matches(it->toast->getNotification())) +		const LLToast* toast = it->getToast(); +		if (toast && matcher.matches(toast->getNotification()))  		{ -			res.push_back(it->toast); +			res.push_back(toast);  		}  	} @@ -213,9 +214,10 @@ std::list<LLToast*> LLScreenChannel::findToasts(const Matcher& matcher)  	for (std::vector<ToastElem>::iterator it = mToastList.begin(); it  			!= mToastList.end(); it++)  	{ -		if (matcher.matches(it->toast->getNotification())) +		const LLToast* toast = it->getToast(); +		if (toast && matcher.matches(toast->getNotification()))  		{ -			res.push_back(it->toast); +			res.push_back(toast);  		}  	} @@ -260,15 +262,16 @@ void LLScreenChannel::addToast(const LLToast::Params& p)  		return;  	} -	ToastElem new_toast_elem(p); +	LLToast* toast = new LLToast(p); +	ToastElem new_toast_elem(toast->getHandle()); -	new_toast_elem.toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1)); -	new_toast_elem.toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1)); +	toast->setOnFadeCallback(boost::bind(&LLScreenChannel::onToastFade, this, _1)); +	toast->setOnToastDestroyedCallback(boost::bind(&LLScreenChannel::onToastDestroyed, this, _1));  	if(mControlHovering)  	{ -		new_toast_elem.toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2)); -		new_toast_elem.toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopToastTimer, this, new_toast_elem.toast)); -		new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startToastTimer, this, new_toast_elem.toast)); +		toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2)); +		toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopToastTimer, this, toast)); +		toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startToastTimer, this, toast));  	}  	if(show_toast) @@ -340,13 +343,13 @@ void LLScreenChannel::onToastFade(LLToast* toast)  //--------------------------------------------------------------------------  void LLScreenChannel::deleteToast(LLToast* toast)  { -	if (toast->isDead()) +	if (!toast || toast->isDead())  	{  		return;  	}  	// send signal to observers about destroying of a toast -	toast->mOnDeleteToastSignal(toast); +	toast->closeToast();  	// update channel's Hovering state  	// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard @@ -354,9 +357,6 @@ void LLScreenChannel::deleteToast(LLToast* toast)  	{  		mHoveredToast  = NULL;  	} - -	// close the toast -	toast->closeFloater();  }  //-------------------------------------------------------------------------- @@ -364,12 +364,16 @@ void LLScreenChannel::deleteToast(LLToast* toast)  void LLScreenChannel::storeToast(ToastElem& toast_elem)  {  	// do not store clones -	std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), toast_elem.id); +	std::vector<ToastElem>::iterator it = find(mStoredToastList.begin(), mStoredToastList.end(), toast_elem.getID());  	if( it != mStoredToastList.end() )  		return; -	mStoredToastList.push_back(toast_elem); -	mOnStoreToast(toast_elem.toast->getPanel(), toast_elem.id); +	const LLToast* toast = toast_elem.getToast(); +	if (toast) +	{ +		mStoredToastList.push_back(toast_elem); +		mOnStoreToast(toast->getPanel(), toast->getNotificationID()); +	}  }  //-------------------------------------------------------------------------- @@ -382,9 +386,13 @@ void LLScreenChannel::loadStoredToastsToChannel()  	for(it = mStoredToastList.begin(); it != mStoredToastList.end(); ++it)  	{ -		(*it).toast->setIsHidden(false); -		(*it).toast->startTimer(); -		mToastList.push_back((*it)); +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			toast->setIsHidden(false); +			toast->startTimer(); +			mToastList.push_back(*it); +		}  	}  	mStoredToastList.clear(); @@ -399,17 +407,19 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id)  	if( it == mStoredToastList.end() )  		return; -	LLToast* toast = (*it).toast; - -	if(toast->getVisible()) +	LLToast* toast = it->getToast(); +	if (toast)  	{ -		// toast is already in channel -		return; -	} +		if(toast->getVisible()) +		{ +			// toast is already in channel +			return; +		} -	toast->setIsHidden(false); -	toast->startTimer(); -	mToastList.push_back((*it)); +		toast->setIsHidden(false); +		toast->startTimer(); +		mToastList.push_back(*it); +	}  	redrawToasts();  } @@ -423,9 +433,19 @@ void LLScreenChannel::removeStoredToastByNotificationID(LLUUID id)  	if( it == mStoredToastList.end() )  		return; -	LLToast* toast = (*it).toast; -	mStoredToastList.erase(it); -	mRejectToastSignal(toast->getNotificationID()); +	const LLToast* toast = it->getToast(); +	if (toast) +	{ +		mRejectToastSignal(toast->getNotificationID()); +	} + +	// Call find() once more, because the mStoredToastList could have been changed +	// in mRejectToastSignal callback and the iterator could have become invalid. +	it = find(mStoredToastList.begin(), mStoredToastList.end(), id); +	if (it != mStoredToastList.end()) +	{ +		mStoredToastList.erase(it); +	}  }  //-------------------------------------------------------------------------- @@ -436,21 +456,22 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)  	if( it != mToastList.end())  	{ -		LLToast* toast = (*it).toast; +		LLToast* toast = it->getToast();  		// if it is a notification toast and notification is UnResponded - then respond on it  		// else - simply destroy a toast  		//  		// NOTE:	if a notification is unresponded this function will be called twice for the same toast.  		//			At first, the notification will be discarded, at second (it will be caused by discarding),  		//			the toast will be destroyed. -		if(toast->isNotificationValid()) +		if(toast && toast->isNotificationValid())  		{  			mRejectToastSignal(toast->getNotificationID());  		}  		else  		{ -			mToastList.erase(it); +  			deleteToast(toast); +			mToastList.erase(it);  			redrawToasts();  		}  		return; @@ -459,20 +480,31 @@ void LLScreenChannel::killToastByNotificationID(LLUUID id)  	// searching among stored toasts  	it = find(mStoredToastList.begin(), mStoredToastList.end(), id); -	if( it != mStoredToastList.end() ) +	if (it != mStoredToastList.end()) +	{ +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			// send signal to a listener to let him perform some action on toast rejecting +			mRejectToastSignal(toast->getNotificationID()); +			deleteToast(toast); +		} +	} + +	// Call find() once more, because the mStoredToastList could have been changed +	// in mRejectToastSignal callback and the iterator could have become invalid. +	it = find(mStoredToastList.begin(), mStoredToastList.end(), id); +	if (it != mStoredToastList.end())  	{ -		LLToast* toast = (*it).toast;  		mStoredToastList.erase(it); -		// send signal to a listener to let him perform some action on toast rejecting -		mRejectToastSignal(toast->getNotificationID()); -		deleteToast(toast);  	} +  }  void LLScreenChannel::killMatchedToasts(const Matcher& matcher)  { -	std::list<LLToast*> to_delete = findToasts(matcher); -	for (std::list<LLToast*>::iterator it = to_delete.begin(); it +	std::list<const LLToast*> to_delete = findToasts(matcher); +	for (std::list<const LLToast*>::iterator it = to_delete.begin(); it  			!= to_delete.end(); it++)  	{  		killToastByNotificationID((*it)-> getNotificationID()); @@ -486,12 +518,15 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)  	if( it != mToastList.end() && panel)  	{ -		LLToast* toast = (*it).toast; -		LLPanel* old_panel = toast->getPanel(); -		toast->removeChild(old_panel); -		delete old_panel; -		toast->insertPanel(panel); -		toast->startTimer(); +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			LLPanel* old_panel = toast->getPanel(); +			toast->removeChild(old_panel); +			delete old_panel; +			toast->insertPanel(panel); +			toast->startTimer(); +		}  		redrawToasts();  	}  } @@ -540,16 +575,29 @@ void LLScreenChannel::showToastsBottom()  	{  		if(it != mToastList.rbegin())  		{ -			LLToast* toast = (*(it-1)).toast; +			LLToast* toast = (it-1)->getToast(); +			if (!toast) +			{ +				llwarns << "Attempt to display a deleted toast." << llendl; +				return; +			} +  			bottom = toast->getRect().mTop - toast->getTopPad();  			toast_margin = gSavedSettings.getS32("ToastGap");  		} -		toast_rect = (*it).toast->getRect(); +		LLToast* toast = it->getToast(); +		if(!toast) +		{ +			llwarns << "Attempt to display a deleted toast." << llendl; +			return; +		} + +		toast_rect = toast->getRect();  		toast_rect.setOriginAndSize(getRect().mRight - toast_rect.getWidth(),  				bottom + toast_margin, toast_rect.getWidth(),  				toast_rect.getHeight()); -		(*it).toast->setRect(toast_rect); +		toast->setRect(toast_rect);  		if(floater && floater->overlapsScreenChannel())  		{ @@ -561,7 +609,7 @@ void LLScreenChannel::showToastsBottom()  				{  					shift += floater->getDockControl()->getTongueHeight();  				} -				(*it).toast->translate(0, shift); +				toast->translate(0, shift);  			}  			LLRect channel_rect = getChannelRect(); @@ -572,13 +620,13 @@ void LLScreenChannel::showToastsBottom()  			}  		} -		bool stop_showing_toasts = (*it).toast->getRect().mTop > getRect().mTop; +		bool stop_showing_toasts = toast->getRect().mTop > getRect().mTop;  		if(!stop_showing_toasts)  		{  			if( it != mToastList.rend()-1)  			{ -				S32 toast_top = (*it).toast->getRect().mTop + gSavedSettings.getS32("ToastGap"); +				S32 toast_top = toast->getRect().mTop + gSavedSettings.getS32("ToastGap");  				stop_showing_toasts = toast_top > getRect().mTop;  			}  		}  @@ -592,17 +640,17 @@ void LLScreenChannel::showToastsBottom()  		if(stop_showing_toasts)  			break; -		if( !(*it).toast->getVisible() ) +		if( !toast->getVisible() )  		{  			// HACK  			// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts -			(*it).toast->setVisible(TRUE); +			toast->setVisible(TRUE);  		}		 -		if(!(*it).toast->hasFocus()) +		if(!toast->hasFocus())  		{  			// Fixing Z-order of toasts (EXT-4862)  			// Next toast will be positioned under this one. -			gFloaterView->sendChildToBack((*it).toast); +			gFloaterView->sendChildToBack(toast);  		}  	} @@ -612,7 +660,11 @@ void LLScreenChannel::showToastsBottom()  		mHiddenToastsNum = 0;  		for(; it != mToastList.rend(); it++)  		{ -			(*it).toast->hide(); +			LLToast* toast = it->getToast(); +			if (toast) +			{ +				toast->hide(); +			}  		}  	}  } @@ -620,17 +672,31 @@ void LLScreenChannel::showToastsBottom()  //--------------------------------------------------------------------------  void LLScreenChannel::showToastsCentre()  { -	LLRect	toast_rect;	 -	S32		bottom = (getRect().mTop - getRect().mBottom)/2 + mToastList[0].toast->getRect().getHeight()/2; +	LLToast* toast = mToastList[0].getToast(); +	if (!toast) +	{ +		llwarns << "Attempt to display a deleted toast." << llendl; +		return; +	} + +	LLRect	toast_rect; +	S32		bottom = (getRect().mTop - getRect().mBottom)/2 + toast->getRect().getHeight()/2;  	std::vector<ToastElem>::reverse_iterator it;  	for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)  	{ -		toast_rect = (*it).toast->getRect(); +		LLToast* toast = it->getToast(); +		if (!toast) +		{ +			llwarns << "Attempt to display a deleted toast." << llendl; +			return; +		} + +		toast_rect = toast->getRect();  		toast_rect.setLeftTopAndSize(getRect().mLeft - toast_rect.getWidth() / 2, bottom + toast_rect.getHeight() / 2 + gSavedSettings.getS32("ToastGap"), toast_rect.getWidth() ,toast_rect.getHeight()); -		(*it).toast->setRect(toast_rect); +		toast->setRect(toast_rect); -		(*it).toast->setVisible(TRUE);	 +		toast->setVisible(TRUE);  	}  } @@ -652,16 +718,29 @@ void LLScreenChannel::showToastsTop()  	{  		if(it != mToastList.rbegin())  		{ -			LLToast* toast = (*(it-1)).toast; +			LLToast* toast = (it-1)->getToast(); +			if (!toast) +			{ +				llwarns << "Attempt to display a deleted toast." << llendl; +				return; +			} +  			top = toast->getRect().mBottom - toast->getTopPad();  			toast_margin = gSavedSettings.getS32("ToastGap");  		} -		toast_rect = (*it).toast->getRect(); +		LLToast* toast = it->getToast(); +		if (!toast) +		{ +			llwarns << "Attempt to display a deleted toast." << llendl; +			return; +		} + +		toast_rect = toast->getRect();  		toast_rect.setLeftTopAndSize(channel_rect.mRight - toast_rect.getWidth(),  			top, toast_rect.getWidth(),  			toast_rect.getHeight()); -		(*it).toast->setRect(toast_rect); +		toast->setRect(toast_rect);  		if(floater && floater->overlapsScreenChannel())  		{ @@ -673,7 +752,7 @@ void LLScreenChannel::showToastsTop()  				{  					shift -= floater->getDockControl()->getTongueHeight();  				} -				(*it).toast->translate(0, shift); +				toast->translate(0, shift);  			}  			LLRect channel_rect = getChannelRect(); @@ -684,13 +763,13 @@ void LLScreenChannel::showToastsTop()  			}  		} -		bool stop_showing_toasts = (*it).toast->getRect().mBottom < channel_rect.mBottom; +		bool stop_showing_toasts = toast->getRect().mBottom < channel_rect.mBottom;  		if(!stop_showing_toasts)  		{  			if( it != mToastList.rend()-1)  			{ -				S32 toast_bottom = (*it).toast->getRect().mBottom - gSavedSettings.getS32("ToastGap"); +				S32 toast_bottom = toast->getRect().mBottom - gSavedSettings.getS32("ToastGap");  				stop_showing_toasts = toast_bottom < channel_rect.mBottom;  			}  		}  @@ -704,29 +783,41 @@ void LLScreenChannel::showToastsTop()  		if(stop_showing_toasts)  			break; -		if( !(*it).toast->getVisible() ) +		if (!toast->getVisible())  		{  			// HACK  			// EXT-2653: it is necessary to prevent overlapping for secondary showed toasts -			(*it).toast->setVisible(TRUE); +			toast->setVisible(TRUE);  		}		 -		if(!(*it).toast->hasFocus()) +		if (!toast->hasFocus())  		{  			// Fixing Z-order of toasts (EXT-4862)  			// Next toast will be positioned under this one. -			gFloaterView->sendChildToBack((*it).toast); +			gFloaterView->sendChildToBack(toast);  		}  	}  	// Dismiss toasts we don't have space for (STORM-391). +	std::vector<LLToast*> toasts_to_hide;  	if(it != mToastList.rend())  	{  		mHiddenToastsNum = 0;  		for(; it != mToastList.rend(); it++)  		{ -			(*it).toast->hide(); +			LLToast* toast = it->getToast(); +			if (toast) +			{ +				toasts_to_hide.push_back(toast); +			}  		}  	} + +	for (std::vector<LLToast*>::iterator it = toasts_to_hide.begin(), end_it = toasts_to_hide.end(); +		it != end_it; +		++it) +	{ +		(*it)->hide(); +	}  }  //-------------------------------------------------------------------------- @@ -827,7 +918,17 @@ void LLNotificationsUI::LLScreenChannel::startToastTimer(LLToast* toast)  void LLScreenChannel::hideToastsFromScreen()  {  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++) -		(*it).toast->setVisible(FALSE); +	{ +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			toast->setVisible(FALSE); +		} +		else +		{ +			llwarns << "Attempt to hide a deleted toast." << llendl; +		} +	}  }  //-------------------------------------------------------------------------- @@ -836,8 +937,15 @@ void LLScreenChannel::hideToast(const LLUUID& notification_id)  	std::vector<ToastElem>::iterator it = find(mToastList.begin(), mToastList.end(), notification_id);  	if(mToastList.end() != it)  	{ -		ToastElem te = *it; -		te.toast->hide(); +		LLToast* toast = it->getToast(); +		if (toast) +		{ +			toast->hide(); +		} +		else +		{ +			llwarns << "Attempt to hide a deleted toast." << llendl; +		}  	}  } @@ -845,24 +953,25 @@ void LLScreenChannel::closeHiddenToasts(const Matcher& matcher)  {  	// since we can't guarantee that close toast operation doesn't change mToastList  	// we collect matched toasts that should be closed into separate list -	std::list<ToastElem> toasts; +	std::list<LLToast*> toasts;  	for (std::vector<ToastElem>::iterator it = mToastList.begin(); it  			!= mToastList.end(); it++)  	{ -		LLToast * toast = it->toast; +		LLToast* toast = it->getToast();  		// add to list valid toast that match to provided matcher criteria  		if (toast != NULL && !toast->isDead() && toast->getNotification() != NULL  				&& !toast->getVisible() && matcher.matches(toast->getNotification()))  		{ -			toasts.push_back(*it); +			toasts.push_back(toast);  		}  	}  	// close collected toasts -	for (std::list<ToastElem>::iterator it = toasts.begin(); it +	for (std::list<LLToast*>::iterator it = toasts.begin(); it  			!= toasts.end(); it++)  	{ -		it->toast->closeFloater(); +		LLToast* toast = *it; +		toast->closeFloater();  	}  } @@ -872,7 +981,7 @@ void LLScreenChannel::removeToastsFromChannel()  	hideToastsFromScreen();  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end(); it++)  	{ -		deleteToast((*it).toast); +		deleteToast(it->getToast());  	}  	mToastList.clear();  } @@ -886,9 +995,10 @@ void LLScreenChannel::removeAndStoreAllStorableToasts()  	hideToastsFromScreen();  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end();)  	{ -		if((*it).toast->getCanBeStored()) +		LLToast* toast = it->getToast(); +		if(toast && toast->getCanBeStored())  		{ -			storeToast(*(it)); +			storeToast(*it);  			it = mToastList.erase(it);  		}  		else @@ -908,9 +1018,10 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id)  	hideToastsFromScreen();  	for(std::vector<ToastElem>::iterator it = mToastList.begin(); it != mToastList.end();)  	{ -		if((*it).toast->getSessionID() == id) +		LLToast* toast = it->getToast(); +		if(toast && toast->getSessionID() == id)  		{ -			deleteToast((*it).toast); +			deleteToast(toast);  			it = mToastList.erase(it);  		}  		else @@ -968,5 +1079,5 @@ LLToast* LLScreenChannel::getToastByNotificationID(LLUUID id)  	if (it == mStoredToastList.end())  		return NULL; -	return it->toast; +	return it->getToast();  } diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index c9f8855fe6..695b6cd44d 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -163,7 +163,7 @@ public:  		virtual bool matches(const LLNotificationPtr) const = 0;  	}; -	std::list<LLToast*> findToasts(const Matcher& matcher); +	std::list<const LLToast*> findToasts(const Matcher& matcher);  	// Channel's outfit-functions  	// update channel's size and position in the World View @@ -238,31 +238,39 @@ public:  	reject_tost_signal_t mRejectToastSignal; boost::signals2::connection setOnRejectToastCallback(reject_tost_callback_t cb) { return mRejectToastSignal.connect(cb); }  private: -	struct ToastElem +	class ToastElem  	{ -		LLUUID		id; -		LLToast*	toast; +	public: +		ToastElem(const LLHandle<LLToast>& toast) : mToast(toast) +		{ +		} -		ToastElem(LLToast::Params p) : id(p.notif_id) +		ToastElem(const ToastElem& toast_elem) : mToast(toast_elem.mToast)  		{ -			toast = new LLToast(p);  		} -		ToastElem(const ToastElem& toast_elem) +		LLToast* getToast() const  		{ -			id = toast_elem.id; -			toast = toast_elem.toast; +			return mToast.get(); +		} + +		LLUUID getID() const +		{ +			return mToast.isDead() ? LLUUID() : mToast.get()->getNotificationID();  		}  		bool operator == (const LLUUID &id_op) const  		{ -			return (id == id_op); +			return (getID() == id_op);  		}  		bool operator == (LLPanel* panel_op) const  		{ -			return (toast == panel_op); +			return (mToast.get() == panel_op);  		} + +	private: +		LLHandle<LLToast>	mToast;  	};  	// Channel's handlers diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 5d0d1ef9a3..6111255a66 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -5556,38 +5556,37 @@ BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power)  //helper function for pushing relevant vertices from drawable to GL  void pushWireframe(LLDrawable* drawable)  { -	if (drawable->isState(LLDrawable::RIGGED)) -	{ //render straight from rigged volume if this is a rigged attachment -		LLVOVolume* vobj = drawable->getVOVolume(); -		if (vobj) -		{ -			vobj->updateRiggedVolume(); -			LLRiggedVolume* rigged_volume = vobj->getRiggedVolume(); -			if (rigged_volume) -			{ -				LLVertexBuffer::unbind(); -				gGL.pushMatrix(); -				gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix); -				for (S32 i = 0; i < rigged_volume->getNumVolumeFaces(); ++i) -				{ -					const LLVolumeFace& face = rigged_volume->getVolumeFace(i); -					LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices); -				} -				gGL.popMatrix(); -			} -		} -	} -	else +	LLVOVolume* vobj = drawable->getVOVolume(); +	if (vobj)  	{ -		for (S32 i = 0; i < drawable->getNumFaces(); ++i) +		LLVertexBuffer::unbind(); +		gGL.pushMatrix(); +		gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix); + +		LLVolume* volume = NULL; + +		if (drawable->isState(LLDrawable::RIGGED)) +		{ +				vobj->updateRiggedVolume(); +				volume = vobj->getRiggedVolume(); +		} +		else +		{ +			volume = vobj->getVolume(); +		} + +		if (volume)  		{ -			LLFace* face = drawable->getFace(i); -			if (face->verify()) +			for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)  			{ -				pushVerts(face, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); +				const LLVolumeFace& face = volume->getVolumeFace(i); +				LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices);  			}  		} + +		gGL.popMatrix();  	} +	  }  void LLSelectNode::renderOneWireframe(const LLColor4& color) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 900f126049..5d196a465f 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -264,7 +264,7 @@ static LLFastTimer::DeclareTimer FTM_BUILD_OCCLUSION("Build Occlusion");  void LLSpatialGroup::buildOcclusion()  { -	if (mOcclusionVerts.isNull()) +	//if (mOcclusionVerts.isNull())  	{  		mOcclusionVerts = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX,   			LLVertexBuffer::sUseStreamDraw ? mBufferUsage : 0); //if GL has a hard time with VBOs, don't use them for occlusion culling. @@ -726,7 +726,9 @@ void LLSpatialPartition::rebuildGeom(LLSpatialGroup* group)  	if (vertex_count > 0 && index_count > 0)  	{ //create vertex buffer containing volume geometry for this node  		group->mBuilt = 1.f; -		if (group->mVertexBuffer.isNull() || (group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs)) +		if (group->mVertexBuffer.isNull() || +			!group->mVertexBuffer->isWriteable() || +			(group->mBufferUsage != group->mVertexBuffer->getUsage() && LLVertexBuffer::sEnableVBOs))  		{  			group->mVertexBuffer = createVertexBuffer(mVertexDataMask, group->mBufferUsage);  			group->mVertexBuffer->allocateBuffer(vertex_count, index_count, true); @@ -1185,6 +1187,8 @@ void LLSpatialGroup::clearOcclusionState(U32 state, S32 mode)  LLSpatialGroup::LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part) :  	mState(0), +	mGeometryBytes(0), +	mSurfaceArea(0.f),  	mBuilt(0.f),  	mOctreeNode(node),  	mSpatialPartition(part), @@ -1410,6 +1414,17 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)  		}  	} +	//clean up avatar attachment stats +	LLSpatialBridge* bridge = mSpatialPartition->asBridge(); +	if (bridge) +	{ +		if (bridge->mAvatar.notNull()) +		{ +			bridge->mAvatar->mAttachmentGeometryBytes -= mGeometryBytes; +			bridge->mAvatar->mAttachmentSurfaceArea -= mSurfaceArea; +		} +	} +  	clearDrawMap();  	mVertexBuffer = NULL;  	mBufferMap.clear(); @@ -1765,7 +1780,7 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera)  //==============================================  LLSpatialPartition::LLSpatialPartition(U32 data_mask, BOOL render_by_group, U32 buffer_usage) -: mRenderByGroup(render_by_group) +: mRenderByGroup(render_by_group), mBridge(NULL)  {  	LLMemType mt(LLMemType::MTYPE_SPACE_PARTITION);  	mOcclusionEnabled = TRUE; diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 899547ae4d..6c14ecf452 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -405,6 +405,9 @@ public:  	bridge_list_t mBridgeList;  	buffer_map_t mBufferMap; //used by volume buffers to attempt to reuse vertex buffers +	U32 mGeometryBytes; //used by volumes to track how many bytes of geometry data are in this node +	F32 mSurfaceArea; //used by volumes to track estimated surface area of geometry in this node +  	F32 mBuilt;  	OctreeNode* mOctreeNode;  	LLSpatialPartition* mSpatialPartition; @@ -474,8 +477,8 @@ public:  	BOOL isVisible(const LLVector3& v);  	bool isHUDPartition() ; -	virtual LLSpatialBridge* asBridge() { return NULL; } -	virtual BOOL isBridge() { return asBridge() != NULL; } +	LLSpatialBridge* asBridge() { return mBridge; } +	BOOL isBridge() { return asBridge() != NULL; }  	void renderPhysicsShapes();  	void renderDebug(); @@ -487,6 +490,9 @@ public:  public:  	LLSpatialGroup::OctreeNode* mOctree; +	LLSpatialBridge* mBridge; // NULL for non-LLSpatialBridge instances, otherwise, mBridge == this +							// use a pointer instead of making "isBridge" and "asBridge" virtual so it's safe +							// to call asBridge() from the destructor  	BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed  	BOOL mInfiniteFarClip; // if TRUE, frustum culling ignores far clip plane  	U32 mBufferUsage; @@ -511,8 +517,9 @@ public:  	LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask); -	virtual BOOL isSpatialBridge() const		{ return TRUE; } +	void destroyTree(); +	virtual BOOL isSpatialBridge() const		{ return TRUE; }  	virtual void updateSpatialExtents();  	virtual void updateBinRadius();  	virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE); @@ -523,11 +530,12 @@ public:  	virtual void shiftPos(const LLVector4a& vec);  	virtual void cleanupReferences();  	virtual LLSpatialPartition* asPartition()		{ return this; } -	virtual LLSpatialBridge* asBridge()				{ return this; } -	 +		  	virtual LLCamera transformCamera(LLCamera& camera);  	LLDrawable* mDrawable; +	LLPointer<LLVOAvatar> mAvatar; +  };  class LLCullResult  diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 3923b4510a..0ac8c1fe39 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -880,7 +880,6 @@ bool idle_startup()  		LLFile::mkdir(gDirUtilp->getLindenUserDir());  		// Set PerAccountSettingsFile to the default value. -		std::string per_account_settings_file = LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount");  		gSavedSettings.setString("PerAccountSettingsFile",  			gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,   				LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount"))); diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h index 85dadb213c..4f43547dae 100644 --- a/indra/newview/lltexlayer.h +++ b/indra/newview/lltexlayer.h @@ -261,6 +261,8 @@ private:  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  class LLTexLayerSetBuffer : public LLViewerDynamicTexture  { +	LOG_CLASS(LLTexLayerSetBuffer); +  public:  	LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);  	virtual ~LLTexLayerSetBuffer(); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index de22f2ae6b..e26d2e001c 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -922,7 +922,7 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p)  	S32 image_top = getRect().getHeight();  	S32 image_bottom = BTN_HEIGHT_SMALL;  	S32 image_middle = (image_top + image_bottom) / 2; -	S32 line_height = llround(LLFontGL::getFontSansSerifSmall()->getLineHeight()); +	S32 line_height = LLFontGL::getFontSansSerifSmall()->getLineHeight();  	LLTextBox::Params tentative_label_p(p.multiselect_text);  	tentative_label_p.name("Multiple"); diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 1c89766b26..5b41a05f2a 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -386,7 +386,7 @@ public:  		Params()  		:	texture_view("texture_view")  		{ -			S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +			S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  			changeDefault(rect, LLRect(0,0,100,line_height * 4));  		}  	}; @@ -411,7 +411,7 @@ void LLAvatarTexBar::draw()  	LLVOAvatarSelf* avatarp = gAgentAvatarp;  	if (!avatarp) return; -	const S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	const S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	const S32 v_offset = 0;  	const S32 l_offset = 3; @@ -485,7 +485,7 @@ public:  		Params()  		:	texture_view("texture_view")  		{ -			S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +			S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  			changeDefault(rect, LLRect(0,0,100,line_height * 4));  		}  	}; @@ -512,7 +512,7 @@ void LLGLTexMemBar::draw()  	F32 discard_bias = LLViewerTexture::sDesiredDiscardBias;  	F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ;  	F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ; -	S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	S32 v_offset = (S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);  	F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024);  	F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024); @@ -1097,7 +1097,7 @@ void LLTextureSizeView::drawTextureSizeGraph()  {  	if(mTextureSizeBar.size() == 0)  	{ -		S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +		S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  		mTextureSizeBar.resize(LLImageGL::sTextureLoadedCounter.size()) ;  		mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ; @@ -1140,7 +1140,7 @@ F32 LLTextureSizeView::drawTextureSizeDistributionGraph()  		}  	} -	S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	S32 left = mTextureSizeBarRect.mLeft ;  	S32 bottom = mTextureSizeBarRect.mBottom ;  	S32 right = mTextureSizeBarRect.mRight ; @@ -1222,7 +1222,7 @@ void LLTextureSizeView::drawTextureCategoryGraph()  {  	if(mTextureSizeBar.size() == 0)  	{ -		S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +		S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  		mTextureSizeBar.resize(LLViewerTexture::getTotalNumOfCategories()) ;  		mTextureSizeBarRect.set(700, line_height * 2 + 400, 700 + mTextureSizeBar.size() * mTextureSizeBarWidth, line_height * 2) ; @@ -1267,7 +1267,7 @@ F32 LLTextureSizeView::drawTextureCategoryDistributionGraph()  		}  	} -	S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); +	S32 line_height = LLFontGL::getFontMonospace()->getLineHeight();  	S32 left = mTextureSizeBarRect.mLeft ;  	S32 bottom = mTextureSizeBarRect.mBottom ;  	S32 right = mTextureSizeBarRect.mRight ; diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 21120a1b8d..0eec7f0afd 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -180,11 +180,14 @@ LLToast::~LLToast()  //--------------------------------------------------------------------------  void LLToast::hide()  { -	setVisible(FALSE); -	setFading(false); -	mTimer->stop(); -	mIsHidden = true; -	mOnFadeSignal(this);  +	if (!mIsHidden) +	{ +		setVisible(FALSE); +		setFading(false); +		mTimer->stop(); +		mIsHidden = true; +		mOnFadeSignal(this);  +	}  }  void LLToast::onFocusLost() @@ -215,6 +218,13 @@ void LLToast::setFadingTime(S32 seconds)  	mToastFadingTime = seconds;  } +void LLToast::closeToast() +{ +	mOnDeleteToastSignal(this); + +	closeFloater(); +} +  S32 LLToast::getTopPad()  {  	if(mWrapperPanel) diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index 0b06728935..e1d99b1bcb 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -75,6 +75,7 @@ class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>  public:  	typedef boost::function<void (LLToast* toast)> toast_callback_t;  	typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t; +	typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t;  	struct Params : public LLInitParam::Block<Params>  	{ @@ -131,7 +132,7 @@ public:  	void reshapeToPanel();  	// get toast's panel -	LLPanel* getPanel() { return mPanel; } +	LLPanel* getPanel() const { return mPanel; }  	// enable/disable Toast's Hide button  	void setHideButtonEnabled(bool enabled);  	// @@ -155,6 +156,8 @@ public:  	void setFadingTime(S32 seconds); +	void closeToast(); +  	/**  	 * Returns padding between floater top and wrapper_panel top.  	 * This padding should be taken into account when positioning or reshaping toasts @@ -167,9 +170,9 @@ public:  	// get information whether the notification corresponding to the toast is valid or not  	bool isNotificationValid();  	// get toast's Notification ID -	const LLUUID getNotificationID() { return mNotificationID;} +	const LLUUID getNotificationID() const { return mNotificationID;}  	// get toast's Session ID -	const LLUUID getSessionID() { return mSessionID;} +	const LLUUID getSessionID() const { return mSessionID;}  	//  	void setCanFade(bool can_fade);  	// @@ -179,19 +182,12 @@ public:  	// set whether this toast considered as hidden or not  	void setIsHidden( bool is_toast_hidden ) { mIsHidden = is_toast_hidden; } -	const LLNotificationPtr& getNotification() { return mNotification;} +	const LLNotificationPtr& getNotification() const { return mNotification;}  	// Registers signals/callbacks for events -	toast_signal_t mOnFadeSignal; -	toast_signal_t mOnDeleteToastSignal; -	toast_signal_t mOnToastDestroyedSignal; -	boost::signals2::connection setOnFadeCallback(toast_callback_t cb) { return mOnFadeSignal.connect(cb); } -	boost::signals2::connection setOnToastDestroyedCallback(toast_callback_t cb) { return mOnToastDestroyedSignal.connect(cb); } - -	typedef boost::function<void (LLToast* toast, bool mouse_enter)> toast_hover_check_callback_t; -	typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t; -	toast_hover_check_signal_t mOnToastHoverSignal;	 -	boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); } +	boost::signals2::connection setOnFadeCallback(const toast_signal_t::slot_type& cb) { return mOnFadeSignal.connect(cb); } +	boost::signals2::connection setOnToastDestroyedCallback(const toast_signal_t::slot_type& cb) { return mOnToastDestroyedSignal.connect(cb); } +	boost::signals2::connection setOnToastHoverCallback(const toast_hover_check_signal_t::slot_type& cb) { return mOnToastHoverSignal.connect(cb); }  	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };  	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); }; @@ -237,6 +233,11 @@ private:  	bool		mIsFading;  	bool		mIsHovered; +	toast_signal_t mOnFadeSignal; +	toast_signal_t mOnDeleteToastSignal; +	toast_signal_t mOnToastDestroyedSignal; +	toast_hover_check_signal_t mOnToastHoverSignal; +  	commit_signal_t mToastMouseEnterSignal;  	commit_signal_t mToastMouseLeaveSignal;  }; diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 0f337825e9..9ba8431fde 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -69,8 +69,22 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  		mLabel(notification->getName()),  		mLineEditor(NULL)  { +	// EXP-1822 +	// save currently focused view, so that return focus to it +	// on destroying this toast. +	LLView* current_selection = dynamic_cast<LLView*>(gFocusMgr.getKeyboardFocus()); +	while(current_selection) +	{ +		if (current_selection->isFocusRoot()) +		{ +			mPreviouslyFocusedView = current_selection->getHandle(); +			break; +		} +		current_selection = current_selection->getParent(); +	} +  	const LLFontGL* font = LLFontGL::getFontSansSerif(); -	const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f); +	const S32 LINE_HEIGHT = font->getLineHeight();  	const S32 EDITOR_HEIGHT = 20;  	LLNotificationFormPtr form = mNotification->getForm(); @@ -365,7 +379,7 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::  	}  	const LLFontGL* font =  mCheck->getFont(); -	const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f); +	const S32 LINE_HEIGHT = font->getLineHeight();  	// Extend dialog for "check next time"  	S32 max_msg_width = LLToastPanel::getRect().getWidth() - 2 * HPAD; @@ -408,6 +422,13 @@ LLToastAlertPanel::~LLToastAlertPanel()  {  	LLTransientFloaterMgr::instance().removeControlView(  			LLTransientFloaterMgr::GLOBAL, this); + +	// EXP-1822 +	// return focus to the previously focused view +	if (mPreviouslyFocusedView.get()) +	{ +		mPreviouslyFocusedView.get()->setFocus(TRUE); +	}  }  BOOL LLToastAlertPanel::hasTitleBar() const diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h index 7b157f19bb..d1be5e018e 100644 --- a/indra/newview/lltoastalertpanel.h +++ b/indra/newview/lltoastalertpanel.h @@ -113,6 +113,7 @@ private:  	LLFrameTimer	mDefaultBtnTimer;  	// For Dialogs that take a line as text as input:  	LLLineEditor* mLineEditor; +	LLHandle<LLView>	mPreviouslyFocusedView;  }; diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index fc69157a40..d2a4ce8745 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -68,7 +68,7 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)  	if (message->getVisible())  	{  		S32 heightDelta = 0; -		S32 maxTextHeight = (S32)(message->getDefaultFont()->getLineHeight() * maxLineCount); +		S32 maxTextHeight = message->getDefaultFont()->getLineHeight() * maxLineCount;  		LLRect messageRect = message->getRect();  		S32 oldTextHeight = messageRect.getHeight(); diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index f3637756fe..4f4eef0f3d 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -334,14 +334,15 @@ LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()  };  LLToolDragAndDrop::LLToolDragAndDrop() -:	 LLTool(std::string("draganddrop"), NULL), -	 mDragStartX(0), -	 mDragStartY(0), -	 mSource(SOURCE_AGENT), -	 mCursor(UI_CURSOR_NO), -	 mLastAccept(ACCEPT_NO), -	 mDrop(FALSE), -	 mCurItemIndex(0) +:	LLTool(std::string("draganddrop"), NULL), +	mCargoCount(0), +	mDragStartX(0), +	mDragStartY(0), +	mSource(SOURCE_AGENT), +	mCursor(UI_CURSOR_NO), +	mLastAccept(ACCEPT_NO), +	mDrop(FALSE), +	mCurItemIndex(0)  {  } diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 188d36cd1b..245c2a23e6 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -86,8 +86,11 @@ public:  	EAcceptance getLastAccept() { return mLastAccept; }  	boost::signals2::connection setEndDragCallback( const enddrag_signal_t::slot_type& cb ) { return mEndDragSignal.connect(cb); } -	 -	uuid_vec_t::size_type getCargoIDsCount() const { return mCargoIDs.size(); } + +	void setCargoCount(U32 count) { mCargoCount = count; } +	void resetCargoCount() { mCargoCount = 0; } +	U32 getCargoCount() const { return (mCargoCount > 0) ? mCargoCount : mCargoIDs.size(); } +  	static S32 getOperationId() { return sOperationId; }  protected: @@ -118,6 +121,8 @@ protected:  protected: +	U32				mCargoCount; +  	S32				mDragStartX;  	S32				mDragStartY; diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp index df7c5be0d6..e59064c074 100644 --- a/indra/newview/lluploaddialog.cpp +++ b/indra/newview/lluploaddialog.cpp @@ -115,7 +115,7 @@ void LLUploadDialog::setMessage( const std::string& msg)  		token = strtok( NULL, "\n" );  	} -	S32 line_height = S32( font->getLineHeight() + 0.99f ); +	S32 line_height = font->getLineHeight();  	S32 dialog_width = max_msg_width + 2 * HPAD;  	S32 dialog_height = line_height * msg_lines.size() + 2 * VPAD; diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h index cc3395115b..184033de42 100644 --- a/indra/newview/llviewercamera.h +++ b/indra/newview/llviewercamera.h @@ -32,8 +32,8 @@  #include "llstat.h"  #include "lltimer.h"  #include "m4math.h" +#include "llcoord.h" -class LLCoordGL;  class LLViewerObject;  // This rotation matrix moves the default OpenGL reference frame  diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index cf52b5165b..45ca23cdfe 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -436,11 +436,6 @@ void LLViewerInventoryItem::fetchFromServer(void) const  			gAgent.sendReliableMessage();  		}  	} -	else -	{ -		// *FIX: this can be removed after a bit. -		llwarns << "request to fetch complete item" << llendl; -	}  }  // virtual diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 046360e9e9..1eb4bedfaf 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -387,7 +387,6 @@ class LLViewerMediaMuteListObserver : public LLMuteListObserver  static LLViewerMediaMuteListObserver sViewerMediaMuteListObserver;  static bool sViewerMediaMuteListObserverInitialized = false; -static bool sInWorldMediaDisabled = false;  ////////////////////////////////////////////////////////////////////////////////////////// @@ -654,20 +653,6 @@ void LLViewerMedia::muteListChanged()  //////////////////////////////////////////////////////////////////////////////////////////  // static -void LLViewerMedia::setInWorldMediaDisabled(bool disabled) -{ -	sInWorldMediaDisabled = disabled; -} - -////////////////////////////////////////////////////////////////////////////////////////// -// static -bool LLViewerMedia::getInWorldMediaDisabled() -{ -	return sInWorldMediaDisabled; -} - -////////////////////////////////////////////////////////////////////////////////////////// -// static  bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &object_interest)  {  	bool result = false; @@ -1568,7 +1553,6 @@ LLPluginClassMedia* LLViewerMedia::getSpareBrowserMediaSource()  bool LLViewerMedia::hasInWorldMedia()  { -	if (sInWorldMediaDisabled) return false;  	impl_list::iterator iter = sViewerMediaImplList.begin();  	impl_list::iterator end = sViewerMediaImplList.end();  	// This should be quick, because there should be very few non-in-world-media impls @@ -1901,7 +1885,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_  		}  	} -	LL_WARNS_ONCE("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL; +	LL_WARNS_ONCE("Plugin") << "plugin initialization failed for mime type: " << media_type << LL_ENDL;  	LLSD args;  	args["MIME_TYPE"] = media_type;  	LLNotificationsUtil::add("NoPlugin", args); @@ -3107,15 +3091,6 @@ bool LLViewerMediaImpl::isForcedUnloaded() const  		return true;  	} -	if(sInWorldMediaDisabled) -	{ -		// When inworld media is disabled, all instances that aren't marked as "used in UI" will not be loaded. -		if(!mUsedInUI) -		{ -			return true; -		} -	} -	  	// If this media's class is not supposed to be shown, unload  	if (!shouldShowBasedOnClass())  	{ @@ -3783,12 +3758,22 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const  	// If it is attached to an avatar and the pref is off, we shouldn't show it  	if (attached_to_another_avatar) -		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING); -	 +	{ +		static LLCachedControl<bool> show_media_on_others(gSavedSettings, LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING); +		return show_media_on_others; +	}  	if (inside_parcel) -		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING); +	{ +		static LLCachedControl<bool> show_media_within_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING); + +		return show_media_within_parcel; +	}  	else  -		return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING); +	{ +		static LLCachedControl<bool> show_media_outside_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING); + +		return show_media_outside_parcel; +	}  }  ////////////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 15dcda59cf..fff5b3fc08 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -112,9 +112,6 @@ public:  	static F32 getVolume();	  	static void muteListChanged(); -	static void setInWorldMediaDisabled(bool disabled); -	static bool getInWorldMediaDisabled(); -	  	static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest);  	// Returns the priority-sorted list of all media impls. diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 4a71e6fc8e..37cf916423 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -25,6 +25,11 @@   */  #include "llviewerprecompiledheaders.h" + +#ifdef INCLUDE_VLD +#include "vld.h" +#endif +  #include "llviewermenu.h"   // linden library includes @@ -214,7 +219,7 @@ void near_sit_down_point(BOOL success, void *);  void velocity_interpolate( void* ); - +void handle_visual_leak_detector_toggle(void*);  void handle_rebake_textures(void*);  BOOL check_admin_override(void*);  void handle_admin_override_toggle(void*); @@ -947,6 +952,10 @@ U32 info_display_from_string(std::string info_display)  	{  		return LLPipeline::RENDER_DEBUG_COMPOSITION;  	} +	else if ("attachment bytes" == info_display) +	{ +		return LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES; +	}  	else if ("glow" == info_display)  	{  		return LLPipeline::RENDER_DEBUG_GLOW; @@ -2014,6 +2023,15 @@ class LLAdvancedToggleViewAdminOptions : public view_listener_t  	}  }; +class LLAdvancedToggleVisualLeakDetector : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		handle_visual_leak_detector_toggle(NULL); +		return true; +	} +}; +  class LLAdvancedCheckViewAdminOptions : public view_listener_t  {  	bool handleEvent(const LLSD& userdata) @@ -2786,8 +2804,31 @@ bool enable_object_mute()  	else  	{  		// Just a regular object -		return LLSelectMgr::getInstance()->getSelection()-> -			contains( object, SELECT_ALL_TES ); +		return LLSelectMgr::getInstance()->getSelection()->contains( object, SELECT_ALL_TES ) && +			   !LLMuteList::getInstance()->isMuted(object->getID()); +	} +} + +bool enable_object_unmute() +{ +	LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); +	if (!object) return false; + +	LLVOAvatar* avatar = find_avatar_from_object(object);  +	if (avatar) +	{ +		// It's an avatar +		LLNameValue *lastname = avatar->getNVPair("LastName"); +		bool is_linden = +			lastname && !LLStringUtil::compareStrings(lastname->getString(), "Linden"); +		bool is_self = avatar->isSelf(); +		return !is_linden && !is_self; +	} +	else +	{ +		// Just a regular object +		return LLSelectMgr::getInstance()->getSelection()->contains( object, SELECT_ALL_TES ) && +			   LLMuteList::getInstance()->isMuted(object->getID());;  	}  } @@ -3417,6 +3458,35 @@ void handle_admin_override_toggle(void*)  	show_debug_menus();  } +void handle_visual_leak_detector_toggle(void*) +{ +	static bool vld_enabled = false; + +	if ( vld_enabled ) +	{ +#ifdef INCLUDE_VLD +		// only works for debug builds (hard coded into vld.h) +#ifdef _DEBUG +		// start with Visual Leak Detector turned off +		VLDDisable(); +#endif // _DEBUG +#endif // INCLUDE_VLD +		vld_enabled = false; +	} +	else +	{ +#ifdef INCLUDE_VLD +		// only works for debug builds (hard coded into vld.h) +	#ifdef _DEBUG +		// start with Visual Leak Detector turned off +		VLDEnable(); +	#endif // _DEBUG +#endif // INCLUDE_VLD + +		vld_enabled = true; +	}; +} +  void handle_god_mode(void*)  {  	gAgent.requestEnterGodMode(); @@ -8210,6 +8280,8 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedEnableViewAdminOptions(), "Advanced.EnableViewAdminOptions");  	view_listener_t::addMenu(new LLAdvancedToggleViewAdminOptions(), "Advanced.ToggleViewAdminOptions");  	view_listener_t::addMenu(new LLAdvancedCheckViewAdminOptions(), "Advanced.CheckViewAdminOptions"); +	view_listener_t::addMenu(new LLAdvancedToggleVisualLeakDetector(), "Advanced.ToggleVisualLeakDetector"); +  	view_listener_t::addMenu(new LLAdvancedRequestAdminStatus(), "Advanced.RequestAdminStatus");  	view_listener_t::addMenu(new LLAdvancedLeaveAdminStatus(), "Advanced.LeaveAdminStatus"); @@ -8302,6 +8374,7 @@ void initialize_menus()  	enable.add("Avatar.EnableMute", boost::bind(&enable_object_mute));  	enable.add("Object.EnableMute", boost::bind(&enable_object_mute)); +	enable.add("Object.EnableUnmute", boost::bind(&enable_object_unmute));  	enable.add("Object.EnableBuy", boost::bind(&enable_buy_object));  	commit.add("Object.ZoomIn", boost::bind(&handle_look_at_selection, "zoom")); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 716f47150e..17c7644ec4 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -6843,12 +6843,14 @@ void process_covenant_reply(LLMessageSystem* msg, void**)  	LLPanelEstateCovenant::updateEstateName(estate_name);  	LLPanelLandCovenant::updateEstateName(estate_name); +	LLPanelEstateInfo::updateEstateName(estate_name);  	LLFloaterBuyLand::updateEstateName(estate_name);  	std::string owner_name =  		LLSLURL("agent", estate_owner_id, "inspect").getSLURLString();  	LLPanelEstateCovenant::updateEstateOwnerName(owner_name);  	LLPanelLandCovenant::updateEstateOwnerName(owner_name); +	LLPanelEstateInfo::updateEstateOwnerName(owner_name);  	LLFloaterBuyLand::updateEstateOwnerName(owner_name);  	LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile"); diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index d8acd99953..46bfb2dad0 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -35,6 +35,7 @@  #include "message.h"  #include "stdenums.h"  #include "llnotifications.h" +#include "llextendedstatus.h"  //  // Forward declarations diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b8772971aa..37fb77a10a 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5520,11 +5520,12 @@ void LLViewerObject::dirtyMesh()  {  	if (mDrawable)  	{ -		LLSpatialGroup* group = mDrawable->getSpatialGroup(); +		gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_ALL); +		/*LLSpatialGroup* group = mDrawable->getSpatialGroup();  		if (group)  		{  			group->dirtyMesh(); -		} +		}*/  	}  } diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index b41ed00f17..99102309a1 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -187,7 +187,7 @@ public:  		else  		{  			width = EMBEDDED_ITEM_LABEL_PADDING + mImage->getWidth() + mStyle->getFont()->getWidth(mLabel.c_str()); -			height = llmax(mImage->getHeight(), llceil(mStyle->getFont()->getLineHeight())); +			height = llmax(mImage->getHeight(), mStyle->getFont()->getLineHeight());  		}  		return false;  	} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 5730a55a9b..9a9f8fd013 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -27,9 +27,6 @@  #include "llviewerprecompiledheaders.h"  #include "llviewerwindow.h" -#if LL_WINDOWS -#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally -#endif  // system library includes  #include <stdio.h> @@ -49,7 +46,6 @@  #include "llviewquery.h"  #include "llxmltree.h"  #include "llslurl.h" -//#include "llviewercamera.h"  #include "llrender.h"  #include "llvoiceclient.h"	// for push-to-talk button handling @@ -613,7 +609,9 @@ public:  				addText(xpos, ypos, llformat("%d/%d Mesh HTTP Requests/Retries", LLMeshRepository::sHTTPRequestCount,  					LLMeshRepository::sHTTPRetryCount)); +				ypos += y_inc; +				addText(xpos, ypos, llformat("%d/%d Mesh LOD Pending/Processing", LLMeshRepository::sLODPending, LLMeshRepository::sLODProcessing));  				ypos += y_inc;  				addText(xpos, ypos, llformat("%.3f/%.3f MB Mesh Cache Read/Write ", LLMeshRepository::sCacheBytesRead/(1024.f*1024.f), LLMeshRepository::sCacheBytesWritten/(1024.f*1024.f))); @@ -1538,14 +1536,14 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	mResDirty(false),  	mStatesDirty(false),  	mCurrResolutionIndex(0), +	mProgressView(NULL) +{  	// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to  	// pass its value right now. Instead, pass it a nullary function that  	// will, when we later need it, return the value of gKeyboard.  	// boost::lambda::var() constructs such a functor on the fly. -	mWindowListener(new LLWindowListener(this, boost::lambda::var(gKeyboard))), -	mViewerWindowListener(new LLViewerWindowListener(this)), -	mProgressView(NULL) -{ +	mWindowListener.reset(new LLWindowListener(this, boost::lambda::var(gKeyboard))); +	mViewerWindowListener.reset(new LLViewerWindowListener(this));  	LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));  	LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal")); @@ -1958,18 +1956,24 @@ void LLViewerWindow::shutdownViews()  	// clean up warning logger  	LLError::removeRecorder(RecordToChatConsole::getInstance()); +	llinfos << "Warning logger is cleaned." << llendl ; +  	delete mDebugText;  	mDebugText = NULL; +	llinfos << "DebugText deleted." << llendl ; +  	// Cleanup global views  	if (gMorphView)  	{  		gMorphView->setVisible(FALSE);  	} +	llinfos << "Global views cleaned." << llendl ;  	// DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open  	// will crump with LL_ERRS.  	LLModalDialog::shutdownModals(); +	llinfos << "LLModalDialog shut down." << llendl;   	// destroy the nav bar, not currently part of gViewerWindow  	// *TODO: Make LLNavigationBar part of gViewerWindow @@ -1977,14 +1981,17 @@ void LLViewerWindow::shutdownViews()  	{  		delete LLNavigationBar::getInstance();  	} +	llinfos << "LLNavigationBar destroyed." << llendl ;  	// destroy menus after instantiating navbar above, as it needs  	// access to gMenuHolder  	cleanup_menus(); +	llinfos << "menus destroyed." << llendl ;  	// Delete all child views.  	delete mRootView;  	mRootView = NULL; +	llinfos << "RootView deleted." << llendl ;  	// Automatically deleted as children of mRootView.  Fix the globals.  	gStatusBar = NULL; @@ -2152,13 +2159,19 @@ void LLViewerWindow::reshape(S32 width, S32 height)  			// tell the OS specific window code about min window size  			mWindow->setMinSize(min_window_width, min_window_height); -			// Only save size if not maximized -			gSavedSettings.setU32("WindowWidth", mWindowRectRaw.getWidth()); -			gSavedSettings.setU32("WindowHeight", mWindowRectRaw.getHeight()); +			LLCoordScreen window_rect; +			if (mWindow->getSize(&window_rect)) +			{ +				// Only save size if not maximized +				gSavedSettings.setU32("WindowWidth", window_rect.mX); +				gSavedSettings.setU32("WindowHeight", window_rect.mY); +			}  		}  		LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_WIDTH, (F64)width);  		LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_HEIGHT, (F64)height); + +		LLLayoutStack::updateClass();  	}  } @@ -2362,7 +2375,7 @@ void LLViewerWindow::draw()  			gGL.matrixMode(LLRender::MM_MODELVIEW);  			LLUI::pushMatrix(); -			LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f); +			LLUI::translate( (F32) screen_x, (F32) screen_y);  			top_ctrl->draw();	  			LLUI::popMatrix();  		} @@ -4087,14 +4100,11 @@ void LLViewerWindow::resetSnapshotLoc()  void LLViewerWindow::movieSize(S32 new_width, S32 new_height)  {  	LLCoordWindow size; +	LLCoordWindow new_size(new_width, new_height);  	gViewerWindow->getWindow()->getSize(&size); -	if ( size.mX != new_width -		|| size.mY != new_height) +	if ( size != new_size )  	{ -		LLCoordWindow new_size(new_width, new_height); -		LLCoordScreen screen_size; -		gViewerWindow->getWindow()->convertCoords(new_size, &screen_size); -		gViewerWindow->getWindow()->setSize(screen_size); +		gViewerWindow->getWindow()->setSize(new_size);  	}  } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 68637a7ed9..a3a40de5eb 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -149,10 +149,6 @@ const F32 PELVIS_LAG_WALKING	= 0.4f;	// ...while walking  const F32 PELVIS_LAG_MOUSELOOK = 0.15f;  const F32 MOUSELOOK_PELVIS_FOLLOW_FACTOR = 0.5f;  const F32 PELVIS_LAG_WHEN_FOLLOW_CAM_IS_ON = 0.0001f; // not zero! - something gets divided by this! - -const F32 PELVIS_ROT_THRESHOLD_SLOW = 60.0f;	// amount of deviation allowed between -const F32 PELVIS_ROT_THRESHOLD_FAST = 2.0f;	// the pelvis and the view direction -											// when moving fast & slow  const F32 TORSO_NOISE_AMOUNT = 1.0f;	// Amount of deviation from up-axis, in degrees  const F32 TORSO_NOISE_SPEED = 0.2f;	// Time scale factor on torso noise. @@ -651,6 +647,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,  	LLViewerObject(id, pcode, regionp),  	mIsDummy(FALSE),  	mSpecialRenderMode(0), +	mAttachmentGeometryBytes(0), +	mAttachmentSurfaceArea(0.f),  	mTurning(FALSE),  	mPelvisToFoot(0.f),  	mLastSkeletonSerialNum( 0 ), @@ -3363,6 +3361,16 @@ void LLVOAvatar::slamPosition()  	mRoot.updateWorldMatrixChildren();  } +bool LLVOAvatar::isVisuallyMuted() +{ +	static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit"); +	static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit"); +	 +	return LLMuteList::getInstance()->isMuted(getID()) || +			(mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) || +			(mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f); +} +  //------------------------------------------------------------------------  // updateCharacter()  // called on both your avatar and other avatars @@ -3429,8 +3437,9 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		size.setSub(ext[1],ext[0]);  		F32 mag = size.getLength3().getF32()*0.5f; +		  		F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f); -		if (LLMuteList::getInstance()->isMuted(getID())) +		if (isVisuallyMuted())  		{ // muted avatars update at 16 hz  			mUpdatePeriod = 16;  		} @@ -3639,7 +3648,11 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  			BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook();  			LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV ); -			F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, PELVIS_ROT_THRESHOLD_SLOW, PELVIS_ROT_THRESHOLD_FAST); + +			static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow"); +			static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast"); + +			F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast);  			if (self_in_mouselook)  			{ @@ -8333,6 +8346,11 @@ void LLVOAvatar::idleUpdateRenderCost()  	static std::set<LLUUID> all_textures; +	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES)) +	{ //set debug text to attachment geometry bytes here so render cost will override +		setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea)); +	} +  	if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))  	{  		return; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 59796370ae..dd0317f555 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -78,6 +78,8 @@ class LLVOAvatar :  	public LLCharacter,  	public boost::signals2::trackable  { +	LOG_CLASS(LLVOAvatar); +  public:  	friend class LLVOAvatarSelf;  protected: @@ -380,6 +382,8 @@ private:  public:  	U32 		renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0); +	bool		isVisuallyMuted(); +  	U32 		renderRigid();  	U32 		renderSkinned(EAvatarRenderPass pass);  	F32			getLastSkinTime() { return mLastSkinTime; } @@ -391,6 +395,9 @@ public:  	static void	restoreGL();  	BOOL 		mIsDummy; // for special views  	S32			mSpecialRenderMode; // special lighting +	U32			mAttachmentGeometryBytes; //number of bytes in attached geometry +	F32			mAttachmentSurfaceArea; //estimated surface area of attachments +  private:  	bool		shouldAlphaMask(); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 12d08143ee..8be9516ab6 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1574,7 +1574,7 @@ void LLVOAvatarSelf::invalidateAll()  	{  		invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);  	} -	mDebugSelfLoadTimer.reset(); +	//mDebugSelfLoadTimer.reset();  }  //----------------------------------------------------------------------------- @@ -1896,11 +1896,13 @@ BOOL LLVOAvatarSelf::getIsCloud()  		gAgentWearables.getWearableCount(LLWearableType::WT_EYES) == 0 ||  		gAgentWearables.getWearableCount(LLWearableType::WT_SKIN) == 0)	  	{ +		lldebugs << "No body parts" << llendl;  		return TRUE;  	}  	if (!isTextureDefined(TEX_HAIR, 0))  	{ +		lldebugs << "No hair texture" << llendl;  		return TRUE;  	} @@ -1909,12 +1911,14 @@ BOOL LLVOAvatarSelf::getIsCloud()  		if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&  			(!isTextureDefined(TEX_LOWER_BAKED, 0)))  		{ +			lldebugs << "Lower textures not baked" << llendl;  			return TRUE;  		}  		if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&  			(!isTextureDefined(TEX_UPPER_BAKED, 0)))  		{ +			lldebugs << "Upper textures not baked" << llendl;  			return TRUE;  		} @@ -1931,10 +1935,12 @@ BOOL LLVOAvatarSelf::getIsCloud()  			const LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );  			if (!baked_img || !baked_img->hasGLTexture())  			{ +				lldebugs << "Texture at index " << i << " (texture index is " << texture_data.mTextureIndex << ") is not loaded" << llendl;  				return TRUE;  			}  		} +		lldebugs << "Avatar de-clouded" << llendl;  	}  	return FALSE;  } @@ -2258,6 +2264,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )  	}  } +// FIXME: This is never called. Something may be broken.  void LLVOAvatarSelf::outputRezDiagnostics() const  {  	if(!gSavedSettings.getBOOL("DebugAvatarLocalTexLoadedTime")) @@ -2315,6 +2322,18 @@ void LLVOAvatarSelf::outputRezDiagnostics() const  	}  } +void LLVOAvatarSelf::outputRezTiming(const std::string& msg) const +{ +	LL_DEBUGS("Avatar Rez") +		<< llformat("%s. Time from avatar creation: %.2f", msg.c_str(), mDebugSelfLoadTimer.getElapsedTimeF32()) +		<< llendl; +} + +void LLVOAvatarSelf::reportAvatarRezTime() const +{ +	// TODO: report mDebugSelfLoadTimer.getElapsedTimeF32() somehow. +} +  //-----------------------------------------------------------------------------  // setCachedBakedTexture()  // A baked texture id was received from a cache query, make it active diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 74ff47a3e4..54dbe81993 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -41,6 +41,7 @@ struct LocalTextureData;  class LLVOAvatarSelf :  	public LLVOAvatar  { +	LOG_CLASS(LLVOAvatarSelf);  /********************************************************************************   **                                                                            ** @@ -358,6 +359,8 @@ public:  	void 					debugWearablesLoaded() { mDebugTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); }  	void 					debugAvatarVisible() { mDebugTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); }  	void 					outputRezDiagnostics() const; +	void					outputRezTiming(const std::string& msg) const; +	void					reportAvatarRezTime() const;  	void 					debugBakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished);  	static void				debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index c3a2e6a712..bf6158eeaf 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -65,7 +65,7 @@ public:  			return;  		} -		U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData; +		volatile U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;  		//assume tex coords 2 and 3 are present  		U32 type_mask = mTypeMask | MAP_TEXCOORD2 | MAP_TEXCOORD3; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 20f8674655..7492a06784 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4097,6 +4097,32 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  	LLFastTimer ftm2(FTM_REBUILD_VOLUME_VB); +	LLVOAvatar* pAvatarVO = NULL; + +	LLSpatialBridge* bridge = group->mSpatialPartition->asBridge(); +	if (bridge) +	{ +		if (bridge->mAvatar.isNull()) +		{ +			LLViewerObject* vobj = bridge->mDrawable->getVObj(); +			if (vobj) +			{ +				bridge->mAvatar = vobj->getAvatar(); +			} +		} + +		pAvatarVO = bridge->mAvatar; +	} + +	if (pAvatarVO) +	{ +		pAvatarVO->mAttachmentGeometryBytes -= group->mGeometryBytes; +		pAvatarVO->mAttachmentSurfaceArea -= group->mSurfaceArea; +	} + +	group->mGeometryBytes = 0; +	group->mSurfaceArea = 0; +	  	group->clearDrawMap();  	mFaceList.clear(); @@ -4133,12 +4159,24 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  		LLVOVolume* vobj = drawablep->getVOVolume(); +		if (!vobj) +		{ +			continue; +		} +  		if (vobj->isMesh() &&  			(vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))  		{  			continue;  		} +		LLVolume* volume = vobj->getVolume(); +		if (volume) +		{ +			const LLVector3& scale = vobj->getScale(); +			group->mSurfaceArea += volume->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]); +		} +  		llassert_always(vobj);  		vobj->updateTextureVirtualSize(true);  		vobj->preRebuild(); @@ -4183,7 +4221,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  				//Determine if we've received skininfo that contains an  				//alternate bind matrix - if it does then apply the translational component  				//to the joints of the avatar. -				LLVOAvatar* pAvatarVO = vobj->getAvatar();  				bool pelvisGotSet = false;  				if ( pAvatarVO ) @@ -4253,13 +4290,16 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  					if (type == LLDrawPool::POOL_ALPHA)  					{ -						if (te->getFullbright()) +						if (te->getColor().mV[3] > 0.f)  						{ -							pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA); -						} -						else -						{ -							pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA); +							if (te->getFullbright()) +							{ +								pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA); +							} +							else +							{ +								pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA); +							}  						}  					}  					else if (te->getShiny()) @@ -4392,8 +4432,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  					}  					else  					{ -						drawablep->setState(LLDrawable::HAS_ALPHA); -						alpha_faces.push_back(facep); +						if (te->getColor().mV[3] > 0.f) +						{ +							drawablep->setState(LLDrawable::HAS_ALPHA); +							alpha_faces.push_back(facep); +						}  					}  				}  				else @@ -4510,6 +4553,12 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  	}  	mFaceList.clear(); + +	if (pAvatarVO) +	{ +		pAvatarVO->mAttachmentGeometryBytes += group->mGeometryBytes; +		pAvatarVO->mAttachmentSurfaceArea += group->mSurfaceArea; +	}  }  static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry"); @@ -4806,17 +4855,20 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  		//create/delete/resize vertex buffer if needed  		LLVertexBuffer* buffer = NULL; -		LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter); + +		{ //try to find a buffer to reuse +			LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter); -		if (found_iter != group->mBufferMap[mask].end()) -		{ -			if ((U32) buffer_index < found_iter->second.size()) +			if (found_iter != group->mBufferMap[mask].end())  			{ -				buffer = found_iter->second[buffer_index]; +				if ((U32) buffer_index < found_iter->second.size()) +				{ +					buffer = found_iter->second[buffer_index]; +				}  			}  		} -		if (!buffer) +		if (!buffer || !buffer->isWriteable())  		{ //create new buffer if needed  			buffer = createVertexBuffer(mask, buffer_usage);  			buffer->allocateBuffer(geom_count, index_count, TRUE); @@ -4835,6 +4887,9 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			}  		} +		group->mGeometryBytes += buffer->getSize() + buffer->getIndicesSize(); + +  		buffer_map[mask][*face_iter].push_back(buffer);  		//add face geometry diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index 7df50ec815..315616e8a5 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -167,7 +167,7 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable)  				  indices_per_quad * num_quads);  	LLVertexBuffer* buff = face->getVertexBuffer(); -	if (!buff) +	if (!buff || !buff->isWriteable())  	{  		buff = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB);  		buff->allocateBuffer(face->getGeomCount(), face->getIndicesCount(), TRUE); diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index f1c5499d84..afd902201b 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -774,7 +774,7 @@ BOOL LLVOWLSky::updateStarGeometry(LLDrawable *drawable)  	LLStrider<LLColor4U> colorsp;  	LLStrider<LLVector2> texcoordsp; -	if (mStarsVerts.isNull()) +	if (mStarsVerts.isNull() || !mStarsVerts->isWriteable())  	{  		mStarsVerts = new LLVertexBuffer(LLDrawPoolWLSky::STAR_VERTEX_DATA_MASK, GL_DYNAMIC_DRAW);  		mStarsVerts->allocateBuffer(getStarsNumVerts()*6, 0, TRUE); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index e50851b8e7..a20ee8686b 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -513,7 +513,7 @@ void LLWorldMapView::draw()  					 TRUE,  					 "You are here",  					 "", -					 llround(LLFontGL::getFontSansSerifSmall()->getLineHeight())); // offset vertically by one line, to avoid overlap with target tracking +					 LLFontGL::getFontSansSerifSmall()->getLineHeight()); // offset vertically by one line, to avoid overlap with target tracking  	}  	// Draw the current agent viewing angle @@ -992,7 +992,7 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  	const S32 TEXT_PADDING = DEFAULT_TRACKING_ARROW_SIZE + 2;  	S32 half_text_width = llfloor(font->getWidthF32(label) * 0.5f);  	text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING); -	text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - llround(font->getLineHeight()) - TEXT_PADDING - vert_offset); +	text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - font->getLineHeight() - TEXT_PADDING - vert_offset);  	if (label != "")  	{ @@ -1005,7 +1005,7 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&  		if (tooltip != "")  		{ -			text_y -= (S32)font->getLineHeight(); +			text_y -= font->getLineHeight();  			font->renderUTF8(  				tooltip, 0, @@ -1203,7 +1203,7 @@ void LLWorldMapView::drawIconName(F32 x_pixels,  		LLFontGL::NORMAL,   		LLFontGL::DROP_SHADOW); -	text_y -= llround(LLFontGL::getFontSansSerif()->getLineHeight()); +	text_y -= LLFontGL::getFontSansSerif()->getLineHeight();  	// render text  	LLFontGL::getFontSansSerif()->renderUTF8(second_line, 0, diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 920a9a3752..0da70d398b 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -305,6 +305,15 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)  	{  		mCurlRequest = new LLCurlEasyRequest();  	} +	if(!mCurlRequest->isValid()) +	{ +		llwarns << "mCurlRequest is invalid." << llendl ; + +		delete mCurlRequest ; +		mCurlRequest = NULL ; +		return ; +	} +  	mErrorCert = NULL;  //	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // useful for debugging @@ -357,10 +366,20 @@ LLXMLRPCTransaction::Impl::~Impl()  	}  	delete mCurlRequest; +	mCurlRequest = NULL ;  }  bool LLXMLRPCTransaction::Impl::process()  { +	if(!mCurlRequest || !mCurlRequest->isValid()) +	{ +		llwarns << "transaction failed." << llendl ; + +		delete mCurlRequest ; +		mCurlRequest = NULL ; +		return true ; //failed, quit. +	} +  	switch(mStatus)  	{  		case LLXMLRPCTransaction::StatusComplete: diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 8449e74fb6..c523a78b22 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1217,10 +1217,12 @@ void LLPipeline::restoreGL()  BOOL LLPipeline::canUseVertexShaders()  { +	static const std::string vertex_shader_enable_feature_string = "VertexShaderEnable"; +  	if (sDisableShaders ||  		!gGLManager.mHasVertexShader ||  		!gGLManager.mHasFragmentShader || -		!LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable") || +		!LLFeatureManager::getInstance()->isFeatureAvailable(vertex_shader_enable_feature_string) ||  		(assertInitialized() && mVertexShadersLoaded != 1) )  	{  		return FALSE; @@ -3765,6 +3767,7 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  	LLAppViewer::instance()->pingMainloopTimeout("Pipeline:ForceVBO");  	// Initialize lots of GL state to "safe" values +	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  	gGL.matrixMode(LLRender::MM_TEXTURE);  	gGL.loadIdentity();  	gGL.matrixMode(LLRender::MM_MODELVIEW); @@ -5296,7 +5299,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			light_state->setConstantAttenuation(0.f);  			if (sRenderDeferred)  			{ -				light_state->setLinearAttenuation(light_radius*1.5f); +				F32 size = light_radius*1.5f; +				light_state->setLinearAttenuation(size*size);  				light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);  			}  			else @@ -5318,7 +5322,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  				light_state->setSpotCutoff(90.f);  				light_state->setSpotExponent(2.f); -				light_state->setSpecular(LLColor4::black); +				const LLColor4 specular(0.f, 0.f, 0.f, 0.f); +				light_state->setSpecular(specular);  			}  			else // omnidirectional (point) light  			{ @@ -9419,7 +9424,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)  	assertInitialized(); -	BOOL muted = LLMuteList::getInstance()->isMuted(avatar->getID()); +	bool muted = avatar->isVisuallyMuted();		  	pushRenderTypeMask(); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 2815d736e4..9c78048c46 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -432,34 +432,35 @@ public:  	enum LLRenderDebugMask  	{ -		RENDER_DEBUG_COMPOSITION		= 0x0000001, -		RENDER_DEBUG_VERIFY				= 0x0000002, -		RENDER_DEBUG_BBOXES				= 0x0000004, -		RENDER_DEBUG_OCTREE				= 0x0000008, -		RENDER_DEBUG_WIND_VECTORS		= 0x0000010, -		RENDER_DEBUG_OCCLUSION			= 0x0000020, -		RENDER_DEBUG_POINTS				= 0x0000040, -		RENDER_DEBUG_TEXTURE_PRIORITY	= 0x0000080, -		RENDER_DEBUG_TEXTURE_AREA		= 0x0000100, -		RENDER_DEBUG_FACE_AREA			= 0x0000200, -		RENDER_DEBUG_PARTICLES			= 0x0000400, -		RENDER_DEBUG_GLOW				= 0x0000800, -		RENDER_DEBUG_TEXTURE_ANIM		= 0x0001000, -		RENDER_DEBUG_LIGHTS				= 0x0002000, -		RENDER_DEBUG_BATCH_SIZE			= 0x0004000, -		RENDER_DEBUG_ALPHA_BINS			= 0x0008000, -		RENDER_DEBUG_RAYCAST            = 0x0010000, -		RENDER_DEBUG_SHAME				= 0x0020000, -		RENDER_DEBUG_SHADOW_FRUSTA		= 0x0040000, -		RENDER_DEBUG_SCULPTED           = 0x0080000, -		RENDER_DEBUG_AVATAR_VOLUME      = 0x0100000, -		RENDER_DEBUG_BUILD_QUEUE		= 0x0200000, -		RENDER_DEBUG_AGENT_TARGET       = 0x0400000, -		RENDER_DEBUG_UPDATE_TYPE		= 0x0800000, -		RENDER_DEBUG_PHYSICS_SHAPES     = 0x1000000, -		RENDER_DEBUG_NORMALS	        = 0x2000000, -		RENDER_DEBUG_LOD_INFO	        = 0x4000000, -		RENDER_DEBUG_RENDER_COMPLEXITY  = 0x8000000 +		RENDER_DEBUG_COMPOSITION		= 0x00000001, +		RENDER_DEBUG_VERIFY				= 0x00000002, +		RENDER_DEBUG_BBOXES				= 0x00000004, +		RENDER_DEBUG_OCTREE				= 0x00000008, +		RENDER_DEBUG_WIND_VECTORS		= 0x00000010, +		RENDER_DEBUG_OCCLUSION			= 0x00000020, +		RENDER_DEBUG_POINTS				= 0x00000040, +		RENDER_DEBUG_TEXTURE_PRIORITY	= 0x00000080, +		RENDER_DEBUG_TEXTURE_AREA		= 0x00000100, +		RENDER_DEBUG_FACE_AREA			= 0x00000200, +		RENDER_DEBUG_PARTICLES			= 0x00000400, +		RENDER_DEBUG_GLOW				= 0x00000800, +		RENDER_DEBUG_TEXTURE_ANIM		= 0x00001000, +		RENDER_DEBUG_LIGHTS				= 0x00002000, +		RENDER_DEBUG_BATCH_SIZE			= 0x00004000, +		RENDER_DEBUG_ALPHA_BINS			= 0x00008000, +		RENDER_DEBUG_RAYCAST            = 0x00010000, +		RENDER_DEBUG_SHAME				= 0x00020000, +		RENDER_DEBUG_SHADOW_FRUSTA		= 0x00040000, +		RENDER_DEBUG_SCULPTED           = 0x00080000, +		RENDER_DEBUG_AVATAR_VOLUME      = 0x00100000, +		RENDER_DEBUG_BUILD_QUEUE		= 0x00200000, +		RENDER_DEBUG_AGENT_TARGET       = 0x00400000, +		RENDER_DEBUG_UPDATE_TYPE		= 0x00800000, +		RENDER_DEBUG_PHYSICS_SHAPES     = 0x01000000, +		RENDER_DEBUG_NORMALS	        = 0x02000000, +		RENDER_DEBUG_LOD_INFO	        = 0x04000000, +		RENDER_DEBUG_RENDER_COMPLEXITY  = 0x08000000, +		RENDER_DEBUG_ATTACHMENT_BYTES	= 0x10000000,  	};  public: diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index 2493d60df6..14ace0ac3a 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		[AMT] L$  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-415" name="balance_bg" width="205">  		<text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="20 L$"/>  		<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>  		<button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/> diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index 930bbaa8cb..d11373ce1d 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -1,6 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - legacy_header_height="18"   can_minimize="false"   can_tear_off="false"   can_resize="true" @@ -16,67 +15,98 @@   save_dock_state="true"   save_visibility="true"   single_instance="true"  - width="320"> -  <string name="nudge_parabuild" translate="false">Nudge 1</string> -  <string name="test_the_vlt">This string CHANGE2 is extracted.</string> -  <string name="testing_eli">Just a test. changes.</string> -  <text_editor -   parse_urls="true" -   bg_readonly_color="ChatHistoryBgColor" -   bg_writeable_color="ChatHistoryBgColor"  -   border_visible="false" -   follows="all" -   font="SansSerif"  -	 left="1" -   top="20" -   layout="topleft" -	 height="260" -   name="chat_history" -   max_length="200000"  -   parse_highlights="true" -   text_color="ChatHistoryTextColor" -   text_readonly_color="ChatHistoryTextColor" -   translate="false" -   track_end="true"  -   wrap="true"  -   width="320"> -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    Really long line that is long enough to wrap once with jyg descenders. -    </text_editor> + width="650"> +  <text left="0" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned</text> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned +  </text_editor>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index c7e9ec781d..060d889003 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="centered" + positioning="centered"   legacy_header_height="18"   height="440"   layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 28538f7852..aa7c6e5ed7 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   can_tear_off="false"   height="420"   layout="topleft" @@ -197,7 +197,7 @@               left_pad="2"               valign="center"                name="ContentRatingText" -             top_delta="0" +             top_delta="-2"               width="250">                  Adult              </text> @@ -209,7 +209,7 @@               layout="topleft"               left="10"               name="Owner:" -             top_pad="1" +             top_pad="3"               width="100">                  Owner:              </text> @@ -736,7 +736,7 @@               height="16"               layout="topleft"               left_pad="10" -             top_delta="-3"  +             top_delta="-1"                mouse_opaque="false"               name="region_maturity_text"               valign="center"  @@ -1952,35 +1952,17 @@ Only large parcels can be listed in search.  				(Defined by the Estate)  			</panel.string>        <panel.string -       name="allow_public_access"> -        Allow Public Access ([MATURITY]) (Note: Unchecking this will create ban lines) -      </panel.string> -            <panel.string               name="estate_override">                  One or more of these options is set at the estate level              </panel.string> -            <text -             type="string" -             length="1" -             follows="left|top" -             height="16" -             layout="topleft" -             left="10" -             name="Limit access to this parcel to:" -             text_color="White" -             top="10" -             width="400"> -                Access To This Parcel -            </text>              <check_box               follows="top|left"               height="16"               layout="topleft" -             left_delta="0" +             left="8"               name="public_access" -             top_pad="5" -             label_text.valign="center" -             label_text.v_pad="-2"  +             label="Allow Public Access (Unchecking this will create ban lines)" +             top_pad="10"                width="278" />              <text               type="string" @@ -1990,28 +1972,28 @@ Only large parcels can be listed in search.               layout="topleft"               left_delta="20"               name="Only Allow" -             top="49" +             top="30"               width="325"> -                Restrict Access to Residents verified by: +                Allow access only to Residents who:              </text>              <check_box               follows="top|left"               height="16" -             label="Payment Information on File [ESTATE_PAYMENT_LIMIT]" +             label="Have payment Information on File [ESTATE_PAYMENT_LIMIT]"               layout="topleft"               left_delta="0"               name="limit_payment" -             tool_tip="Ban unidentified Residents." +             tool_tip="Residents must have payment information on file to access this parcel.  See the [SUPPORT_SITE] for more information."               top_pad="4"               width="278" />              <check_box               follows="top|left"               height="16" -             label="Age Verification [ESTATE_AGE_LIMIT]" +             label="Have been age-verified [ESTATE_AGE_LIMIT]"               layout="topleft"               left_delta="0"               name="limit_age_verified" -             tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information." +             tool_tip="Residents must be age verified to access this parcel. See the [SUPPORT_SITE] for more information."               top_pad="4"               width="278" />              <check_box @@ -2021,7 +2003,7 @@ Only large parcels can be listed in search.               left="8"               name="GroupCheck"               tool_tip="Set group in the General tab." -             top="109" +             top="89"               width="278" />              <check_box               enabled="false" @@ -2103,7 +2085,7 @@ Only large parcels can be listed in search.               column_padding="0"               follows="top|bottom"               heading_height="14" -             height="120" +             height="125"               layout="topleft"               left="0"               multi_select="true" @@ -2152,7 +2134,7 @@ Only large parcels can be listed in search.               column_padding="0"               follows="top|bottom"               heading_height="14" -             height="120" +             height="125"               layout="topleft"               left="0"               multi_select="true" diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 82c3403008..cd5cca02bd 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -1,13 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   ignore_ui_scale="false"   legacy_header_height="225"   can_minimize="true"   can_close="true"   can_resize="true"   min_height="230" - min_width="450" + min_width="515"   height="230"   layout="topleft"   name="Avatar" diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index cbbbeb6094..1a55dc2e2c 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   legacy_header_height="18"   can_resize="true"   height="350" diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 4673c6def5..22bc488a92 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -1,8 +1,9 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="specified" - specified_left="458" - specified_bottom="80" + positioning="specified" + left="458" + bottom="-80" + follows="left|bottom"   legacy_header_height="18"   can_minimize="true"   can_close="true" diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml index 63992462b3..688a01ce7b 100644 --- a/indra/newview/skins/default/xui/en/floater_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/floater_chat_bar.xml @@ -1,8 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="specified" - specified_left="10" - specified_bottom="10" + positioning="specified" + left="10" + bottom="-10"   height="60"   layout="topleft"   legacy_header_height="25" diff --git a/indra/newview/skins/default/xui/en/floater_choose_group.xml b/indra/newview/skins/default/xui/en/floater_choose_group.xml index dc1ee5f24e..2cf6e682fd 100644 --- a/indra/newview/skins/default/xui/en/floater_choose_group.xml +++ b/indra/newview/skins/default/xui/en/floater_choose_group.xml @@ -20,7 +20,7 @@          Choose a group:      </text>      <scroll_list -     height="160" +     height="165"       layout="topleft"       left_delta="0"       name="group list" diff --git a/indra/newview/skins/default/xui/en/floater_critical.xml b/indra/newview/skins/default/xui/en/floater_critical.xml index 13b15bf724..143bcb4430 100644 --- a/indra/newview/skins/default/xui/en/floater_critical.xml +++ b/indra/newview/skins/default/xui/en/floater_critical.xml @@ -6,7 +6,7 @@   height="500"   layout="topleft"   name="modal container" - open_positioning="centered" + positioning="centered"   width="600">      <button       height="20" diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml index 373114a1eb..39aa8e07bb 100644 --- a/indra/newview/skins/default/xui/en/floater_destinations.xml +++ b/indra/newview/skins/default/xui/en/floater_destinations.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   ignore_ui_scale="false"   legacy_header_height="225"   can_minimize="true" diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml index b96a94a849..200e9b9537 100644 --- a/indra/newview/skins/default/xui/en/floater_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_gesture.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   save_rect="true"   legacy_header_height="18"   can_resize="true" diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml index cd075abc41..c06cb63f8a 100644 --- a/indra/newview/skins/default/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   legacy_header_height="18"   can_resize="true"   height="600" diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml index 6e1bb8fcd0..59f6a9434c 100644 --- a/indra/newview/skins/default/xui/en/floater_joystick.xml +++ b/indra/newview/skins/default/xui/en/floater_joystick.xml @@ -13,6 +13,7 @@      </floater.string>      <check_box       bottom="38" +     height="10"       control_name="JoystickEnabled"       halign="left"       label="Enable Joystick:" @@ -28,6 +29,7 @@       width="380" />      <spinner       bottom="48" +     height="10"       control_name="JoystickAxis1"       decimal_digits="0"       increment="1" @@ -41,6 +43,7 @@       width="140" />      <spinner       bottom="48" +     height="10"            control_name="JoystickAxis2"       decimal_digits="0"       increment="1" @@ -54,6 +57,7 @@       width="140" />      <spinner       bottom="48" +     height="10"            control_name="JoystickAxis0"       decimal_digits="0"       increment="1" @@ -67,6 +71,7 @@       width="140" />      <spinner       bottom="68" +     height="10"            control_name="JoystickAxis4"       decimal_digits="0"       increment="1" @@ -80,6 +85,7 @@       width="140" />      <spinner       bottom="68" +     height="10"            control_name="JoystickAxis5"       decimal_digits="0"       increment="1" @@ -93,6 +99,7 @@       width="140" />      <spinner       bottom="68" +     height="10"            control_name="JoystickAxis3"       decimal_digits="0"       increment="1" @@ -106,6 +113,7 @@       width="140" />      <spinner       bottom="88" +     height="10"            control_name="JoystickAxis6"       decimal_digits="0"       increment="1" @@ -119,6 +127,7 @@       width="140" />      <check_box       bottom_delta="18" +     height="10"       control_name="ZoomDirect"       label="Direct Zoom"       layout="topleft" @@ -127,6 +136,7 @@       width="60" />      <check_box       bottom_delta="0" +     height="10"            control_name="Cursor3D"       label="3D Cursor"       layout="topleft" @@ -135,6 +145,7 @@       width="60" />      <check_box       bottom_delta="0" +     height="10"            control_name="AutoLeveling"       label="Auto Level"       layout="topleft" @@ -157,6 +168,7 @@      </text>      <check_box       bottom="127" +     height="10"            control_name="JoystickAvatarEnabled"       halign="center"       label="Avatar" @@ -166,6 +178,7 @@       width="60" />      <check_box       bottom="127" +     height="10"            control_name="JoystickBuildEnabled"       halign="center"       label="Build" @@ -175,6 +188,7 @@       width="60" />      <check_box       bottom="127" +     height="10"            control_name="JoystickFlycamEnabled"       halign="center"       label="Flycam" @@ -257,6 +271,7 @@      </text>      <spinner       bottom="144" +     height="10"            control_name="AvatarAxisScale1"       decimal_digits="2"       label_width="0" @@ -268,6 +283,7 @@       width="56" />      <spinner       bottom="144" +     height="10"            control_name="BuildAxisScale1"       decimal_digits="2"       label_width="0" @@ -279,6 +295,7 @@       width="56" />      <spinner       bottom="144" +     height="10"            control_name="FlycamAxisScale1"       decimal_digits="2"       label_width="0" @@ -301,6 +318,7 @@      </text>      <spinner       bottom="164" +     height="10"            control_name="AvatarAxisScale2"       decimal_digits="2"       label_width="0" @@ -312,6 +330,7 @@       width="56" />      <spinner       bottom="164" +     height="10"            control_name="BuildAxisScale2"       decimal_digits="2"       label_width="0" @@ -323,6 +342,7 @@       width="56" />      <spinner       bottom="164" +     height="10"            control_name="FlycamAxisScale2"       decimal_digits="2"       label_width="0" @@ -345,6 +365,7 @@      </text>      <spinner       bottom="184" +     height="10"            control_name="AvatarAxisScale0"       decimal_digits="2"       label_width="0" @@ -356,6 +377,7 @@       width="56" />      <spinner       bottom="184" +     height="10"            control_name="BuildAxisScale0"       decimal_digits="2"       label_width="0" @@ -367,6 +389,7 @@       width="56" />      <spinner       bottom="184" +     height="10"            control_name="FlycamAxisScale0"       decimal_digits="2"       label_width="0" @@ -389,6 +412,7 @@      </text>      <spinner       bottom="204" +     height="10"            control_name="AvatarAxisScale4"       decimal_digits="2"       label_width="0" @@ -400,6 +424,7 @@       width="56" />      <spinner       bottom="204" +     height="10"            control_name="BuildAxisScale4"       decimal_digits="2"       label_width="0" @@ -411,6 +436,7 @@       width="56" />      <spinner       bottom="204" +     height="10"            control_name="FlycamAxisScale4"       decimal_digits="2"       label_width="0" @@ -433,6 +459,7 @@      </text>      <spinner       bottom="224" +     height="10"       control_name="AvatarAxisScale5"       decimal_digits="2"       label_width="0" @@ -444,6 +471,7 @@       width="56" />      <spinner       bottom="224" +     height="10"       control_name="BuildAxisScale5"       decimal_digits="2"       label_width="0" @@ -455,6 +483,7 @@       width="56" />      <spinner       bottom="224" +     height="10"       control_name="FlycamAxisScale5"       decimal_digits="2"       label_width="0" @@ -477,6 +506,7 @@      </text>      <spinner       bottom="244" +     height="10"       control_name="BuildAxisScale3"       decimal_digits="2"       label_width="0" @@ -488,6 +518,7 @@       width="56" />      <spinner       bottom="244" +     height="10"       control_name="FlycamAxisScale3"       decimal_digits="2"       label_width="0" @@ -510,6 +541,7 @@      </text>      <spinner       bottom="274" +     height="10"       control_name="AvatarAxisDeadZone1"       decimal_digits="2"       increment="0.01" @@ -520,6 +552,7 @@       width="56" />      <spinner       bottom="274" +     height="10"       control_name="BuildAxisDeadZone1"       decimal_digits="2"       increment="0.01" @@ -530,6 +563,7 @@       width="56" />      <spinner       bottom="274" +     height="10"       control_name="FlycamAxisDeadZone1"       decimal_digits="2"       increment="0.01" @@ -551,6 +585,7 @@      </text>      <spinner       bottom="294" +     height="10"            control_name="AvatarAxisDeadZone2"       decimal_digits="2"       increment="0.01" @@ -561,6 +596,7 @@       width="56" />      <spinner       bottom="294" +     height="10"       control_name="BuildAxisDeadZone2"       decimal_digits="2"       increment="0.01" @@ -571,6 +607,7 @@       width="56" />      <spinner       bottom="294" +     height="10"       control_name="FlycamAxisDeadZone2"       decimal_digits="2"       increment="0.01" @@ -592,6 +629,7 @@      </text>      <spinner       bottom="314" +     height="10"       control_name="AvatarAxisDeadZone0"       decimal_digits="2"       increment="0.01" @@ -602,6 +640,7 @@       width="56" />      <spinner       bottom="314" +     height="10"       control_name="BuildAxisDeadZone0"       decimal_digits="2"       increment="0.01" @@ -612,6 +651,7 @@       width="56" />      <spinner       bottom="314" +     height="10"       control_name="FlycamAxisDeadZone0"       decimal_digits="2"       increment="0.01" @@ -633,6 +673,7 @@      </text>      <spinner       bottom="334" +     height="10"       control_name="AvatarAxisDeadZone4"       decimal_digits="2"       increment="0.01" @@ -643,6 +684,7 @@       width="56" />      <spinner       bottom="334" +     height="10"       control_name="BuildAxisDeadZone4"       decimal_digits="2"       increment="0.01" @@ -653,6 +695,7 @@       width="56" />      <spinner       bottom="334" +     height="10"       control_name="FlycamAxisDeadZone4"       decimal_digits="2"       increment="0.01" @@ -674,6 +717,7 @@      </text>      <spinner       bottom="354" +     height="10"       control_name="AvatarAxisDeadZone5"       decimal_digits="2"       increment="0.01" @@ -684,6 +728,7 @@       width="56" />      <spinner       bottom="354" +     height="10"       control_name="BuildAxisDeadZone5"       decimal_digits="2"       increment="0.01" @@ -694,6 +739,7 @@       width="56" />      <spinner       bottom="354" +     height="10"       control_name="FlycamAxisDeadZone5"       decimal_digits="2"       increment="0.01" @@ -715,6 +761,7 @@      </text>      <spinner       bottom="374" +     height="10"       control_name="BuildAxisDeadZone3"       decimal_digits="2"       increment="0.01" @@ -725,6 +772,7 @@       width="56" />      <spinner       bottom="374" +     height="10"       control_name="FlycamAxisDeadZone3"       decimal_digits="2"       increment="0.01" @@ -802,6 +850,7 @@      </text>      <spinner       bottom="430" +     height="10"       control_name="FlycamAxisScale6"       decimal_digits="2"       label_width="0" @@ -824,6 +873,7 @@      </text>      <spinner       bottom="450" +     height="10"       control_name="FlycamAxisDeadZone6"       decimal_digits="2"       increment="0.01" diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml index 3737294ebe..390ec9ab7d 100644 --- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml +++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="centered" + positioning="centered"   legacy_header_height="18"   height="430"   layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml index 3eeebcf120..b8893e11d9 100644 --- a/indra/newview/skins/default/xui/en/floater_map.xml +++ b/indra/newview/skins/default/xui/en/floater_map.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   can_minimize="true"    can_resize="true"   chrome="true" diff --git a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml index 498a9b6ce0..90bd64a675 100644 --- a/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml +++ b/indra/newview/skins/default/xui/en/floater_merchant_outbox.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <floater -    open_positioning="cascading" +    positioning="cascading"      can_close="true"      can_resize="true"      height="440" @@ -99,7 +99,7 @@              halign="center"              font="SansSerifMedium"              font_shadow="hard" -            valign="bottom"> +            valign="top">            Drag items here to create folders          </text>        </panel> @@ -114,8 +114,8 @@            height="20"            wrap="true"            halign="left" -          valign="bottom" -          font="SansSerif" /> +          valign="center" +          font="SansSerif"/>        <button            label="Send to Marketplace"            tool_tip="Push to my Marketplace Storefront" diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index eebc5ddc72..0e211551e6 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -117,18 +117,18 @@               name="lod_tab_border"               top_pad="0"               width="619" /> -            <text -             follows="left|top" -             height="18" -             initial_value="Source" -             layout="topleft" -             left="75" -             name="source" -             text_color="ModelUploaderLabels" -             top="15" -             valign="center" -             value="Source" -             width="335" /> +          <text +           follows="left|top" +           height="18" +           initial_value="Source" +           layout="topleft" +           left="75" +           name="source" +           text_color="ModelUploaderLabels" +           top="15" +           valign="center" +           value="Source" +           width="335"/>              <text               follows="left|top"               halign="right" @@ -163,7 +163,7 @@               name="high_label"               text_color="ModelUploaderLabels"               top_pad="10" -             valign="center" +             valign="top"               value="High"               width="65" />              <combo_box @@ -240,34 +240,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="high_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="high_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="high_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon @@ -277,7 +277,7 @@               left_delta="20"               mouse_opaque="true"               name="status_icon_high" -             top_delta="0" +             top_delta="-2"               width="16" />              <text               follows="left|top" @@ -288,7 +288,7 @@               name="medium_label"               text_color="ModelUploaderLabels"               top_pad="15" -             valign="center" +             valign="top"               value="Medium"               width="65" />              <combo_box @@ -368,34 +368,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="medium_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="medium_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="medium_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon @@ -405,7 +405,7 @@               left_delta="20"               mouse_opaque="true"               name="status_icon_medium" -             top_delta="0" +             top_delta="-2"               width="16" />              <text               follows="left|top" @@ -416,7 +416,7 @@               name="low_label"               text_color="ModelUploaderLabels"               top_pad="15" -             valign="center" +             valign="top"               value="Low"               width="65" />              <combo_box @@ -496,34 +496,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="low_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="low_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="low_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon @@ -533,7 +533,7 @@               left_delta="20"               mouse_opaque="true"               name="status_icon_low" -             top_delta="0" +             top_delta="-2"               width="16" />              <text               follows="left|top" @@ -544,7 +544,7 @@               name="lowest_label"               text_color="ModelUploaderLabels"               top_pad="15" -             valign="center" +             valign="top"               value="Lowest"               width="65" />              <combo_box @@ -624,34 +624,34 @@              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="lowest_triangles" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="right" -             height="18" +             height="15"               initial_value="0"               layout="topleft"               left_pad="0"               name="lowest_vertices" -             valign="center" +             valign="top"               value="0"               width="65" />              <text               follows="left|top"               halign="center" -             height="18" +             height="15"               initial_value=""               layout="topleft"               left_pad="0"               name="lowest_status" -             valign="center" +             valign="top"               value=""               width="65" />              <icon diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml index 065dab0413..4e7ee7913f 100644 --- a/indra/newview/skins/default/xui/en/floater_moveview.xml +++ b/indra/newview/skins/default/xui/en/floater_moveview.xml @@ -1,8 +1,8 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="specified" - specified_left="320" - specified_bottom="80" + positioning="specified" + left="320" + bottom="-80"   legacy_header_height="18"   can_dock="false"   can_minimize="true" diff --git a/indra/newview/skins/default/xui/en/floater_my_appearance.xml b/indra/newview/skins/default/xui/en/floater_my_appearance.xml index 1c4b25a7b0..fdea7a821a 100644 --- a/indra/newview/skins/default/xui/en/floater_my_appearance.xml +++ b/indra/newview/skins/default/xui/en/floater_my_appearance.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <floater -  open_positioning="cascading" +  positioning="cascading"    legacy_header_height="18"    can_resize="true"    height="588" diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml index cd0b59dc51..184f296255 100644 --- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <floater - open_positioning="cascading" + positioning="cascading"   can_close="true"   can_resize="true"   height="570" diff --git a/indra/newview/skins/default/xui/en/floater_people.xml b/indra/newview/skins/default/xui/en/floater_people.xml index d6d8431150..08d0b00a83 100644 --- a/indra/newview/skins/default/xui/en/floater_people.xml +++ b/indra/newview/skins/default/xui/en/floater_people.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>  <floater -  open_positioning="cascading" +  positioning="cascading"    can_close="true"    can_resize="true"    height="570" diff --git a/indra/newview/skins/default/xui/en/floater_picks.xml b/indra/newview/skins/default/xui/en/floater_picks.xml index 7882116662..984894b016 100644 --- a/indra/newview/skins/default/xui/en/floater_picks.xml +++ b/indra/newview/skins/default/xui/en/floater_picks.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <floater - open_positioning="cascading" + positioning="cascading"   can_close="true"   can_resize="true"   height="572" diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml index ccceac0a7b..b241e265a9 100644 --- a/indra/newview/skins/default/xui/en/floater_places.xml +++ b/indra/newview/skins/default/xui/en/floater_places.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <floater -  open_positioning="cascading" +  positioning="cascading"    legacy_header_height="18"    can_resize="true"    height="588" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 402868bb97..bd6faf4ed8 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater   legacy_header_height="18" - open_positioning="centered" + positioning="centered"   default_tab_group="1"   height="460"   layout="topleft" @@ -100,7 +100,7 @@           help_topic="preferences_colors_tab"           name="colors" />          <panel -		 class="panel_preference" +         class="panel_preference_privacy"           filename="panel_preferences_privacy.xml"           label="Privacy"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index dd818e2e06..c3e7028dc5 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater -  open_positioning="cascading" +  positioning="cascading"    legacy_header_height="18"    can_resize="true"    height="775" diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 0c38283d59..49d64767cc 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   legacy_header_height="18"   can_minimize="true"   can_close="true" diff --git a/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml index f95f21e63a..a04050e7eb 100644 --- a/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml +++ b/indra/newview/skins/default/xui/en/floater_test_layout_stacks.xml @@ -32,6 +32,26 @@                    bg_alpha_color="blue"                    height="11"                    min_height="0" +                  visible="false" +                  background_visible="true"> +      <text follows="top|left|right" halign="center" text_color="white">flex</text> +    </layout_panel> +    <layout_panel name="flex" +                  auto_resize="true" +                  user_resize="true" +                  bg_alpha_color="blue" +                  height="11" +                  min_height="0" +                  visible="true" +                  background_visible="true"> +      <text follows="top|left|right" halign="center" text_color="white">flex</text> +    </layout_panel> +    <layout_panel name="flex" +                  auto_resize="true" +                  user_resize="true" +                  bg_alpha_color="blue" +                  height="11" +                  min_height="0"                    background_visible="true">        <text follows="top|left|right" halign="center" text_color="white">flex</text>      </layout_panel> diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml index 548e24efba..e1fefc3631 100644 --- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml +++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml @@ -3,6 +3,7 @@   legacy_header_height="18"   can_resize="true"   height="600" + single_instance="false"   layout="topleft"   name="floater_test_text_editor"   translate="false" diff --git a/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml new file mode 100644 index 0000000000..d11373ce1d --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_test_text_vertical_aligment.xml @@ -0,0 +1,112 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_minimize="false" + can_tear_off="false" + can_resize="true" + can_drag_on_left="false" + can_close="true" + can_dock="true" + bevel_style="in" + height="300" + layout="topleft" + name="Test Floater" + save_rect="true" + title="TEST FLOATER" + save_dock_state="true" + save_visibility="true" + single_instance="true"  + width="650"> +  <text left="0" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned</text> +  <text left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true"         +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned</text> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="top"> +this +is +some +text +that +is +top +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        bottom="-5" +        clip_partial="true" +        width="100" +        valign="center"> +this +is +some +text +that +is +center +aligned +  </text_editor> +  <text_editor left_pad="5" +        follows="left|top|bottom" +        top="5" +        clip_partial="true" +        bottom="-5" +        width="100" +        valign="bottom"> +this +is +some +text +that +is +bottom +aligned +  </text_editor> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml index 13c850c86c..10854f5a49 100644 --- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml +++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml @@ -115,6 +115,7 @@    </flyout_button>    <check_box     bottom_delta="35" +   height="10"     label="Checkbox"     layout="topleft"     tool_tip="checkbox" @@ -275,6 +276,7 @@    <!-- "spinner" is a numerical input widget with an up and down arrow to         change the value. -->    <spinner +    height="10"     bottom_delta="35"     follows="top|left"     label="Spinner" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 2d63c94fe1..e37740d20c 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   legacy_header_height="18"   height="580"   layout="topleft" @@ -1206,6 +1206,7 @@ even though the user gets a free copy.               label="Modify"               layout="topleft"               left="10" +             height="10"               name="checkbox next owner can modify"               width="85" />              <check_box diff --git a/indra/newview/skins/default/xui/en/floater_toybox.xml b/indra/newview/skins/default/xui/en/floater_toybox.xml index 72e6187a14..d8211c24a7 100644 --- a/indra/newview/skins/default/xui/en/floater_toybox.xml +++ b/indra/newview/skins/default/xui/en/floater_toybox.xml @@ -10,7 +10,7 @@    layout="topleft"    legacy_header_height="18"    name="Toybox" -  open_positioning="centered" +  positioning="centered"    save_rect="true"    single_instance="true"    title="TOOLBAR BUTTONS" @@ -18,7 +18,7 @@    <text      follows="left|top"      font="SansSerifMedium" -    valign="bottom" +    valign="top"      halign="left"      height="20"      layout="topleft" @@ -33,7 +33,7 @@    <text      follows="left|top"      font="SansSerifMedium" -    valign="bottom" +    valign="top"      halign="left"      height="20"      layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index cea19ec75c..2afc7fd3d1 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <floater - open_positioning="cascading" + positioning="cascading"   can_resize="true"   can_minimize="true"   can_close="true" diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml index 77fb21e27c..35cb2670d0 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_effect.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml @@ -36,15 +36,20 @@    <string name="effect_Cyber">Cyber</string>    <string name="effect_DeepBot">DeepBot</string>    <string name="effect_Demon">Demon</string> +  <string name="effect_Female Elf">Female Elf</string>    <string name="effect_Flirty">Flirty</string>    <string name="effect_Foxy">Foxy</string> -  <string name="effect_Halloween_2010_Bonus">Halloween_2010_Bonus</string> +  <string name="effect_Halloween 2010 Bonus">Halloween_2010_Bonus</string>    <string name="effect_Helium">Helium</string>    <string name="effect_Husky">Husky</string> +  <string name="effect_Husky Whisper">Husky Whisper</string>    <string name="effect_Intercom">Intercom</string> +  <string name="effect_Julia">Julia</string> +  <string name="effect_Lo Lilt">Lo Lilt</string>    <string name="effect_Macho">Macho</string>    <string name="effect_Micro">Micro</string>    <string name="effect_Mini">Mini</string> +  <string name="effect_Model">Model</string>    <string name="effect_Nano">Nano</string>    <string name="effect_Nightmare">Nightmare</string>    <string name="effect_PopBot">PopBot</string> @@ -52,10 +57,12 @@    <string name="effect_Radio">Radio</string>    <string name="effect_Robot">Robot</string>    <string name="effect_Roxanne">Roxanne</string> +  <string name="effect_Rumble">Rumble</string>    <string name="effect_Sabrina">Sabrina</string>    <string name="effect_Samantha">Samantha</string>    <string name="effect_Sexy">Sexy</string>    <string name="effect_Shorty">Shorty</string> +  <string name="effect_Smaller">Smaller</string>    <string name="effect_Sneaky">Sneaky</string>    <string name="effect_Stallion">Stallion</string>    <string name="effect_Sultry">Sultry</string> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 56d79f62c7..83407069d2 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -2,7 +2,7 @@  <floater   legacy_header_height="18"   can_resize="true" - open_positioning="centered" + positioning="centered"   height="600"   layout="topleft"   min_height="520" diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml index f818ebe2d7..63e154697b 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml @@ -114,6 +114,15 @@       function="Object.EnableMute" />    </menu_item_call>    <menu_item_call +   label="Unblock" +   layout="topleft" +   name="unblock"> +    <menu_item_call.on_click +     function="Object.Mute" /> +    <menu_item_call.on_visible +     function="Object.EnableUnmute" /> +  </menu_item_call> +  <menu_item_call      label="Zoom In"      layout="topleft"     name="zoom_in"> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 1f72984166..6443e432fe 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -153,13 +153,6 @@           function="BuyCurrency" />        </menu_item_call>        <menu_item_call -         label="Merchant Outbox..." -         name="MerchantOutbox"> -        <menu_item_call.on_click -         function="Floater.ToggleOrBringToFront" -         parameter="outbox" /> -      </menu_item_call> -      <menu_item_call             label="Account dashboard..."             name="Manage My Account">          <menu_item_call.on_click @@ -2419,6 +2412,16 @@             function="Advanced.ToggleInfoDisplay"             parameter="rendercomplexity" />          </menu_item_check> +        <menu_item_check +         label="Attachment Bytes" +         name="attachment bytes"> +          <menu_item_check.on_check +           function="Advanced.CheckInfoDisplay" +           parameter="attachment bytes" /> +          <menu_item_check.on_click +           function="Advanced.ToggleInfoDisplay" +           parameter="attachment bytes" /> +        </menu_item_check>  		<menu_item_check           label="Sculpt"           name="Sculpt"> @@ -3258,7 +3261,15 @@              <menu_item_call.on_click               function="Advanced.CompressImage" />          </menu_item_call> -        <menu_item_check + +      <menu_item_call +         label="Enable Visual Leak Detector" +         name="Enable Visual Leak Detector"> +        <menu_item_call.on_click +           function="Advanced.ToggleVisualLeakDetector" /> +        </menu_item_call> +       +      <menu_item_check           label="Output Debug Minidump"           name="Output Debug Minidump">              <menu_item_check.on_check diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml index 2645d472f9..5c5c718bdf 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_header.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml @@ -23,7 +23,7 @@      <text        parse_urls="false"        allow_scroll="false" -      v_pad = "7" +      v_pad = "6"        read_only = "true"        follows="left|right"        font.style="BOLD" @@ -37,7 +37,7 @@        top="0"        translate="false"        use_ellipses="true" -      valign="bottom"  +      valign="top"         value="TestString PleaseIgnore" />    <text      allow_scroll="false" @@ -49,7 +49,7 @@      left_pad="5"      name="time_box"      right="-5" -    top="8" +    top="7"      value="23:30"      width="110" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml index 6af1105400..1b97de2b05 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_item.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml @@ -16,13 +16,13 @@          top="3"          width="18" />  	<text_chat -      top="5" +      top="3"        left="30"        height="120"        text_color="white"        word_wrap="true"        mouse_opaque="true" -      valign="bottom" +      valign="top"        name="msg_text">  	</text_chat>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index a7178dc288..eea2606125 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -172,7 +172,7 @@ including the Everyone and Owner Roles.               draw_heading="true"               draw_stripes="false"               heading_height="23" -             height="130" +             height="132"               layout="topleft"               search_column="1"               left="0" diff --git a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml index 383e637ace..413e22e444 100644 --- a/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_inbox_inventory.xml @@ -1,5 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <inbox_inventory_panel +    accepts_drag_and_drop="false"      name="inventory_inbox"      start_folder="Received Items"      follows="all" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index d2088594dd..fd6e96b9a7 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -271,7 +271,7 @@                  <text_editor                   bg_readonly_color="DkGray2"                   follows="all" -                 height="70" +                 height="75"                   layout="topleft"                   left="0"                   max_length="127" @@ -288,7 +288,7 @@                   layout="topleft"                   left="0"                   name="folder_label" -                 top_pad="15" +                 top_pad="10"                   value="Landmark location:"                   width="290" />                  <combo_box diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index bb942f2c81..3edeb9aa36 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -70,7 +70,7 @@             layout="topleft"             auto_resize="true"             user_resize="true" -           min_width="480" +           min_width="410"             name="navigation_layout_panel"             width="480">  	        <panel @@ -148,15 +148,15 @@  	         layout="topleft"             auto_resize="true"             user_resize="true" -           min_width="315" +           min_width="185"             name="favorites_layout_panel" -           width="315"> +           width="320">             <icon               follows="top|left"               height="25"               image_name="ChatBarHandle"               layout="topleft" -             left="-318" +             left="-323"               name="resize_handle"               top="4"               width="5" /> @@ -171,7 +171,7 @@               name="favorite"               image_drag_indication="Accordion_ArrowOpened_Off"               tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!" -             width="311"> +             width="320">              <label               follows="left|top"               height="13" diff --git a/indra/newview/skins/default/xui/en/panel_postcard_settings.xml b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml index e9427a2388..3f67a48b14 100644 --- a/indra/newview/skins/default/xui/en/panel_postcard_settings.xml +++ b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml @@ -85,6 +85,7 @@               top_delta="0"               width="95" />              <check_box +              height="10"               bottom_delta="20"               follows="left|top"               label="Constrain proportions" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 47236c1a48..587c461bee 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -59,7 +59,6 @@       top_pad="30"       width="350" />      <check_box -     enabled_control="EnableVoiceChat"       control_name="VoiceCallsFriendsOnly"       height="16"       label="Only friends and groups can call or IM me" diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index 6b28639a77..bfd796a62b 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -134,26 +134,26 @@       name="Only Allow"       top_delta="-30"       width="278"> -        Restrict Access to accounts verified by: +        Allow access only to Residents who:      </text>      <check_box       follows="top|left"       height="16" -     label="Payment Information on File" +     label="Have payment information on file"       layout="topleft"       left_delta="0"       name="limit_payment" -     tool_tip="Ban unidentified Residents" +     tool_tip="Residents must have payment information on file to access this estate.  See the [SUPPORT_SITE] for more information."       top_pad="2"       width="278" />      <check_box       follows="top|left"       height="16" -     label="Age Verification" +     label="Have been age-verified"       layout="topleft"       left_delta="0"       name="limit_age_verified" -     tool_tip="Ban Residents who have not verified their age. See the [SUPPORT_SITE] for more information." +     tool_tip="Residents must be age verified to access this estate. See the [SUPPORT_SITE] for more information."       top_pad="2"       width="278" /> diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml index 9057ebb65e..71d808fa4b 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -114,6 +114,7 @@       width="95" />      <check_box       bottom_delta="20" +     height="10"       follows="left|top"       label="Constrain proportions"       layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml index b966358f18..781ab17403 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -132,6 +132,7 @@               width="95" />              <check_box               bottom_delta="20" +             height="10"               follows="left|top"               label="Constrain proportions"               layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml index 5bd383b81e..0dd357aa1a 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml @@ -119,6 +119,7 @@               top_delta="0"               width="95" />              <check_box +              height="10"               bottom_delta="20"               label="Constrain proportions"               layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 22c1139cdb..3aa34439f1 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -35,8 +35,8 @@      </panel.string>    <panel      height="18" -    left="-370" -    width="160" +    left="-395" +    width="185"      top="1"      follows="right|top"       name="balance_bg"> diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml index 062c403a26..66c4b170b6 100644 --- a/indra/newview/skins/default/xui/en/panel_toast.xml +++ b/indra/newview/skins/default/xui/en/panel_toast.xml @@ -10,7 +10,6 @@  -->  <floater - open_positioning="none"   legacy_header_height="0"   header_height="0"   name="toast" diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml index 1e06a60f55..29e27cb146 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml @@ -48,7 +48,7 @@                        height="300"                        width="330" />               </layout_panel> -			 <layout_panel +			    <layout_panel                   width="330"                   layout="topleft"                   auto_resize="true" diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml index adbb183317..97a5ae7d4e 100644 --- a/indra/newview/skins/default/xui/en/widgets/floater.xml +++ b/indra/newview/skins/default/xui/en/widgets/floater.xml @@ -2,7 +2,7 @@  <!-- See also settings.xml UIFloater* settings for configuration -->  <floater   name="floater" - open_positioning="none" + positioning="none"   layout="topleft"   bg_opaque_color="FloaterFocusBackgroundColor"   bg_alpha_color="FloaterDefaultBackgroundColor" diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 8f8126444d..0586119681 100644 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -11,7 +11,7 @@ label_pad_left - padding to the left of tab button labels                 halign="center"                 font="SansSerifSmall"                  tab_height="21" -               label_pad_bottom="0" +               label_pad_bottom="1"                 label_pad_left="4">    <!--    Possible additional attributes for tabs: diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml index 79b2c32b23..7eead3bc18 100644 --- a/indra/newview/skins/default/xui/es/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		[AMT] L$  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-410" name="balance_bg" width="200">  		<text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="20 L$"/>  		<button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>  		<button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index c0d59a3182..ba36a7d299 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		[AMT] L$  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-405" name="balance_bg" width="195">  		<text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="20 L$"/>  		<button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/>  		<button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/> diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml index 4abc90113f..0aaf89d8c8 100644 --- a/indra/newview/skins/default/xui/it/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-405" name="balance_bg" width="195">  		<text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ 20"/>  		<button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>  		<button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 4fb876f690..f09643d562 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-370" name="balance_bg" width="160">  		<text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$20"/>  		<button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>  		<button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く"  width="40"/> diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml index 22853f0643..cb9a6eb757 100644 --- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-410" name="balance_bg" width="200">  		<text name="balance" tool_tip="Atualizar saldo de L$" value="L$20"/>  		<button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>  		<button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/> diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml index babe5811ac..9c84ff1fd8 100644 --- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-450" name="balance_bg" width="240">  		<text name="balance" tool_tip="Щелкните для обновления вашего баланса L$" value="L$20"/>  		<button label="Купить L$" name="buyL" tool_tip="Щелкните для покупки L$"/>  		<button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/> diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml index 81c304a5d8..178cbda4a2 100644 --- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml @@ -15,7 +15,7 @@  	<panel.string name="buycurrencylabel">  		L$ [AMT]  	</panel.string> -	<panel name="balance_bg"> +	<panel left="-425" name="balance_bg" width="215">  		<text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$20"/>  		<button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/>  		<button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/> diff --git a/indra/newview/tests/llworldmipmap_test.cpp b/indra/newview/tests/llworldmipmap_test.cpp index 4c0959d1a9..e7ef017760 100644 --- a/indra/newview/tests/llworldmipmap_test.cpp +++ b/indra/newview/tests/llworldmipmap_test.cpp @@ -100,9 +100,9 @@ namespace tut  	{  		S32 level = mMap->scaleToLevel(0.0);  		ensure("scaleToLevel() test 1 failed", level == LLWorldMipmap::MAP_LEVELS); -		level = mMap->scaleToLevel(LLWorldMipmap::MAP_TILE_SIZE); +		level = mMap->scaleToLevel((F32)LLWorldMipmap::MAP_TILE_SIZE);  		ensure("scaleToLevel() test 2 failed", level == 1); -		level = mMap->scaleToLevel(10 * LLWorldMipmap::MAP_TILE_SIZE); +		level = mMap->scaleToLevel(10.f * LLWorldMipmap::MAP_TILE_SIZE);  		ensure("scaleToLevel() test 3 failed", level == 1);  	}  	// Test 2 : globalToMipmap() diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp index e88d1bf811..19ac418e9e 100644 --- a/indra/viewer_components/updater/llupdatedownloader.cpp +++ b/indra/viewer_components/updater/llupdatedownloader.cpp @@ -39,7 +39,7 @@  #include "llsdserialize.h"  #include "llthread.h"  #include "llupdaterservice.h" - +#include "llcurl.h"  class LLUpdateDownloader::Implementation:  	public LLThread @@ -198,13 +198,19 @@ LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client &  LLUpdateDownloader::Implementation::~Implementation()  { -	if(isDownloading()) { +	if(isDownloading())  +	{  		cancel();  		shutdown(); -	} else { +	}  +	else  +	{  		; // No op.  	} -	if(mCurl) curl_easy_cleanup(mCurl); +	if(mCurl) +	{ +		LLCurl::deleteEasyHandle(mCurl); +	}  } @@ -406,9 +412,12 @@ void LLUpdateDownloader::Implementation::run(void)  void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & url, bool processHeader)  { -	if(mCurl == 0) { -		mCurl = curl_easy_init(); -	} else { +	if(mCurl == 0)  +	{ +		mCurl = LLCurl::newEasyHandle(); +	}  +	else  +	{  		curl_easy_reset(mCurl);  	} diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index 1888f191e2..2e18218667 100644 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -447,7 +447,7 @@ void LLUpdaterServiceImpl::restartTimer(unsigned int seconds)  	LL_INFOS("UpdaterService") << "will check for update again in " <<   	seconds << " seconds" << LL_ENDL;   	mTimer.start(); -	mTimer.setTimerExpirySec(seconds); +	mTimer.setTimerExpirySec((F32)seconds);  	LLEventPumps::instance().obtain("mainloop").listen(  		sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));  }  | 
