diff options
141 files changed, 12341 insertions, 10926 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt index 2a37015b01..99a0e7ad9e 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -50,6 +50,9 @@ Alissa Sabre          VWR-6430          VWR-1843          VWR-6668 +        VWR-7153 +        VWR-7168 +        VWR-7087  Angus Boyd  	VWR-592  Argent Stonecutter diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index c495b7f7c6..eb1fb68991 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -20,16 +20,16 @@ else (STANDALONE)        ${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release        )      set(APR_LIBRARIES  -      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apr-1 -      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apr-1 +      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apr-1.lib +      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apr-1.lib        )      set(APRUTIL_LIBRARIES  -      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/aprutil-1 -      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/aprutil-1 +      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/aprutil-1.lib +      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/aprutil-1.lib        )      set(APRICONV_LIBRARIES  -      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apriconv-1 -      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apriconv-1 +      debug ${WINLIBS_PREBUILT_DEBUG_DIR}/apriconv-1.lib +      optimized ${WINLIBS_PREBUILT_RELEASE_DIR}/apriconv-1.lib        )    elseif (DARWIN)      set(APR_LIBRARIES  diff --git a/indra/lib/python/indra/base/llsd.py b/indra/lib/python/indra/base/llsd.py index 9561a56710..8e71aee060 100644 --- a/indra/lib/python/indra/base/llsd.py +++ b/indra/lib/python/indra/base/llsd.py @@ -247,6 +247,78 @@ def format_xml(something):          _g_xml_formatter = LLSDXMLFormatter()      return _g_xml_formatter.format(something) +class LLSDXMLPrettyFormatter(LLSDXMLFormatter): +    def __init__(self, indent_atom = None): +        # Call the super class constructor so that we have the type map +        super(LLSDXMLPrettyFormatter, self).__init__() + +        # Override the type map to use our specialized formatters to +        # emit the pretty output. +        self.type_map[list] = self.PRETTY_ARRAY +        self.type_map[tuple] = self.PRETTY_ARRAY +        self.type_map[types.GeneratorType] = self.PRETTY_ARRAY, +        self.type_map[dict] = self.PRETTY_MAP + +        # Private data used for indentation. +        self._indent_level = 1 +        if indent_atom is None: +            self._indent_atom = '  ' +        else: +            self._indent_atom = indent_atom + +    def _indent(self): +        "Return an indentation based on the atom and indentation level." +        return self._indent_atom * self._indent_level + +    def PRETTY_ARRAY(self, v): +        rv = [] +        rv.append('<array>\n') +        self._indent_level = self._indent_level + 1 +        rv.extend(["%s%s\n" % +                   (self._indent(), +                    self.generate(item)) +                   for item in v]) +        self._indent_level = self._indent_level - 1 +        rv.append(self._indent()) +        rv.append('</array>') +        return ''.join(rv) + +    def PRETTY_MAP(self, v): +        rv = [] +        rv.append('<map>\n') +        self._indent_level = self._indent_level + 1 +        keys = v.keys() +        keys.sort() +        rv.extend(["%s%s\n%s%s\n" % +                   (self._indent(), +                    self.elt('key', key), +                    self._indent(), +                    self.generate(v[key])) +                   for key in keys]) +        self._indent_level = self._indent_level - 1 +        rv.append(self._indent()) +        rv.append('</map>') +        return ''.join(rv) + +    def format(self, something): +        data = [] +        data.append('<?xml version="1.0" ?>\n<llsd>') +        data.append(self.generate(something)) +        data.append('</llsd>\n') +        return '\n'.join(data) + +def format_pretty_xml(something): +    """@brief Serialize a python object as 'pretty' llsd xml. + +    The output conforms to the LLSD DTD, unlike the output from the +    standard python xml.dom DOM::toprettyxml() method which does not +    preserve significant whitespace.  +    This function is not necessarily suited for serializing very large +    objects. It is not optimized by the cllsd module, and sorts on +    dict (llsd map) keys alphabetically to ease human reading. +    """ +    return LLSDXMLPrettyFormatter().format(something) +  class LLSDNotationFormatter(object):      def __init__(self):          self.type_map = { @@ -834,6 +906,7 @@ class LLSD(object):      parse = staticmethod(parse)      toXML = staticmethod(format_xml) +    toPrettyXML = staticmethod(format_pretty_xml)      toBinary = staticmethod(format_binary)      toNotation = staticmethod(format_notation) diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index fa3a01c191..1d85bc0e70 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -1072,6 +1072,29 @@ namespace LLError  				s.uniqueLogMessages[message] = 1;  			}  		} + +		if (site.mPrintOnce) +		{ +			std::map<std::string, unsigned int>::iterator messageIter = s.uniqueLogMessages.find(message); +			if (messageIter != s.uniqueLogMessages.end()) +			{ +				messageIter->second++; +				unsigned int num_messages = messageIter->second; +				if (num_messages == 10 || num_messages == 50 || (num_messages % 100) == 0) +				{ +					prefix << "ONCE (" << num_messages << "th time seen): "; +				}  +				else +				{ +					return; +				} +			} +			else  +			{ +				prefix << "ONCE: "; +				s.uniqueLogMessages[message] = 1; +			} +		}  		prefix << message;  		message = prefix.str(); diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index 079f2b3258..4ca6a12435 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -314,72 +314,77 @@ U64 getCurrentRSS()  #elif defined(LL_DARWIN) -static U32 getPageSize() -{ -	int ctl[2] = { CTL_HW, HW_PAGESIZE }; -	int page_size; -	size_t size = sizeof(page_size); - -	if (sysctl(ctl, 2, &page_size, &size, NULL, 0) == -1) -	{ -		llwarns << "Couldn't get page size" << llendl; -		return 0; -	} else { -		return page_size; -	} -} +// This can cause bad stalls! Replace with fast version + +// static U32 getPageSize() +// { +// 	int ctl[2] = { CTL_HW, HW_PAGESIZE }; +// 	int page_size; +// 	size_t size = sizeof(page_size); + +// 	if (sysctl(ctl, 2, &page_size, &size, NULL, 0) == -1) +// 	{ +// 		llwarns << "Couldn't get page size" << llendl; +// 		return 0; +// 	} else { +// 		return page_size; +// 	} +// }  U64 getCurrentRSS()  { -	task_t task = mach_task_self(); -	vm_address_t addr = VM_MIN_ADDRESS; -	vm_size_t size = 0; -	U64 residentPages = 0; - -	while (true) -	{ -		mach_msg_type_number_t bcount = VM_REGION_BASIC_INFO_COUNT; -		vm_region_basic_info binfo; -		mach_port_t bobj; -		kern_return_t ret; +	// Stalls!!! +	 +// 	task_t task = mach_task_self(); +// 	vm_address_t addr = VM_MIN_ADDRESS; +// 	vm_size_t size = 0; +// 	U64 residentPages = 0; + +// 	while (true) +// 	{ +// 		mach_msg_type_number_t bcount = VM_REGION_BASIC_INFO_COUNT; +// 		vm_region_basic_info binfo; +// 		mach_port_t bobj; +// 		kern_return_t ret; -		addr += size; +// 		addr += size; -		ret = vm_region(task, &addr, &size, VM_REGION_BASIC_INFO, -						(vm_region_info_t) &binfo, &bcount, &bobj); +// 		ret = vm_region(task, &addr, &size, VM_REGION_BASIC_INFO, +// 						(vm_region_info_t) &binfo, &bcount, &bobj); -		if (ret != KERN_SUCCESS) -		{ -			break; -		} +// 		if (ret != KERN_SUCCESS) +// 		{ +// 			break; +// 		} -		if (bobj != MACH_PORT_NULL) -		{ -			mach_port_deallocate(task, bobj); -		} +// 		if (bobj != MACH_PORT_NULL) +// 		{ +// 			mach_port_deallocate(task, bobj); +// 		} -		mach_msg_type_number_t ecount = VM_REGION_EXTENDED_INFO_COUNT; -		vm_region_extended_info einfo; -		mach_port_t eobj; - -		ret = vm_region(task, &addr, &size, VM_REGION_EXTENDED_INFO, -						(vm_region_info_t) &einfo, &ecount, &eobj); - -		if (ret != KERN_SUCCESS) -		{ -			llwarns << "vm_region failed" << llendl; -			return 0; -		} +// 		mach_msg_type_number_t ecount = VM_REGION_EXTENDED_INFO_COUNT; +// 		vm_region_extended_info einfo; +// 		mach_port_t eobj; + +// 		ret = vm_region(task, &addr, &size, VM_REGION_EXTENDED_INFO, +// 						(vm_region_info_t) &einfo, &ecount, &eobj); + +// 		if (ret != KERN_SUCCESS) +// 		{ +// 			llwarns << "vm_region failed" << llendl; +// 			return 0; +// 		} -		if (eobj != MACH_PORT_NULL) -		{ -			mach_port_deallocate(task, eobj); -		} +// 		if (eobj != MACH_PORT_NULL) +// 		{ +// 			mach_port_deallocate(task, eobj); +// 		} -		residentPages += einfo.pages_resident; -	} +// 		residentPages += einfo.pages_resident; +// 	} -	return residentPages * getPageSize(); +// 	return residentPages * getPageSize(); +	return 0;  }  #elif defined(LL_LINUX) diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index d4bbef7e13..2cdb55eb19 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -34,7 +34,7 @@  const S32 LL_VERSION_MAJOR = 1;  const S32 LL_VERSION_MINOR = 20; -const S32 LL_VERSION_PATCH = 6; +const S32 LL_VERSION_PATCH = 9;  const S32 LL_VERSION_BUILD = 0;  const char * const LL_CHANNEL = "Second Life Release"; diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index ecc4b09d10..3b01140e3a 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -4789,6 +4789,11 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)  		mIndices.resize(num_indices);  		mEdge.resize(num_indices);  	} +	else +	{ +		mHasBinormals = FALSE; +	} +  	LLVector3& face_min = mExtents[0];  	LLVector3& face_max = mExtents[1]; diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 9938a0198b..2dba8ef60d 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -23,11 +23,10 @@ set(llrender_SOURCE_FILES      llfont.cpp      llfontgl.cpp      llgldbg.cpp -    llglimmediate.cpp      llimagegl.cpp +    llrender.cpp      llrendertarget.cpp      llvertexbuffer.cpp -    llvertexprogramgl.cpp      )  set(llrender_HEADER_FILES @@ -36,11 +35,10 @@ set(llrender_HEADER_FILES      llfontgl.h      llfont.h      llgldbg.h -    llglimmediate.h      llimagegl.h +    llrender.h      llrendertarget.h      llvertexbuffer.h -    llvertexprogramgl.h      )  set_source_files_properties(${llrender_HEADER_FILES} diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 3a408b5550..1e0d9767ca 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -36,7 +36,7 @@  #include "llfont.h"  #include "llfontgl.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "v4color.h"  #include "llstl.h" @@ -665,7 +665,8 @@ S32 LLFontGL::render(const LLWString &wstr,  	mImageGLp->bind(0); - 	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Not guaranteed to be set correctly + 	// Not guaranteed to be set correctly +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	cur_x = ((F32)x * sScaleX);  	cur_y = ((F32)y * sScaleY); diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 55fa48f437..dd9f22361f 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -41,7 +41,7 @@  #include "llmath.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  //---------------------------------------------------------------------------- @@ -61,6 +61,8 @@ S32 LLImageGL::sCount					= 0;  BOOL LLImageGL::sGlobalUseAnisotropic	= FALSE;  F32 LLImageGL::sLastFrameTime			= 0.f; +BOOL LLImageGL::sRefCheck = TRUE ; +  std::set<LLImageGL*> LLImageGL::sImageList;  //---------------------------------------------------------------------------- @@ -130,13 +132,13 @@ void LLImageGL::bindExternalTexture(LLGLuint gl_name, S32 stage, LLGLenum bind_t  	gGL.flush();  	if (stage > 0)  	{ -		glActiveTextureARB(GL_TEXTURE0_ARB + stage); +		gGL.getTexUnit(stage)->activate();  	}  	glBindTexture(bind_target, gl_name);  	sCurrentBoundTextures[stage] = gl_name;  	if (stage > 0)  	{ -		glActiveTextureARB(GL_TEXTURE0_ARB); +		gGL.getTexUnit(0)->activate();  	}  } @@ -149,9 +151,9 @@ void LLImageGL::unbindTexture(S32 stage, LLGLenum bind_target)  		gGL.flush();  		if (stage > 0)  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB + stage); +			gGL.getTexUnit(stage)->activate();  			glBindTexture(GL_TEXTURE_2D, 0); -			glActiveTextureARB(GL_TEXTURE0_ARB); +			gGL.getTexUnit(0)->activate();  		}  		else  		{ @@ -276,7 +278,10 @@ LLImageGL::LLImageGL(const LLImageRaw* imageraw, BOOL usemipmaps)  	setSize(0, 0, 0);  	sImageList.insert(this);  	sCount++; + +	sRefCheck = FALSE ;  	createGLTexture(0, imageraw);  +	sRefCheck = TRUE ;  }  LLImageGL::~LLImageGL() @@ -304,7 +309,9 @@ void LLImageGL::init(BOOL usemipmaps)  	mIsResident       = 0;  	mClampS			  = FALSE;  	mClampT			  = FALSE; -	mMipFilterNearest  = FALSE; +	mClampR			  = FALSE; +	mMagFilterNearest  = FALSE; +	mMinFilterNearest  = FALSE;  	mWidth				= 0;  	mHeight				= 0;  	mComponents			= 0; @@ -331,17 +338,19 @@ void LLImageGL::cleanup()  //---------------------------------------------------------------------------- +//this function is used to check the size of a texture image. +//so dim should be a positive number  static bool check_power_of_two(S32 dim)  { -	while(dim > 1) +	if(dim < 0)  	{ -		if (dim & 1) -		{ -			return false; -		} -		dim >>= 1; +		return false ; +	} +	if(!dim)//0 is a power-of-two number +	{ +		return true ;  	} -	return true; +	return !(dim & (dim - 1)) ;  }  //static @@ -418,6 +427,8 @@ void LLImageGL::dump()  BOOL LLImageGL::bindTextureInternal(const S32 stage) const  { +	llassert_always(!sRefCheck || (getNumRefs() > 0 && getNumRefs() < 100000)) ;	 +	  	if (gGLManager.mIsDisabled)  	{  		llwarns << "Trying to bind a texture while GL is disabled!" << llendl; @@ -439,7 +450,7 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const  		gGL.flush();  		if (stage > 0)  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB + stage); +			gGL.getTexUnit(stage)->activate();  		}  		glBindTexture(mBindTarget, mTexName); @@ -448,7 +459,7 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const  		if (stage > 0)  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB); +			gGL.getTexUnit(0)->activate();  		}  		if (mLastBindTime != sLastFrameTime) @@ -466,12 +477,12 @@ BOOL LLImageGL::bindTextureInternal(const S32 stage) const  		gGL.flush();  		if (stage > 0)  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB+stage); +			gGL.getTexUnit(stage)->activate();  		}  		glBindTexture(mBindTarget, 0);  		if (stage > 0)  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB+stage); +			gGL.getTexUnit(0)->activate();  		}  		sCurrentBoundTextures[stage] = 0;  		return FALSE; @@ -941,7 +952,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_  	setImage(data_in, data_hasmips);  	setClamp(mClampS, mClampT); -	setMipFilterNearest(mMipFilterNearest); +	setMipFilterNearest(mMagFilterNearest);  	// things will break if we don't unbind after creation  	unbindTexture(0, mBindTarget); @@ -1044,8 +1055,23 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre  	S32 gl_discard = discard_level - mCurrentDiscardLevel; +	//explicitly unbind texture  +	LLImageGL::unbindTexture(0, mTarget);  	llverify(bindTextureInternal(0));	 +	if (gDebugGL) +	{ +		if (mTarget == GL_TEXTURE_2D) +		{ +			GLint texname; +			glGetIntegerv(GL_TEXTURE_BINDING_2D, &texname); +			if (texname != mTexName) +			{ +				llerrs << "Invalid texture bound!" << llendl; +			} +		} +	} +  	LLGLint glwidth = 0;  	glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_WIDTH, (GLint*)&glwidth);  	if (glwidth == 0) @@ -1153,25 +1179,55 @@ void LLImageGL::destroyGLTexture()  //---------------------------------------------------------------------------- -void LLImageGL::setClamp(BOOL clamps, BOOL clampt) +void LLImageGL::glClampCubemap (BOOL clamps, BOOL clampt, BOOL clampr) +{ +	glTexParameteri (GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT); +	glTexParameteri (GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT); +	glTexParameteri (GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT); +} + +void LLImageGL::glClamp (BOOL clamps, BOOL clampt)  { -	mClampS = clamps; -	mClampT = clampt;  	if (mTexName != 0)  	{ -		glTexParameteri(mBindTarget, GL_TEXTURE_WRAP_S, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT); -		glTexParameteri(mBindTarget, GL_TEXTURE_WRAP_T, clampt ? GL_CLAMP_TO_EDGE : GL_REPEAT); +		glTexParameteri (mBindTarget, GL_TEXTURE_WRAP_S, clamps ? GL_CLAMP_TO_EDGE : GL_REPEAT); +		glTexParameteri (mBindTarget, GL_TEXTURE_WRAP_T, clampt ? GL_CLAMP_TO_EDGE : GL_REPEAT);  	} -	stop_glerror();  } -void LLImageGL::setMipFilterNearest(BOOL nearest, BOOL min_nearest) +void LLImageGL::setClampCubemap (BOOL clamps, BOOL clampt, BOOL clampr) +{ +	mClampS = clamps; +	mClampT = clampt; +	mClampR = clampr; +	glClampCubemap (clamps, clampt, clampr); +} + +void LLImageGL::setClamp(BOOL clamps, BOOL clampt) +{ +	mClampS = clamps; +	mClampT = clampt; +	glClamp (clamps, clampt); +} + +void LLImageGL::overrideClamp (BOOL clamps, BOOL clampt) +{ +	glClamp (clamps, clampt); +} + +void LLImageGL::restoreClamp (void) +{ +	glClamp (mClampS, mClampT); +} + +void LLImageGL::setMipFilterNearest(BOOL mag_nearest, BOOL min_nearest)  { -	mMipFilterNearest = nearest; +	mMagFilterNearest = mag_nearest; +	mMinFilterNearest = min_nearest;  	if (mTexName != 0)  	{ -		if (min_nearest) +		if (mMinFilterNearest)  		{  			glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  		} @@ -1183,7 +1239,7 @@ void LLImageGL::setMipFilterNearest(BOOL nearest, BOOL min_nearest)  		{  			glTexParameteri(mBindTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  		} -		if (mMipFilterNearest) +		if (mMagFilterNearest)  		{  			glTexParameteri(mBindTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  		} @@ -1193,7 +1249,7 @@ void LLImageGL::setMipFilterNearest(BOOL nearest, BOOL min_nearest)  		}  		if (gGLManager.mHasAnisotropic)  		{ -			if (sGlobalUseAnisotropic && !mMipFilterNearest) +			if (sGlobalUseAnisotropic && !mMagFilterNearest)  			{  				F32 largest_anisotropy;  				glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest_anisotropy); diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 82ea147d6e..c5fe9b7299 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -81,6 +81,10 @@ protected:  	virtual ~LLImageGL();  	BOOL bindTextureInternal(const S32 stage = 0) const; +private: +	void glClamp (BOOL clamps, BOOL clampt); +	void glClampCubemap (BOOL clamps, BOOL clampt, BOOL clampr = FALSE); +  public:  	virtual void dump();	// debugging info to llinfos  	virtual BOOL bind(const S32 stage = 0) const; @@ -99,8 +103,11 @@ public:  	BOOL readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compressed_ok);   	void destroyGLTexture(); +	void setClampCubemap (BOOL clamps, BOOL clampt, BOOL clampr = FALSE);  	void setClamp(BOOL clamps, BOOL clampt); -	void setMipFilterNearest(BOOL nearest, BOOL min_nearest = FALSE); +	void overrideClamp (BOOL clamps, BOOL clampt); +	void restoreClamp (void); +	void setMipFilterNearest(BOOL mag_nearest, BOOL min_nearest = FALSE);  	void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE);  	void dontDiscard() { mDontDiscard = 1; } @@ -117,7 +124,8 @@ public:  	BOOL getClampS() const { return mClampS; }  	BOOL getClampT() const { return mClampT; } -	BOOL getMipFilterNearest() const { return mMipFilterNearest; } +	BOOL getClampR() const { return mClampR; } +	BOOL getMipFilterNearest() const { return mMagFilterNearest; }  	BOOL getHasGLTexture() const { return mTexName != 0; }  	LLGLuint getTexName() const { return mTexName; } @@ -167,7 +175,9 @@ protected:  	S8 mClampS;					// Need to save clamp state  	S8 mClampT; -	S8 mMipFilterNearest;		// if TRUE, set magfilter to GL_NEAREST +	S8 mClampR; +	S8 mMagFilterNearest;		// if TRUE, set magfilter to GL_NEAREST +	S8 mMinFilterNearest;		// if TRUE, set minfilter to GL_NEAREST  	LLGLint  mFormatInternal; // = GL internalformat  	LLGLenum mFormatPrimary;  // = GL format (pixel data format) @@ -197,6 +207,9 @@ public:  #else  	BOOL getMissed() const { return FALSE; };  #endif + +private://paranoia error check +	static BOOL sRefCheck ;  };  #endif // LL_LLIMAGEGL_H diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp new file mode 100644 index 0000000000..1168155f8b --- /dev/null +++ b/indra/llrender/llrender.cpp @@ -0,0 +1,704 @@ +/**  + * @file llrender.cpp + * @brief LLRender implementation + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "linden_common.h" + +#include "llrender.h" +#include "llvertexbuffer.h" + +LLRender gGL; + +static const U32 LL_NUM_TEXTURE_LAYERS = 8;  + +static GLenum sGLCompareFunc[] = +{ +	GL_NEVER, +	GL_ALWAYS, +	GL_LESS, +	GL_LEQUAL, +	GL_EQUAL, +	GL_NOTEQUAL, +	GL_GEQUAL, +	GL_GREATER +}; + +const U32 immediate_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TEXCOORD; + +static GLenum sGLBlendFactor[] = +{ +	GL_ONE, +	GL_ZERO, +	GL_DST_COLOR, +	GL_SRC_COLOR, +	GL_ONE_MINUS_DST_COLOR, +	GL_ONE_MINUS_SRC_COLOR, +	GL_DST_ALPHA, +	GL_SRC_ALPHA, +	GL_ONE_MINUS_DST_ALPHA, +	GL_ONE_MINUS_SRC_ALPHA +}; + +LLTexUnit::LLTexUnit(U32 index) +: mIsEnabled(false), mCurrBlendType(TB_MULT),  +mCurrColorOp(TBO_MULT), mCurrAlphaOp(TBO_MULT), +mCurrColorSrc1(TBS_TEX_COLOR), mCurrColorSrc2(TBS_PREV_COLOR), +mCurrAlphaSrc1(TBS_TEX_ALPHA), mCurrAlphaSrc2(TBS_PREV_ALPHA), +mCurrColorScale(1), mCurrAlphaScale(1) +{ +	llassert_always(index < LL_NUM_TEXTURE_LAYERS); +	mIndex = index; +} + +U32 LLTexUnit::getIndex(void) +{ +	return mIndex; +} + +void LLTexUnit::enable(void) +{ +	if (!mIsEnabled) +	{ +		activate(); +		glEnable(GL_TEXTURE_2D); +		mIsEnabled = true; +	} +} + +void LLTexUnit::disable(void) +{ +	if (mIsEnabled) +	{ +		activate(); +		glDisable(GL_TEXTURE_2D); +		mIsEnabled = false; +	} +} + +void LLTexUnit::activate(void) +{ +	//if (gGL.mCurrTextureUnitIndex != mIndex) +	{ +		glActiveTextureARB(GL_TEXTURE0_ARB + mIndex); +		gGL.mCurrTextureUnitIndex = mIndex; +	} +} + +// Useful for debugging that you've manually assigned a texture operation to the correct  +// texture unit based on the currently set active texture in opengl. +void LLTexUnit::debugTextureUnit(void) +{ +	GLint activeTexture; +	glGetIntegerv(GL_ACTIVE_TEXTURE_ARB, &activeTexture); +	if ((GL_TEXTURE0_ARB + mIndex) != activeTexture) +	{ +		llerrs << "Incorrect Texture Unit!  Expected: " << (activeTexture - GL_TEXTURE0_ARB) << " Actual: " << mIndex << llendl; +	} +} + +void LLTexUnit::bindTexture(const LLImageGL* texture) +{ +	if (texture != NULL) +	{ +		activate(); +		texture->bind(mIndex); +	} +} + +void LLTexUnit::unbindTexture(void) +{ +	activate(); +	glBindTexture(GL_TEXTURE_2D, 0); +} + +void LLTexUnit::setTextureBlendType(eTextureBlendType type) +{ +	// Do nothing if it's already correctly set. +	if (mCurrBlendType == type) +	{ +		return; +	} + +	activate(); +	mCurrBlendType = type; +	S32 scale_amount = 1; +	switch (type)  +	{ +		case TB_REPLACE: +			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +			break; +		case TB_ADD: +			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD); +			break; +		case TB_MULT: +			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +			break; +		case TB_MULT_X2: +			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +			scale_amount = 2; +			break; +		case TB_ALPHA_BLEND: +			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); +			break; +		case TB_COMBINE: +			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); +			break; +		default: +			llerrs << "Unknown Texture Blend Type: " << type << llendl; +			break; +	} +	setColorScale(scale_amount); +	setAlphaScale(1); +} + +GLint LLTexUnit::getTextureSource(eTextureBlendSrc src) +{ +	switch(src) +	{ +		// All four cases should return the same value. +		case TBS_PREV_COLOR: +		case TBS_PREV_ALPHA: +		case TBS_ONE_MINUS_PREV_COLOR: +		case TBS_ONE_MINUS_PREV_ALPHA: +			return GL_PREVIOUS_ARB; + +		// All four cases should return the same value. +		case TBS_TEX_COLOR: +		case TBS_TEX_ALPHA: +		case TBS_ONE_MINUS_TEX_COLOR: +		case TBS_ONE_MINUS_TEX_ALPHA: +			return GL_TEXTURE; + +		// All four cases should return the same value. +		case TBS_VERT_COLOR: +		case TBS_VERT_ALPHA: +		case TBS_ONE_MINUS_VERT_COLOR: +		case TBS_ONE_MINUS_VERT_ALPHA: +			return GL_PRIMARY_COLOR_ARB; + +		// All four cases should return the same value. +		case TBS_CONST_COLOR: +		case TBS_CONST_ALPHA: +		case TBS_ONE_MINUS_CONST_COLOR: +		case TBS_ONE_MINUS_CONST_ALPHA: +			return GL_CONSTANT_ARB; + +		default: +			llwarns << "Unknown eTextureBlendSrc: " << src << ".  Using Vertex Color instead." << llendl; +			return GL_PRIMARY_COLOR_ARB; +	} +} + +GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha) +{ +	switch(src) +	{ +		// All four cases should return the same value. +		case TBS_PREV_COLOR: +		case TBS_TEX_COLOR: +		case TBS_VERT_COLOR: +		case TBS_CONST_COLOR: +			return (isAlpha) ? GL_SRC_ALPHA: GL_SRC_COLOR; + +		// All four cases should return the same value. +		case TBS_PREV_ALPHA: +		case TBS_TEX_ALPHA: +		case TBS_VERT_ALPHA: +		case TBS_CONST_ALPHA: +			return GL_SRC_ALPHA; + +		// All four cases should return the same value. +		case TBS_ONE_MINUS_PREV_COLOR: +		case TBS_ONE_MINUS_TEX_COLOR: +		case TBS_ONE_MINUS_VERT_COLOR: +		case TBS_ONE_MINUS_CONST_COLOR: +			return (isAlpha) ? GL_ONE_MINUS_SRC_ALPHA : GL_ONE_MINUS_SRC_COLOR; + +		// All four cases should return the same value. +		case TBS_ONE_MINUS_PREV_ALPHA: +		case TBS_ONE_MINUS_TEX_ALPHA: +		case TBS_ONE_MINUS_VERT_ALPHA: +		case TBS_ONE_MINUS_CONST_ALPHA: +			return GL_ONE_MINUS_SRC_ALPHA; + +		default: +			llwarns << "Unknown eTextureBlendSrc: " << src << ".  Using Source Color or Alpha instead." << llendl; +			return (isAlpha) ? GL_SRC_ALPHA: GL_SRC_COLOR; +	} +} + +void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha) +{ +	activate(); +	if (mCurrBlendType != TB_COMBINE) +	{ +		mCurrBlendType = TB_COMBINE; +		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); +	} + +	// We want an early out, because this function does a LOT of stuff. +	if ( (isAlpha && (mCurrAlphaOp == op) && (mCurrAlphaSrc1 == src1) && (mCurrAlphaSrc2 == src2) ) +		|| (!isAlpha && (mCurrColorOp == op) && (mCurrColorSrc1 == src1) && (mCurrColorSrc2 == src2) )) +	{ +		return; +	} + +	// Get the gl source enums according to the eTextureBlendSrc sources passed in +	GLint source1 = getTextureSource(src1); +	GLint source2 = getTextureSource(src2); +	// Get the gl operand enums according to the eTextureBlendSrc sources passed in +	GLint operand1 = getTextureSourceType(src1, isAlpha); +	GLint operand2 = getTextureSourceType(src2, isAlpha); +	// Default the scale amount to 1 +	S32 scale_amount = 1; +	GLenum comb_enum, src0_enum, src1_enum, src2_enum, operand0_enum, operand1_enum, operand2_enum; +	 +	if (isAlpha) +	{ +		// Set enums to ALPHA ones +		comb_enum = GL_COMBINE_ALPHA_ARB; +		src0_enum = GL_SOURCE0_ALPHA_ARB; +		src1_enum = GL_SOURCE1_ALPHA_ARB; +		src2_enum = GL_SOURCE2_ALPHA_ARB; +		operand0_enum = GL_OPERAND0_ALPHA_ARB; +		operand1_enum = GL_OPERAND1_ALPHA_ARB; +		operand2_enum = GL_OPERAND2_ALPHA_ARB; + +		// cache current combiner +		mCurrAlphaOp = op; +		mCurrAlphaSrc1 = src1; +		mCurrAlphaSrc2 = src2; +	} +	else  +	{ +		// Set enums to ALPHA ones +		comb_enum = GL_COMBINE_RGB_ARB; +		src0_enum = GL_SOURCE0_RGB_ARB; +		src1_enum = GL_SOURCE1_RGB_ARB; +		src2_enum = GL_SOURCE2_RGB_ARB; +		operand0_enum = GL_OPERAND0_RGB_ARB; +		operand1_enum = GL_OPERAND1_RGB_ARB; +		operand2_enum = GL_OPERAND2_RGB_ARB; + +		// cache current combiner +		mCurrColorOp = op; +		mCurrColorSrc1 = src1; +		mCurrColorSrc2 = src2; +	} + +	switch(op) +	{ +		case TBO_REPLACE: +			// Slightly special syntax (no second sources), just set all and return. +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_REPLACE); +			glTexEnvi(GL_TEXTURE_ENV, src0_enum, source1); +			glTexEnvi(GL_TEXTURE_ENV, operand0_enum, operand1); +			(isAlpha) ? setAlphaScale(1) : setColorScale(1); +			return; + +		case TBO_MULT: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_MODULATE); +			break; + +		case TBO_MULT_X2: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_MODULATE); +			scale_amount = 2; +			break; + +		case TBO_MULT_X4: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_MODULATE); +			scale_amount = 4; +			break; + +		case TBO_ADD: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_ADD); +			break; + +		case TBO_ADD_SIGNED: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_ADD_SIGNED_ARB); +			break; + +		case TBO_SUBTRACT: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_SUBTRACT_ARB); +			break; + +		case TBO_LERP_VERT_ALPHA: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_INTERPOLATE); +			glTexEnvi(GL_TEXTURE_ENV, src2_enum, GL_PRIMARY_COLOR_ARB); +			glTexEnvi(GL_TEXTURE_ENV, operand2_enum, GL_SRC_ALPHA); +			break; + +		case TBO_LERP_TEX_ALPHA: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_INTERPOLATE); +			glTexEnvi(GL_TEXTURE_ENV, src2_enum, GL_TEXTURE); +			glTexEnvi(GL_TEXTURE_ENV, operand2_enum, GL_SRC_ALPHA); +			break; + +		case TBO_LERP_PREV_ALPHA: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_INTERPOLATE); +			glTexEnvi(GL_TEXTURE_ENV, src2_enum, GL_PREVIOUS_ARB); +			glTexEnvi(GL_TEXTURE_ENV, operand2_enum, GL_SRC_ALPHA); +			break; + +		case TBO_LERP_CONST_ALPHA: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_INTERPOLATE); +			glTexEnvi(GL_TEXTURE_ENV, src2_enum, GL_CONSTANT_ARB); +			glTexEnvi(GL_TEXTURE_ENV, operand2_enum, GL_SRC_ALPHA); +			break; + +		case TBO_LERP_VERT_COLOR: +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_INTERPOLATE); +			glTexEnvi(GL_TEXTURE_ENV, src2_enum, GL_PRIMARY_COLOR_ARB); +			glTexEnvi(GL_TEXTURE_ENV, operand2_enum, (isAlpha) ? GL_SRC_ALPHA : GL_SRC_COLOR); +			break; + +		default: +			llwarns << "Unknown eTextureBlendOp: " << op << ".  Setting op to replace." << llendl; +			// Slightly special syntax (no second sources), just set all and return. +			glTexEnvi(GL_TEXTURE_ENV, comb_enum, GL_REPLACE); +			glTexEnvi(GL_TEXTURE_ENV, src0_enum, source1); +			glTexEnvi(GL_TEXTURE_ENV, operand0_enum, operand1); +			(isAlpha) ? setAlphaScale(1) : setColorScale(1); +			return; +	} + +	// Set sources, operands, and scale accordingly +	glTexEnvi(GL_TEXTURE_ENV, src0_enum, source1); +	glTexEnvi(GL_TEXTURE_ENV, operand0_enum, operand1); +	glTexEnvi(GL_TEXTURE_ENV, src1_enum, source2); +	glTexEnvi(GL_TEXTURE_ENV, operand1_enum, operand2); +	(isAlpha) ? setAlphaScale(scale_amount) : setColorScale(scale_amount); +} + +void LLTexUnit::setColorScale(S32 scale) +{ +	if (mCurrColorScale != scale) +	{ +		mCurrColorScale = scale; +		glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale ); +	} +} + +void LLTexUnit::setAlphaScale(S32 scale) +{ +	if (mCurrAlphaScale != scale) +	{ +		mCurrAlphaScale = scale; +		glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale ); +	} +} + +LLRender::LLRender() +{ +	mCount = 0; +	mMode = LLVertexBuffer::TRIANGLES; +	mBuffer = new LLVertexBuffer(immediate_mask, 0); +	mBuffer->allocateBuffer(4096, 0, TRUE); +	mBuffer->getVertexStrider(mVerticesp); +	mBuffer->getTexCoordStrider(mTexcoordsp); +	mBuffer->getColorStrider(mColorsp); + +	for (unsigned int i = 0; i < LL_NUM_TEXTURE_LAYERS; i++) +	{ +		mTexUnits.push_back(new LLTexUnit(i)); +	} +} + +LLRender::~LLRender() +{ +	for (U32 i = 0; i < mTexUnits.size(); i++) +	{ +		delete mTexUnits[i]; +	} +} + +void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z) +{ +	flush(); +	glTranslatef(x,y,z); +} + +void LLRender::pushMatrix() +{ +	flush(); +	glPushMatrix(); +} + +void LLRender::popMatrix() +{ +	flush(); +	glPopMatrix(); +} + +void LLRender::setColorMask(bool writeColor, bool writeAlpha) +{ +	setColorMask(writeColor, writeColor, writeColor, writeAlpha); +} + +void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha) +{ +	flush(); +	glColorMask(writeColorR, writeColorG, writeColorB, writeAlpha); +} + +void LLRender::setSceneBlendType(eBlendType type) +{ +	flush(); +	switch (type)  +	{ +		case BT_ALPHA: +			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +			break; +		case BT_ADD: +			glBlendFunc(GL_ONE, GL_ONE); +			break; +		case BT_ADD_WITH_ALPHA: +			glBlendFunc(GL_SRC_ALPHA, GL_ONE); +			break; +		case BT_MULT: +			glBlendFunc(GL_DST_COLOR, GL_ZERO); +			break; +		case BT_MULT_X2: +			glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); +			break; +		case BT_REPLACE: +			glBlendFunc(GL_ONE, GL_ZERO); +			break; +		default: +			llerrs << "Unknown Scene Blend Type: " << type << llendl; +			break; +	} +} + +void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value) +{ +	flush(); +	if (func == CF_DEFAULT) +	{ +		glAlphaFunc(GL_GREATER, 0.01f); +	}  +	else +	{ +		glAlphaFunc(sGLCompareFunc[func], value); +	} +} + +void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor) +{ +	flush(); +	glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]); +} + +LLTexUnit* LLRender::getTexUnit(U32 index) +{ +	if (index < mTexUnits.size()) +	{ +		return mTexUnits[index]; +	} +	llerrs << "Non-existing texture unit layer requested: " << index << llendl; +	return NULL; +} + +void LLRender::begin(const GLuint& mode) +{ +	if (mode != mMode) +	{ +		if (mMode == LLVertexBuffer::QUADS || +			mMode == LLVertexBuffer::LINES || +			mMode == LLVertexBuffer::TRIANGLES || +			mMode == LLVertexBuffer::POINTS) +		{ +			flush(); +		} +		else if (mCount != 0) +		{ +			llerrs << "gGL.begin() called redundantly." << llendl; +		} +		 +		mMode = mode; +	} +} + +void LLRender::end() +{  +	if (mCount == 0) +	{ +		return; +		//IMM_ERRS << "GL begin and end called with no vertices specified." << llendl; +	} + +	if ((mMode != LLVertexBuffer::QUADS &&  +		mMode != LLVertexBuffer::LINES && +		mMode != LLVertexBuffer::TRIANGLES && +		mMode != LLVertexBuffer::POINTS) || +		mCount > 2048) +	{ +		flush(); +	} +} +void LLRender::flush() +{ +	if (mCount > 0) +	{ +#if 0 +		if (!glIsEnabled(GL_VERTEX_ARRAY)) +		{ +			llerrs << "foo 1" << llendl; +		} + +		if (!glIsEnabled(GL_COLOR_ARRAY)) +		{ +			llerrs << "foo 2" << llendl; +		} + +		if (!glIsEnabled(GL_TEXTURE_COORD_ARRAY)) +		{ +			llerrs << "foo 3" << llendl; +		} + +		if (glIsEnabled(GL_NORMAL_ARRAY)) +		{ +			llerrs << "foo 7" << llendl; +		} + +		GLvoid* pointer; + +		glGetPointerv(GL_VERTEX_ARRAY_POINTER, &pointer); +		if (pointer != &(mBuffer[0].v)) +		{ +			llerrs << "foo 4" << llendl; +		} + +		glGetPointerv(GL_COLOR_ARRAY_POINTER, &pointer); +		if (pointer != &(mBuffer[0].c)) +		{ +			llerrs << "foo 5" << llendl; +		} + +		glGetPointerv(GL_TEXTURE_COORD_ARRAY_POINTER, &pointer); +		if (pointer != &(mBuffer[0].uv)) +		{ +			llerrs << "foo 6" << llendl; +		} +#endif +				 +		mBuffer->setBuffer(immediate_mask); +		mBuffer->drawArrays(mMode, 0, mCount); + +		mVerticesp[0] = mVerticesp[mCount]; +		mTexcoordsp[0] = mTexcoordsp[mCount]; +		mColorsp[0] = mColorsp[mCount]; +		mCount = 0; +	} +} +void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z) +{  +	if (mCount >= 4096) +	{ +	//	llwarns << "GL immediate mode overflow.  Some geometry not drawn." << llendl; +		return; +	} + +	mVerticesp[mCount] = LLVector3(x,y,z); +	mCount++; +	if (mCount < 4096) +	{ +		mVerticesp[mCount] = mVerticesp[mCount-1]; +		mColorsp[mCount] = mColorsp[mCount-1]; +		mTexcoordsp[mCount] = mTexcoordsp[mCount-1]; +	} +} +void LLRender::vertex2i(const GLint& x, const GLint& y) +{ +	vertex3f((GLfloat) x, (GLfloat) y, 0);	 +} + +void LLRender::vertex2f(const GLfloat& x, const GLfloat& y) +{  +	vertex3f(x,y,0); +} + +void LLRender::vertex2fv(const GLfloat* v) +{  +	vertex3f(v[0], v[1], 0); +} + +void LLRender::vertex3fv(const GLfloat* v) +{ +	vertex3f(v[0], v[1], v[2]); +} + +void LLRender::texCoord2f(const GLfloat& x, const GLfloat& y) +{  +	mTexcoordsp[mCount] = LLVector2(x,y); +} + +void LLRender::texCoord2i(const GLint& x, const GLint& y) +{  +	texCoord2f((GLfloat) x, (GLfloat) y); +} + +void LLRender::texCoord2fv(const GLfloat* tc) +{  +	texCoord2f(tc[0], tc[1]); +} + +void LLRender::color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a) +{ +	mColorsp[mCount] = LLColor4U(r,g,b,a); +} +void LLRender::color4ubv(const GLubyte* c) +{ +	color4ub(c[0], c[1], c[2], c[3]); +} + +void LLRender::color4f(const GLfloat& r, const GLfloat& g, const GLfloat& b, const GLfloat& a) +{ +	color4ub((GLubyte) (llclamp(r, 0.f, 1.f)*255), +		(GLubyte) (llclamp(g, 0.f, 1.f)*255), +		(GLubyte) (llclamp(b, 0.f, 1.f)*255), +		(GLubyte) (llclamp(a, 0.f, 1.f)*255)); +} + +void LLRender::color4fv(const GLfloat* c) +{  +	color4f(c[0],c[1],c[2],c[3]); +} + +void LLRender::color3f(const GLfloat& r, const GLfloat& g, const GLfloat& b) +{  +	color4f(r,g,b,1); +} + +void LLRender::color3fv(const GLfloat* c) +{  +	color4f(c[0],c[1],c[2],1); +} + diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h new file mode 100644 index 0000000000..2fa3237ef9 --- /dev/null +++ b/indra/llrender/llrender.h @@ -0,0 +1,239 @@ +/**  + * @file llrender.h + * @brief LLRender definition + * + *	This class acts as a wrapper for OpenGL calls. + *	The goal of this class is to minimize the number of api calls due to legacy rendering + *	code, to define an interface for a multiple rendering API abstraction of the UI + *	rendering, and to abstract out direct rendering calls in a way that is cleaner and easier to maintain. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLGLRENDER_H +#define LL_LLGLRENDER_H + +#include "stdtypes.h" +#include "llgltypes.h" +#include "llglheaders.h" +#include "llvertexbuffer.h" + +class LLTexUnit +{ +public: +	typedef enum  +	{ +		TB_REPLACE = 0, +		TB_ADD, +		TB_MULT, +		TB_MULT_X2, +		TB_ALPHA_BLEND, +		TB_COMBINE			// Doesn't need to be set directly, setTexture___Blend() set TB_COMBINE automatically +	} eTextureBlendType; + +	typedef enum  +	{ +		TBO_REPLACE = 0,			// Use Source 1 +		TBO_MULT,					// Multiply: ( Source1 * Source2 ) +		TBO_MULT_X2,				// Multiply then scale by 2:  ( 2.0 * ( Source1 * Source2 ) ) +		TBO_MULT_X4,				// Multiply then scale by 4:  ( 4.0 * ( Source1 * Source2 ) ) +		TBO_ADD,					// Add: ( Source1 + Source2 ) +		TBO_ADD_SIGNED,				// Add then subtract 0.5: ( ( Source1 + Source2 ) - 0.5 ) +		TBO_SUBTRACT,				// Subtract Source2 from Source1: ( Source1 - Source2 ) +		TBO_LERP_VERT_ALPHA,		// Interpolate based on Vertex Alpha (VA): ( Source1 * VA + Source2 * (1-VA) ) +		TBO_LERP_TEX_ALPHA,			// Interpolate based on Texture Alpha (TA): ( Source1 * TA + Source2 * (1-TA) ) +		TBO_LERP_PREV_ALPHA,		// Interpolate based on Previous Alpha (PA): ( Source1 * PA + Source2 * (1-PA) ) +		TBO_LERP_CONST_ALPHA,		// Interpolate based on Const Alpha (CA): ( Source1 * CA + Source2 * (1-CA) ) +		TBO_LERP_VERT_COLOR			// Interpolate based on Vertex Col (VC): ( Source1 * VC + Source2 * (1-VC) ) +										// *Note* TBO_LERP_VERTEX_COLOR only works with setTextureColorBlend(), +										// and falls back to TBO_LERP_VERTEX_ALPHA for setTextureAlphaBlend(). +	} eTextureBlendOp; + +	typedef enum  +	{ +		TBS_PREV_COLOR = 0,			// Color from the previous texture stage +		TBS_PREV_ALPHA, +		TBS_ONE_MINUS_PREV_COLOR, +		TBS_ONE_MINUS_PREV_ALPHA, +		TBS_TEX_COLOR,				// Color from the texture bound to this stage +		TBS_TEX_ALPHA, +		TBS_ONE_MINUS_TEX_COLOR, +		TBS_ONE_MINUS_TEX_ALPHA, +		TBS_VERT_COLOR,				// The vertex color currently set +		TBS_VERT_ALPHA, +		TBS_ONE_MINUS_VERT_COLOR, +		TBS_ONE_MINUS_VERT_ALPHA, +		TBS_CONST_COLOR,			// The constant color value currently set +		TBS_CONST_ALPHA, +		TBS_ONE_MINUS_CONST_COLOR, +		TBS_ONE_MINUS_CONST_ALPHA +	} eTextureBlendSrc; + +	LLTexUnit(U32 index); +	U32 getIndex(void); + +	void enable(void); +	void disable(void); +	void activate(void); + +	void bindTexture(const LLImageGL* texture); +	void unbindTexture(void); + +	void setTextureBlendType(eTextureBlendType type); + +	inline void setTextureColorBlend(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2 = TBS_PREV_COLOR) +	{ setTextureCombiner(op, src1, src2, false); } + +	// NOTE: If *_COLOR enums are passed to src1 or src2, the corresponding *_ALPHA enum will be used instead. +	inline void setTextureAlphaBlend(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2 = TBS_PREV_ALPHA) +	{ setTextureCombiner(op, src1, src2, true); }	 + +private: +	U32					mIndex; +	bool				mIsEnabled; +	eTextureBlendType	mCurrBlendType; +	eTextureBlendOp		mCurrColorOp; +	eTextureBlendSrc	mCurrColorSrc1; +	eTextureBlendSrc	mCurrColorSrc2; +	eTextureBlendOp		mCurrAlphaOp; +	eTextureBlendSrc	mCurrAlphaSrc1; +	eTextureBlendSrc	mCurrAlphaSrc2; +	S32					mCurrColorScale; +	S32					mCurrAlphaScale; +	 +	void debugTextureUnit(void); +	void setColorScale(S32 scale); +	void setAlphaScale(S32 scale); +	GLint getTextureSource(eTextureBlendSrc src); +	GLint getTextureSourceType(eTextureBlendSrc src, bool isAlpha = false); +	void setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eTextureBlendSrc src2, bool isAlpha = false); +}; + +class LLRender +{ +	friend class LLTexUnit; +public: +	typedef enum  +	{ +		CF_NEVER = 0, +		CF_ALWAYS, +		CF_LESS, +		CF_LESS_EQUAL, +		CF_EQUAL, +		CF_NOT_EQUAL, +		CF_GREATER_EQUAL, +		CF_GREATER, +		CF_DEFAULT +	}  eCompareFunc; + +	typedef enum  +	{ +		BT_ALPHA = 0, +		BT_ADD, +		BT_ADD_WITH_ALPHA,	// Additive blend modulated by the fragment's alpha. +		BT_MULT, +		BT_MULT_X2, +		BT_REPLACE +	} eBlendType; + +	typedef enum  +	{ +		BF_ONE = 0, +		BF_ZERO, +		BF_DEST_COLOR, +		BF_SOURCE_COLOR, +		BF_ONE_MINUS_DEST_COLOR, +		BF_ONE_MINUS_SOURCE_COLOR, +		BF_DEST_ALPHA, +		BF_SOURCE_ALPHA, +		BF_ONE_MINUS_DEST_ALPHA, +		BF_ONE_MINUS_SOURCE_ALPHA +	} eBlendFactor; + +	LLRender(); +	~LLRender(); + +	void translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z); +	void pushMatrix(); +	void popMatrix(); + +	void flush(); + +	void begin(const GLuint& mode); +	void end(); +	void vertex2i(const GLint& x, const GLint& y); +	void vertex2f(const GLfloat& x, const GLfloat& y); +	void vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z); +	void vertex2fv(const GLfloat* v); +	void vertex3fv(const GLfloat* v); +	 +	void texCoord2i(const GLint& x, const GLint& y); +	void texCoord2f(const GLfloat& x, const GLfloat& y); +	void texCoord2fv(const GLfloat* tc); + +	void color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a); +	void color4f(const GLfloat& r, const GLfloat& g, const GLfloat& b, const GLfloat& a); +	void color4fv(const GLfloat* c); +	void color3f(const GLfloat& r, const GLfloat& g, const GLfloat& b); +	void color3fv(const GLfloat* c); +	void color4ubv(const GLubyte* c); + +	void setColorMask(bool writeColor, bool writeAlpha); +	void setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha); +	void setSceneBlendType(eBlendType type); + +	void setAlphaRejectSettings(eCompareFunc func, F32 value = 0.01f); + +	void blendFunc(eBlendFactor sfactor, eBlendFactor dfactor); + +	LLTexUnit* getTexUnit(U32 index); + +	typedef struct Vertex +	{ +		GLfloat v[3]; +		GLubyte c[4]; +		GLfloat uv[2]; +	}; + +public: + +private: +	U32 mCount; +	U32 mMode; +	U32 mCurrTextureUnitIndex; +	LLPointer<LLVertexBuffer> mBuffer; +	LLStrider<LLVector3> mVerticesp; +	LLStrider<LLVector2> mTexcoordsp; +	LLStrider<LLColor4U> mColorsp; +	std::vector<LLTexUnit*> mTexUnits; +}; + + + +extern LLRender gGL; + +#endif diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 5111c7ae2d..885ccde2d1 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -32,7 +32,7 @@  #include "linden_common.h"  #include "llrendertarget.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llgl.h" @@ -181,6 +181,7 @@ void LLRenderTarget::clear()  	{  		LLGLEnable scissor(GL_SCISSOR_TEST);  		glScissor(0, 0, mResX, mResY); +		stop_glerror();  		glClear(mask);  	}  } diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 2f053a6493..d79a0d6034 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -38,7 +38,7 @@  #include "llglheaders.h"  #include "llmemory.h"  #include "llmemtype.h" -#include "llglimmediate.h" +#include "llrender.h"  //============================================================================ @@ -768,11 +768,26 @@ U8* LLVertexBuffer::mapBuffer(S32 access)  		sMapped = TRUE;*/  		if (!mMappedData)  		{ +			GLint buff; +			glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff); +			if (buff != mGLBuffer) +			{ +				llerrs << "Invalid GL vertex buffer bound: " << buff << llendl; +			} + +			  			llerrs << "glMapBuffer returned NULL (no vertex data)" << llendl;  		}  		if (!mMappedIndexData)  		{ +			GLint buff; +			glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff); +			if (buff != mGLIndices) +			{ +				llerrs << "Invalid GL index buffer bound: " << buff << llendl; +			} +  			llerrs << "glMapBuffer returned NULL (no index data)" << llendl;  		} @@ -952,6 +967,22 @@ void LLVertexBuffer::setBuffer(U32 data_mask)  			sIBOActive = TRUE;  		} +		if (gDebugGL) +		{ +			GLint buff; +			glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff); +			if (buff != mGLBuffer) +			{ +				llerrs << "Invalid GL vertex buffer bound: " << buff << llendl; +			} + +			glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff); +			if (buff != mGLIndices) +			{ +				llerrs << "Invalid GL index buffer bound: " << buff << llendl; +			} +		} +  		if (mResized)  		{  			if (gDebugGL) diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 4fa2a3de92..b8cf8f7984 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -45,7 +45,7 @@  #include "llcriticaldamp.h"  #include "llfocusmgr.h"  #include "llwindow.h" -#include "llglimmediate.h" +#include "llrender.h"  static LLRegisterWidget<LLButton> r("button"); @@ -571,9 +571,9 @@ void LLButton::draw()  			mImagep->draw(getLocalRect(), getEnabled() ? mImageColor : mDisabledImageColor  );  			if (mCurGlowStrength > 0.01f)  			{ -				glBlendFunc(GL_SRC_ALPHA, GL_ONE); +				gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);  				mImagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), LLColor4(1.f, 1.f, 1.f, mCurGlowStrength)); -				glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +				gGL.setSceneBlendType(LLRender::BT_ALPHA);  			}  		}  		else @@ -581,9 +581,9 @@ void LLButton::draw()  			mImagep->draw(0, 0, getEnabled() ? mImageColor : mDisabledImageColor );  			if (mCurGlowStrength > 0.01f)  			{ -				glBlendFunc(GL_SRC_ALPHA, GL_ONE); +				gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);  				mImagep->drawSolid(0, 0, LLColor4(1.f, 1.f, 1.f, mCurGlowStrength)); -				glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +				gGL.setSceneBlendType(LLRender::BT_ALPHA);  			}  		}  	} diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 538641d060..98a79fa650 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -783,8 +783,18 @@ BOOL LLComboBox::handleKeyHere(KEY key, MASK mask)  			mList->highlightNthItem(mList->getItemIndex(last_selected_item));  		}  		result = mList->handleKeyHere(key, mask); + +		// will only see return key if it is originating from line editor +		// since the dropdown button eats the key +		if (key == KEY_RETURN) +		{ +			// don't show list and don't eat key input when committing +			// free-form text entry with RETURN since user already knows +            // what they are trying to select +			return FALSE; +		}  		// if selection has changed, pop open list -		if (mList->getLastSelectedItem() != last_selected_item) +		else if (mList->getLastSelectedItem() != last_selected_item)  		{  			showList();  		} diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index c2b2e08755..62b86a6ad7 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -46,7 +46,7 @@  #include "llmenugl.h"  #include "llmath.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llfocusmgr.h"  #include "llfont.h"  #include "llcoord.h" diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index 3536e6bb03..5bc2c5cf85 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -44,7 +44,7 @@  #include "llfocusmgr.h"  #include "llwindow.h"  #include "llcontrol.h" -#include "llglimmediate.h" +#include "llrender.h"  LLScrollbar::LLScrollbar(  		const LLString& name, LLRect rect, @@ -518,9 +518,9 @@ void LLScrollbar::draw()  		rounded_rect_imagep->draw(mThumbRect, mThumbColor);  		if (mCurGlowStrength > 0.01f)  		{ -			glBlendFunc(GL_SRC_ALPHA, GL_ONE); +			gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);  			rounded_rect_imagep->drawSolid(mThumbRect, LLColor4(1.f, 1.f, 1.f, mCurGlowStrength)); -			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +			gGL.setSceneBlendType(LLRender::BT_ALPHA);  		}  	} diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index 72fe2040af..3cb4ecc172 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -32,7 +32,7 @@  #include "linden_common.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llscrollcontainer.h"  #include "llscrollbar.h"  #include "llui.h" diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index c923f6b116..b4a2ed874a 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -42,7 +42,7 @@  #include "llcheckboxctrl.h"  #include "llclipboard.h"  #include "llfocusmgr.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llresmgr.h"  #include "llscrollbar.h"  #include "llstring.h" @@ -1110,6 +1110,8 @@ BOOL LLScrollListCtrl::selectItemRange( S32 first_index, S32 last_index )  	for (item_list::iterator iter = mItemList.begin(); iter != mItemList.end(); iter++)  	{  		LLScrollListItem *itemp = *iter; +	 +		llassert_always(itemp) ;  		if( index >= first_index && index <= last_index )  		{  			if( itemp->getEnabled() ) diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index 336fdfe2c3..38608745c1 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -102,7 +102,7 @@ LLStyle &LLStyle::operator=(const LLStyle &rhs)  		mItalic = rhs.mItalic;  		mBold = rhs.mBold;  		mUnderline = rhs.mUnderline; -		mDropShadow = rhs.mUnderline; +		mDropShadow = rhs.mDropShadow;  		mIsEmbeddedItem = rhs.mIsEmbeddedItem;  	} diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index fabdbd6860..ccf6e90161 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -40,7 +40,7 @@  #include "llcriticaldamp.h"  #include "lluictrlfactory.h"  #include "lltabcontainervertical.h" -#include "llglimmediate.h" +#include "llrender.h"  const F32 SCROLL_STEP_TIME = 0.4f;  const F32 SCROLL_DELAY_TIME = 0.5f; diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 8264f0cf87..06df996088 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -36,7 +36,7 @@  #include "lltexteditor.h"  #include "llfontgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llui.h"  #include "lluictrlfactory.h"  #include "llrect.h" diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index 1a238ce7fa..6ef485d82c 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -41,7 +41,7 @@  #include "audioengine.h"  #include "v2math.h"  #include "v4color.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llrect.h"  #include "llimagegl.h"  #include "lldir.h" @@ -487,18 +487,8 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLIma  	if (solid_color)  	{ -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -		glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -		glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_MODULATE); - -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); - -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); - -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB,		GL_PRIMARY_COLOR_ARB); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB,	GL_SRC_ALPHA); +		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +		gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);  	}  	gGL.pushMatrix(); @@ -634,7 +624,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLIma  	if (solid_color)  	{ -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	}  } diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index fa78534a83..a239968e5d 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -37,7 +37,7 @@  #include <cassert>  #include <boost/tokenizer.hpp> -#include "llglimmediate.h" +#include "llrender.h"  #include "llevent.h"  #include "llfontgl.h"  #include "llfocusmgr.h" diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp index d3559baec6..2148957ce3 100644 --- a/indra/llui/llviewborder.cpp +++ b/indra/llui/llviewborder.cpp @@ -30,7 +30,7 @@  #include "linden_common.h"  #include "llviewborder.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llfocusmgr.h"  static LLRegisterWidget<LLViewBorder> r("view_border"); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 3ed566062f..e715080916 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -605,8 +605,6 @@ LLWindowWin32::LLWindowWin32(const char *title, const char *name, S32 x, S32 y,  	// Initialize (boot strap) the Language text input management,  	// based on the system's (or user's) default settings.  	allowLanguageTextInput(NULL, FALSE); - -	SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer  } @@ -1349,6 +1347,8 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  	//make sure multi sampling is disabled by default  	glDisable(GL_MULTISAMPLE_ARB); +	//register joystick timer callback +	SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer  	// ok to post quit messages now  	mPostQuit = TRUE; diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index ef6e32a7a0..cb0c4f001a 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -58,36 +58,45 @@  //this defines the current version of the settings file  const S32 CURRENT_VERSION = 101; -BOOL LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b) +bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)  { +	bool result = false;  	switch (mType)  	{  	case TYPE_U32:  	case TYPE_S32: -		return a.asInteger() == b.asInteger(); +		result = a.asInteger() == b.asInteger(); +		break;  	case TYPE_BOOLEAN: -		return a.asBoolean() == b.asBoolean(); +		result = a.asBoolean() == b.asBoolean(); +		break;  	case TYPE_F32: -		return a.asReal() == b.asReal(); +		result = a.asReal() == b.asReal(); +		break;  	case TYPE_VEC3:  	case TYPE_VEC3D: -		return LLVector3d(a) == LLVector3d(b); +		result = LLVector3d(a) == LLVector3d(b); +		break;  	case TYPE_RECT: -		return LLRect(a) == LLRect(b); +		result = LLRect(a) == LLRect(b); +		break;  	case TYPE_COL4: -		return LLColor4(a) == LLColor4(b); +		result = LLColor4(a) == LLColor4(b); +		break;  	case TYPE_COL3: -		return LLColor3(a) == LLColor3(b); +		result = LLColor3(a) == LLColor3(b); +		break;  	case TYPE_COL4U: -		return LLColor4U(a) == LLColor4U(b); +		result = LLColor4U(a) == LLColor4U(b); +		break;  	case TYPE_STRING: -		return a.asString() == b.asString(); +		result = a.asString() == b.asString(); +		break;  	default: -		// no-op  		break;  	} -	return FALSE; +	return result;  }  LLControlVariable::LLControlVariable(const LLString& name, eControlType type, @@ -114,14 +123,34 @@ LLControlVariable::~LLControlVariable()  void LLControlVariable::setValue(const LLSD& value, bool saved_value)  { -    bool value_changed = llsd_compare(getValue(), value) == FALSE; +	// *FIX:MEP - The following is needed to make the LLSD::ImplString  +	// work with boolean controls... +	LLSD storable_value; +	if(TYPE_BOOLEAN == type() && value.isString()) +	{ +		BOOL temp; +		if(LLString::convertToBOOL(value.asString(), temp))  +		{ +			storable_value = temp; +		} +		else +		{ +			storable_value = FALSE; +		} +	} +	else +	{ +		storable_value = value; +	} + +	bool value_changed = llsd_compare(getValue(), storable_value) == FALSE;  	if(saved_value)  	{      	// If we're going to save this value, return to default but don't fire  		resetToDefault(false); -	    if (llsd_compare(mValues.back(), value) == FALSE) +	    if (llsd_compare(mValues.back(), storable_value) == FALSE)  	    { -		    mValues.push_back(value); +		    mValues.push_back(storable_value);  	    }  	}      else @@ -129,7 +158,7 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)          // This is a unsaved value. Its needs to reside at          // mValues[2] (or greater). It must not affect           // the result of getSaveValue() -	    if (llsd_compare(mValues.back(), value) == FALSE) +	    if (llsd_compare(mValues.back(), storable_value) == FALSE)  	    {              while(mValues.size() > 2)              { @@ -144,13 +173,14 @@ void LLControlVariable::setValue(const LLSD& value, bool saved_value)              }              // Add the 'un-save' value. -            mValues.push_back(value); +            mValues.push_back(storable_value);  	    }      } +      if(value_changed)      { -        mSignal(value);  +        mSignal(storable_value);       }  } @@ -1147,3 +1177,4 @@ void main()  #endif + diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index 7287731cfa..fdbbe11b91 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -127,7 +127,7 @@ public:  	{  		mSignal(mValues.back());  	} -	BOOL llsd_compare(const LLSD& a, const LLSD& b); +	bool llsd_compare(const LLSD& a, const LLSD& b);  };  //const U32 STRING_CACHE_SIZE = 10000; diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings index 6012c011c1..7272173fed 100644 --- a/indra/newview/English.lproj/InfoPlist.strings +++ b/indra/newview/English.lproj/InfoPlist.strings @@ -1,5 +1,5 @@  /* Localized versions of Info.plist keys */  CFBundleName = "Second Life"; -CFBundleShortVersionString = "Second Life version 1.19.1.84396"; -CFBundleGetInfoString = "Second Life version 1.19.1.84396, Copyright 2004-2008 Linden Research, Inc."; +CFBundleShortVersionString = "Second Life version 1.20.6.86975"; +CFBundleGetInfoString = "Second Life version 1.20.6.86975, Copyright 2004-2008 Linden Research, Inc."; diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist index 62f5ea167d..fa50503545 100644 --- a/indra/newview/Info-SecondLife.plist +++ b/indra/newview/Info-SecondLife.plist @@ -32,7 +32,7 @@  		</dict>  	</array>  	<key>CFBundleVersion</key> -	<string>1.19.1.84396</string> +	<string>1.20.6.86975</string>  	<key>CSResourcesFileMapped</key>  	<true/>  </dict> diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index ec12794bc5..746e56d821 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -49,7 +49,7 @@        <key>count</key>
        <integer>1</integer>
        <key>map-to</key>
 -      <string>GridChoice</string>
 +      <string>CmdLineGridChoice</string>
      </map>
      <key>loginuri</key>
 @@ -61,7 +61,7 @@        <key>compose</key>
        <boolean>true</boolean>
        <key>map-to</key>
 -      <string>LoginURI</string>
 +      <string>CmdLineLoginURI</string>
      </map>
      <key>helperuri</key>
 @@ -71,7 +71,7 @@        <key>count</key>
        <integer>1</integer>
        <key>map-to</key>
 -      <string>HelperURI</string>
 +      <string>CmdLineHelperURI</string>
      </map>
      <key>debugviews</key>
 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 165582c0a7..987ae79d59 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1,3813 +1,4177 @@ +<?xml version="1.0" ?>  <llsd> +<map> +    <key>AFKTimeout</key>      <map> +      <key>Comment</key> +      <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>300.0</real> +    </map>      <key>AdvanceSnapshot</key> -        <map> -        <key>Comment</key> -            <string>Display advanced parameter settings in snaphot interface</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>AFKTimeout</key> -        <map> -        <key>Comment</key> -            <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>300</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Display advanced parameter settings in snaphot interface</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AgentChatColor</key> -        <map> -        <key>Comment</key> -            <string>Color of chat messages from other residents</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> -    <key>IMChatColor</key> -        <map> -        <key>Comment</key> -            <string>Color of instant messages from other residents</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of chat messages from other residents</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>AllowIdleAFK</key> -        <map> -        <key>Comment</key> -            <string>Automatically set AFK (away from keyboard) mode when idle</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Automatically set AFK (away from keyboard) mode when idle</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AllowMultipleViewers</key> -        <map> -        <key>Comment</key> -            <string>Allow multiple viewers.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Allow multiple viewers.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AllowTapTapHoldRun</key> -        <map> -        <key>Comment</key> -            <string>Tapping a direction key twice and holding it down makes avatar run</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Tapping a direction key twice and holding it down makes avatar run</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AnimateTextures</key> -        <map> -        <key>Comment</key> -            <string>Enable texture animation (debug)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable texture animation (debug)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AnimationDebug</key> -        <map> -        <key>Comment</key> -            <string>Show active animations in a bubble above avatars head</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show active animations in a bubble above avatars head</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AppearanceCameraMovement</key> -        <map> -        <key>Comment</key> -            <string>When entering appearance editing mode, camera zooms in on currently selected portion of avatar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>When entering appearance editing mode, camera zooms in on currently selected portion of avatar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ApplyColorImmediately</key> -        <map> -        <key>Comment</key> -            <string>Preview selections in color picker immediately</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Preview selections in color picker immediately</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ApplyTextureImmediately</key> -        <map> -        <key>Comment</key> -            <string>Preview selections in texture picker immediately</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Preview selections in texture picker immediately</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ArrowKeysMoveAvatar</key> -        <map> -        <key>Comment</key> -            <string>While cursor is in chat entry box, arrow keys still control your avatar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>While cursor is in chat entry box, arrow keys still control your avatar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AskedAboutCrashReports</key> -        <map> -        <key>Comment</key> -            <string>Turns off dialog asking if you want to enable crash reporting</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Turns off dialog asking if you want to enable crash reporting</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AsyncKeyboard</key> -        <map> -        <key>Comment</key> -            <string>Improves responsiveness to keyboard input when at low framerates</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Improves responsiveness to keyboard input when at low framerates</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AuctionShowFence</key> -        <map> -        <key>Comment</key> -            <string>When auctioning land, include parcel boundary marker in snapshot</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>When auctioning land, include parcel boundary marker in snapshot</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AudioLevelAmbient</key> -        <map> -        <key>Comment</key> -            <string>Audio level of environment sounds</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio level of environment sounds</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>AudioLevelDistance</key> -        <map> -        <key>Comment</key> -            <string>Scale factor for audio engine (multiple of world scale, 2.0 = audio falls off twice as fast)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Scale factor for audio engine (multiple of world scale, 2.0 = audio falls off twice as fast)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelDoppler</key> -        <map> -        <key>Comment</key> -            <string>Scale of doppler effect on moving audio sources (1.0 = normal, <1.0 = diminished doppler effect, >1.0 = enhanced doppler effect)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Scale of doppler effect on moving audio sources (1.0 = normal, <1.0 = diminished doppler effect, >1.0 = enhanced doppler effect)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelMaster</key> -        <map> -        <key>Comment</key> -            <string>Master audio level, or overall volume</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Master audio level, or overall volume</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelMedia</key> -        <map> -        <key>Comment</key> -            <string>Audio level of Quicktime movies</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio level of Quicktime movies</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelMic</key> -        <map> -        <key>Comment</key> -            <string>Audio level of microphone input</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio level of microphone input</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelMusic</key> -        <map> -        <key>Comment</key> -            <string>Audio level of streaming music</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio level of streaming music</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelRolloff</key> -        <map> -        <key>Comment</key> -            <string>Controls the distance-based dropoff of audio volume (fraction or multiple of default audio rolloff)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls the distance-based dropoff of audio volume (fraction or multiple of default audio rolloff)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelSFX</key> -        <map> -        <key>Comment</key> -            <string>Audio level of in-world sound effects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio level of in-world sound effects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AudioLevelUI</key> -        <map> -        <key>Comment</key> -            <string>Audio level of UI sound effects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio level of UI sound effects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>AudioLevelVoice</key> -        <map> -        <key>Comment</key> -            <string>Audio level of voice chat</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio level of voice chat</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>AudioStreamingMusic</key> -        <map> -        <key>Comment</key> -            <string>Enable streaming audio</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable streaming audio</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AudioStreamingVideo</key> -        <map> -        <key>Comment</key> -            <string>Enable streaming video</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable streaming video</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AutoAcceptNewInventory</key> -        <map> -        <key>Comment</key> -            <string>Automatically accept new notecards/textures/landmarks</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Automatically accept new notecards/textures/landmarks</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>AutoLeveling</key> +    <map> +      <key>Comment</key> +      <string>Keep Flycam level.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AutoLoadWebProfiles</key> -        <map> -        <key>Comment</key> -            <string>Automatically load ALL profile webpages without asking first.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Automatically load ALL profile webpages without asking first.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AutoLogin</key> -        <map> -        <key>Comment</key> -            <string>Login automatically using last username/password combination</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Login automatically using last username/password combination</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AutoMimeDiscovery</key> -        <map> -          <key>Comment</key> -              <string>Enable viewer mime type discovery of media URLs</string> -          <key>Persist</key> -              <integer>1</integer> -          <key>Type</key> -              <string>Boolean</string> -          <key>Value</key> -              <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable viewer mime type discovery of media URLs</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AutoPilotLocksCamera</key> -        <map> -        <key>Comment</key> -            <string>Keep camera position locked when avatar walks to selected position</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Keep camera position locked when avatar walks to selected position</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AutoSnapshot</key> -        <map> -        <key>Comment</key> -            <string>Update snapshot when camera stops moving, or any parameter changes</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Update snapshot when camera stops moving, or any parameter changes</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>AutomaticFly</key> -        <map> -        <key>Comment</key> -            <string>Fly by holding jump key or using "Fly" command (FALSE = fly by using "Fly" command only)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Fly by holding jump key or using "Fly" command (FALSE = fly by using "Fly" command only)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>AvatarAxisDeadZone0</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 0 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>AvatarAxisDeadZone1</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 1 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>AvatarAxisDeadZone2</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 2 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>AvatarAxisDeadZone3</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 3 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>AvatarAxisDeadZone4</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 4 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>AvatarAxisDeadZone5</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 5 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>AvatarAxisScale0</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 0 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>AvatarAxisScale1</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 1 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>AvatarAxisScale2</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 2 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>AvatarAxisScale3</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 3 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>AvatarAxisScale4</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 4 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>AvatarAxisScale5</key> +    <map> +      <key>Comment</key> +      <string>Avatar axis 5 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>AvatarBacklight</key> -        <map> -        <key>Comment</key> -            <string>Add rim lighting to avatar rendering to approximate shininess of skin</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Add rim lighting to avatar rendering to approximate shininess of skin</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>AvatarCompositeLimit</key> -        <map> -        <key>Comment</key> -            <string>Maximum number of avatars to display appearance changes on the fly</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>5</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum number of avatars to display appearance changes on the fly</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>5</integer> +    </map> +    <key>AvatarFeathering</key> +    <map> +      <key>Comment</key> +      <string>Avatar feathering (less is softer)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>16.0</real> +    </map>      <key>AvatarPickerSortOrder</key> -        <map> -        <key>Comment</key> -            <string>Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>      <key>AvatarSex</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>BackgroundChatColor</key> -        <map> -        <key>Comment</key> -            <string>Color of chat bubble background</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of chat bubble background</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>BackgroundYieldTime</key> -        <map> -        <key>Comment</key> -            <string>Amount of time to yield every frame to other applications when SL is not the foreground window (milliseconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>40</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Amount of time to yield every frame to other applications when SL is not the foreground window (milliseconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>40</integer> +    </map>      <key>BackwardBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>45</integer> -                <integer>29</integer> -                <integer>66</integer> -                <integer>4</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>45</integer> +        <integer>29</integer> +        <integer>66</integer> +        <integer>4</integer> +      </array> +    </map>      <key>BasicHelpRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for help window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>404</integer> -                <integer>467</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for help window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>404</integer> +        <integer>467</integer> +        <integer>0</integer> +      </array> +    </map>      <key>BeaconAlwaysOn</key> -        <map> -        <key>Comment</key> -            <string>Beacons / highlighting always on</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Beacons / highlighting always on</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>BrowserHomePage</key> -        <map> -        <key>Comment</key> -            <string>[NOT USED]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>http://www.secondlife.com</string> -        </map> +    <map> +      <key>Comment</key> +      <string>[NOT USED]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://www.secondlife.com</string> +    </map>      <key>BrowserProxyAddress</key> -        <map> -        <key>Comment</key> -            <string>Address for the Web Proxy]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Address for the Web Proxy]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>BrowserProxyEnabled</key> -        <map> -        <key>Comment</key> -            <string>Use Web Proxy</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use Web Proxy</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>BrowserProxyExclusions</key> -        <map> -        <key>Comment</key> -            <string>[NOT USED]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>[NOT USED]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>BrowserProxyPort</key> -        <map> -        <key>Comment</key> -            <string>Port for Web Proxy</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>3128</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Port for Web Proxy</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>3128</integer> +    </map>      <key>BrowserProxySocks45</key> -        <map> -        <key>Comment</key> -            <string>[NOT USED]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>5</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[NOT USED]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>5</integer> +    </map> +    <key>BuildAxisDeadZone0</key> +    <map> +      <key>Comment</key> +      <string>Build axis 0 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>BuildAxisDeadZone1</key> +    <map> +      <key>Comment</key> +      <string>Build axis 1 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>BuildAxisDeadZone2</key> +    <map> +      <key>Comment</key> +      <string>Build axis 2 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>BuildAxisDeadZone3</key> +    <map> +      <key>Comment</key> +      <string>Build axis 3 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>BuildAxisDeadZone4</key> +    <map> +      <key>Comment</key> +      <string>Build axis 4 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>BuildAxisDeadZone5</key> +    <map> +      <key>Comment</key> +      <string>Build axis 5 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map> +    <key>BuildAxisScale0</key> +    <map> +      <key>Comment</key> +      <string>Build axis 0 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>BuildAxisScale1</key> +    <map> +      <key>Comment</key> +      <string>Build axis 1 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>BuildAxisScale2</key> +    <map> +      <key>Comment</key> +      <string>Build axis 2 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>BuildAxisScale3</key> +    <map> +      <key>Comment</key> +      <string>Build axis 3 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>BuildAxisScale4</key> +    <map> +      <key>Comment</key> +      <string>Build axis 4 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>BuildAxisScale5</key> +    <map> +      <key>Comment</key> +      <string>Build axis 5 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>BuildBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>BuildFeathering</key> +    <map> +      <key>Comment</key> +      <string>Build feathering (less is softer)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>16.0</real> +    </map>      <key>ButtonFlashCount</key> -        <map> -        <key>Comment</key> -            <string>Number of flashes after which flashing buttons stay lit up</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>3</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Number of flashes after which flashing buttons stay lit up</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>3</integer> +    </map>      <key>ButtonFlashRate</key> -        <map> -        <key>Comment</key> -            <string>Frequency at which buttons flash (hz)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>2</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Frequency at which buttons flash (hz)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>2.0</real> +    </map>      <key>ButtonHPad</key> -        <map> -        <key>Comment</key> -            <string>Default horizontal spacing between buttons (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>10</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Default horizontal spacing between buttons (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>10</integer> +    </map>      <key>ButtonHeight</key> -        <map> -        <key>Comment</key> -            <string>Default height for normal buttons (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>20</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Default height for normal buttons (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>20</integer> +    </map>      <key>ButtonHeightSmall</key> -        <map> -        <key>Comment</key> -            <string>Default height for small buttons (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>16</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Default height for small buttons (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>16</integer> +    </map>      <key>ButtonVPad</key> -        <map> -        <key>Comment</key> -            <string>Default vertical spacing between buttons (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Default vertical spacing between buttons (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>CacheLocation</key> -        <map> -        <key>Comment</key> -            <string>Controls the location of the local disk cache</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls the location of the local disk cache</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>CacheSize</key> -        <map> -        <key>Comment</key> -            <string>Controls amount of hard drive space reserved for local file caching in MB</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>500</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls amount of hard drive space reserved for local file caching in MB</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>500</integer> +    </map>      <key>CacheValidateCounter</key> -        <map> -        <key>Comment</key> -            <string>Used to distribute cache validation</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Used to distribute cache validation</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>CameraMouseWheelZoom</key> +    <map> +      <key>Comment</key> +      <string>Camera zooms in and out with mousewheel</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>CameraOffset</key> -        <map> -        <key>Comment</key> -            <string>Render with camera offset from view frustum (rendering debug)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Render with camera offset from view frustum (rendering debug)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>CameraOffsetBuild</key> -        <map> -        <key>Comment</key> -            <string>Default camera position relative to focus point when entering build mode</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3</string> -        <key>Value</key> -            <array> -                <real>-6</real> -                <real>0</real> -                <real>6</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Default camera position relative to focus point when entering build mode</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>-6.0</real> +        <real>0.0</real> +        <real>6.0</real> +      </array> +    </map>      <key>CameraOffsetDefault</key> -        <map> -        <key>Comment</key> -            <string>Default camera offset from avatar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3</string> -        <key>Value</key> -            <array> -                <real>-3</real> -                <real>0</real> -                <real>0.75</real> -            </array> -        </map> -    <key>CameraPositionSmoothing</key> -        <map> -        <key>Comment</key> -            <string>Smooths camera position over time</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1.0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Default camera offset from avatar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>-3.0</real> +        <real>0.0</real> +        <real>0.75</real> +      </array> +    </map>      <key>CameraPosOnLogout</key> -        <map> -        <key>Comment</key> -            <string>Camera position when last logged out (global coordinates)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3D</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0</real> -                <real>0</real> -            </array> -        </map> -    <key>CameraMouseWheelZoom</key> -        <map> -        <key>Comment</key> -            <string>Camera zooms in and out with mousewheel</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Camera position when last logged out (global coordinates)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3D</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>0.0</real> +      </array> +    </map> +    <key>CameraPositionSmoothing</key> +    <map> +      <key>Comment</key> +      <string>Smooths camera position over time</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>ChatBarStealsFocus</key> -        <map> -        <key>Comment</key> -            <string>Whenever keyboard focus is removed from the UI, and the chat bar is visible, the chat bar takes focus</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whenever keyboard focus is removed from the UI, and the chat bar is visible, the chat bar takes focus</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ChatBubbleOpacity</key> -        <map> -        <key>Comment</key> -            <string>Opacity of chat bubble background (0.0 = completely transparent, 1.0 = completely opaque)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Opacity of chat bubble background (0.0 = completely transparent, 1.0 = completely opaque)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>ChatFontSize</key> -        <map> -        <key>Comment</key> -            <string>Size of chat text in chat console (0 = small, 1 = big)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of chat text in chat console (0 = small, 1 = big)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ChatFullWidth</key> -        <map> -        <key>Comment</key> -            <string>Chat console takes up full width of SL window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Chat console takes up full width of SL window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ChatHistoryTornOff</key> -        <map> -        <key>Comment</key> -            <string>Show chat history window separately from Communicate window.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show chat history window separately from Communicate window.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ChatOnlineNotification</key> -        <map> -        <key>Comment</key> -            <string>Provide notifications for when friend log on and off of SL</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Provide notifications for when friend log on and off of SL</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ChatPersistTime</key> -        <map> -        <key>Comment</key> -            <string>Time for which chat stays visible in console (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>15</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Time for which chat stays visible in console (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>15.0</real> +    </map>      <key>ChatShowTimestamps</key> -        <map> -        <key>Comment</key> -            <string>Show timestamps in chat</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show timestamps in chat</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ChatVisible</key> -        <map> -        <key>Comment</key> -            <string>Chat bar is visible</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Chat bar is visible</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ChatterboxRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for chatterbox window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>350</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for chatterbox window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>350</integer> +        <integer>0</integer> +      </array> +    </map>      <key>CheesyBeacon</key> -        <map> -        <key>Comment</key> -            <string>Enable cheesy beacon effects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable cheesy beacon effects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ClientSettingsFile</key> -        <map> -        <key>Comment</key> -            <string>Persisted client settings file name (per install).</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Persisted client settings file name (per install).</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>CloseChatOnReturn</key> -        <map> -        <key>Comment</key> -            <string>Close chat after hitting return</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Close chat after hitting return</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>CloseSnapshotOnKeep</key> -        <map> -        <key>Comment</key> -            <string>Close snapshot window after saving snapshot</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Close snapshot window after saving snapshot</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ClothingBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>CmdLineDisableVoice</key> -        <map> -        <key>Comment</key> -            <string>Disable Voice.</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disable Voice.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>CmdLineGridChoice</key> +    <map> +      <key>Comment</key> +      <string>The user's grid choice or ip address.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map> +    <key>CmdLineHelperURI</key> +    <map> +      <key>Comment</key> +      <string>Command line specified helper web CGI prefix to use.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map> +    <key>CmdLineLoginURI</key> +    <map> +      <key>Comment</key> +      <string>Command line specified login server and CGI prefix to use.</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>LLSD</string> +      <key>Value</key> +      <array> +        <string /> +      </array> +    </map>      <key>ColorPaletteEntry01</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry02</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0.5</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.5</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry03</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry04</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0.5</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.5</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry05</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0.5</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.5</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry06</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0.5</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.5</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry07</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry08</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.0</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry09</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0.5</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.5</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry10</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0.25</real> -                <real>0.25</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.25</real> +        <real>0.25</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry11</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0.5</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.5</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry12</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0.25</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.25</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry13</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry14</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0.25</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.25</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry15</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry16</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry17</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry18</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.75</real> -                <real>0.75</real> -                <real>0.75</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.75</real> +        <real>0.75</real> +        <real>0.75</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry19</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>0</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry20</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry21</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>1</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>1.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry22</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry23</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry24</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>0</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry25</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry26</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>1</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>1.0</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry27</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry28</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.5</real> -                <real>0.5</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.5</real> +        <real>0.5</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry29</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>0</real> -                <real>0.5</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.0</real> +        <real>0.5</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry30</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>0.5</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.5</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry31</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColorPaletteEntry32</key> -        <map> -        <key>Comment</key> -            <string>Color picker palette entry</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color picker palette entry</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>ColumnHeaderDropDownDelay</key> -        <map> -        <key>Comment</key> -            <string>Time in seconds of mouse click before column header shows sort options list</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.300000011920928955078125</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Time in seconds of mouse click before column header shows sort options list</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.300000011921</real> +    </map>      <key>CompileOutputRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for script Recompile Everything output window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for script Recompile Everything output window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>CompressSnapshotsToDisk</key> -        <map> -        <key>Comment</key> -            <string>Compress snapshots saved to disk (Using JPEG 2000)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Compress snapshots saved to disk (Using JPEG 2000)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ConnectAsGod</key> -        <map> -        <key>Comment</key> -            <string>Log in a god if you have god access.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Log in a god if you have god access.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ConnectionPort</key> -        <map> -        <key>Comment</key> -            <string>Custom connection port number</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>13000</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Custom connection port number</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>13000</integer> +    </map>      <key>ConnectionPortEnabled</key> -        <map> -        <key>Comment</key> -            <string>Use the custom connection port?</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use the custom connection port?</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ConsoleBackgroundOpacity</key> -        <map> -        <key>Comment</key> -            <string>Opacity of chat console (0.0 = completely transparent, 1.0 = completely opaque)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.4000000059604644775390625</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Opacity of chat console (0.0 = completely transparent, 1.0 = completely opaque)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.40000000596</real> +    </map>      <key>ConsoleBufferSize</key> -        <map> -        <key>Comment</key> -            <string>Size of chat console history (lines of chat)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>40</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of chat console history (lines of chat)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>40</integer> +    </map>      <key>ConsoleMaxLines</key> -        <map> -        <key>Comment</key> -            <string>Max number of lines of chat text visible in console.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>40</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Max number of lines of chat text visible in console.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>40</integer> +    </map>      <key>ContactsTornOff</key> -        <map> -        <key>Comment</key> -            <string>Show contacts window separately from Communicate window.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show contacts window separately from Communicate window.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>CookiesEnabled</key> -        <map> -        <key>Comment</key> -            <string>Accept cookies from Web sites?</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -    <key>CrashLogBehavior</key> -        <map> -        <key>Comment</key> -            <string>Controls behavior when viewer (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Accept cookies from Web sites?</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>CreateToolCopyCenters</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>CreateToolCopyRotates</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>CreateToolCopySelection</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>CreateToolKeepSelected</key> -        <map> -        <key>Comment</key> -            <string>After using create tool, keep the create tool active</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>After using create tool, keep the create tool active</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>Cursor3D</key> +    <map> +      <key>Comment</key> +      <string>Tread Joystick values as absolute positions (not deltas).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>CustomServer</key> -        <map> -        <key>Comment</key> -            <string>Specifies IP address or hostname of grid to which you connect</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Specifies IP address or hostname of grid to which you connect</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>DebugBeaconLineWidth</key> -        <map> -        <key>Comment</key> -            <string>Size of lines for Debug Beacons</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of lines for Debug Beacons</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DebugInventoryFilters</key> -        <map> -        <key>Comment</key> -            <string>Turn on debugging display for inventory filtering</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Turn on debugging display for inventory filtering</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugPermissions</key> -        <map> -        <key>Comment</key> -            <string>Log permissions for selected inventory items</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Log permissions for selected inventory items</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugShowColor</key> -        <map> -        <key>Comment</key> -            <string>Show color under cursor</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show color under cursor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugShowRenderInfo</key> -        <map> -        <key>Comment</key> -            <string>Show depth buffer contents</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show depth buffer contents</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugShowTime</key> -        <map> -        <key>Comment</key> -            <string>Show depth buffer contents</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show depth buffer contents</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugViews</key> -        <map> -        <key>Comment</key> -            <string>Display debugging info for views.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display debugging info for views.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugWindowProc</key> -        <map> -        <key>Comment</key> -            <string>Log windows messages</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Log windows messages</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DefaultObjectTexture</key> -        <map> -        <key>Comment</key> -            <string>Texture used as 'Default' in texture picker. (UUID texture reference)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>89556747-24cb-43ed-920b-47caed15465f</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture used as 'Default' in texture picker. (UUID texture reference)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>89556747-24cb-43ed-920b-47caed15465f</string> +    </map>      <key>DisableCameraConstraints</key> -        <map> -        <key>Comment</key> -            <string>Disable the normal bounds put on the camera by avatar position</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disable the normal bounds put on the camera by avatar position</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DisableRendering</key> -        <map> -        <key>Comment</key> -            <string>Disable GL rendering and GUI (load testing)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disable GL rendering and GUI (load testing)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DisableVerticalSync</key> -        <map> -        <key>Comment</key> -            <string>Update frames as fast as possible (FALSE = update frames between display scans)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Update frames as fast as possible (FALSE = update frames between display scans)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayAvatarAgentTarget</key> -        <map> -        <key>Comment</key> -            <string>Show avatar positioning locators (animation debug)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show avatar positioning locators (animation debug)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DisplayChat</key> -        <map> -        <key>Comment</key> -            <string>Display Latest Chat message on LCD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display Latest Chat message on LCD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayDebug</key> -        <map> -        <key>Comment</key> -            <string>Display Network Information on LCD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display Network Information on LCD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayDebugConsole</key> -        <map> -        <key>Comment</key> -            <string>Display Console Debug Information on LCD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display Console Debug Information on LCD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayIM</key> -        <map> -        <key>Comment</key> -            <string>Display Latest IM message on LCD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display Latest IM message on LCD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayLinden</key> -        <map> -        <key>Comment</key> -            <string>Display Account Information on LCD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display Account Information on LCD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayRegion</key> -        <map> -        <key>Comment</key> -            <string>Display Location information on LCD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display Location information on LCD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>DisplayTimecode</key> -        <map> -        <key>Comment</key> -            <string>Display timecode on screen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display timecode on screen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>Disregard128DefaultDrawDistance</key> -        <map> -        <key>Comment</key> -            <string>Whether to use the auto default to 128 draw distance</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether to use the auto default to 128 draw distance</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>Disregard96DefaultDrawDistance</key> -        <map> -        <key>Comment</key> -            <string>Whether to use the auto default to 96 draw distance</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether to use the auto default to 96 draw distance</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>DoubleClickAutoPilot</key> -        <map> -        <key>Comment</key> -            <string>Enable double-click auto pilot</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable double-click auto pilot</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DragAndDropToolTipDelay</key> -        <map> -        <key>Comment</key> -            <string>Seconds before displaying tooltip when performing drag and drop operation</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1000000014901161193847656</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Seconds before displaying tooltip when performing drag and drop operation</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.10000000149</real> +    </map>      <key>DropShadowButton</key> -        <map> -        <key>Comment</key> -            <string>Drop shadow width for buttons (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Drop shadow width for buttons (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>      <key>DropShadowFloater</key> -        <map> -        <key>Comment</key> -            <string>Drop shadow width for floaters (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>5</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Drop shadow width for floaters (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>5</integer> +    </map>      <key>DropShadowSlider</key> -        <map> -        <key>Comment</key> -            <string>Drop shadow width for sliders (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>3</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Drop shadow width for sliders (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>3</integer> +    </map>      <key>DropShadowTooltip</key> -        <map> -        <key>Comment</key> -            <string>Drop shadow width for tooltips (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>4</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Drop shadow width for tooltips (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>4</integer> +    </map>      <key>DynamicCameraStrength</key> -        <map> -        <key>Comment</key> -            <string>Amount camera lags behind avatar motion (0 = none, 30 = avatar velocity)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>2</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Amount camera lags behind avatar motion (0 = none, 30 = avatar velocity)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>2.0</real> +    </map>      <key>EditCameraMovement</key> -        <map> -        <key>Comment</key> -            <string>When entering build mode, camera moves up above avatar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>When entering build mode, camera moves up above avatar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>EditLinkedParts</key> -        <map> -        <key>Comment</key> -            <string>Select individual parts of linked objects</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Select individual parts of linked objects</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>EffectColor</key> -        <map> -        <key>Comment</key> -            <string>Particle effects color</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Particle effects color</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>EnablePushToTalk</key> -        <map> -        <key>Comment</key> -            <string>Must hold down a key or moouse button when talking into your microphone</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Must hold down a key or moouse button when talking into your microphone</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>EnableRippleWater</key> +    <map> +      <key>Comment</key> +      <string>Whether to use ripple water shader or not</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>EnableVoiceChat</key> -        <map> -        <key>Comment</key> -            <string>Enable talking to other residents with a microphone</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable talking to other residents with a microphone</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>EnergyFromTop</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>20</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>20</integer> +    </map>      <key>EnergyHeight</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>40</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>40</integer> +    </map>      <key>EnergyWidth</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>175</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>175</integer> +    </map> +    <key>FPSLogFrequency</key> +    <map> +      <key>Comment</key> +      <string>Seconds between display of FPS in log (0 for never)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>60.0</real> +    </map>      <key>FilterItemsPerFrame</key> -        <map> -        <key>Comment</key> -            <string>Maximum number of inventory items to match against search filter every frame (lower to increase framerate while searching, higher to improve search speed)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>500</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum number of inventory items to match against search filter every frame (lower to increase framerate while searching, higher to improve search speed)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>500</integer> +    </map>      <key>FindLandArea</key> -        <map> -        <key>Comment</key> -            <string>Enables filtering of land search results by area</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables filtering of land search results by area</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FindLandPrice</key> -        <map> -        <key>Comment</key> -            <string>Enables filtering of land search results by price</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables filtering of land search results by price</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>FindLandType</key> -        <map> -        <key>Comment</key> -            <string>Controls which type of land you are searching for in Find Land interface ("All", "Auction", "For Sale")</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>All</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls which type of land you are searching for in Find Land interface ("All", "Auction", "For Sale")</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>All</string> +    </map>      <key>FindPeopleOnline</key> -        <map> -        <key>Comment</key> -            <string>Limits people search to only users who are logged on</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Limits people search to only users who are logged on</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>FindPlacesPictures</key> -        <map> -        <key>Comment</key> -            <string>Display only results of find places that have pictures</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display only results of find places that have pictures</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>FirstLoginThisInstall</key> -        <map> -        <key>Comment</key> -            <string>Specifies that you have not successfully logged in since you installed the latest update</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Specifies that you have not successfully logged in since you installed the latest update</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>FirstName</key> -        <map> -        <key>Comment</key> -            <string>Login first name</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Login first name</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>FirstPersonAvatarVisible</key> -        <map> -        <key>Comment</key> -            <string>Display avatar and attachments below neck while in mouselook</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display avatar and attachments below neck while in mouselook</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FirstPersonBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FirstRunThisInstall</key> -        <map> -        <key>Comment</key> -            <string>Specifies that you have not run the viewer since you installed the latest update</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Specifies that you have not run the viewer since you installed the latest update</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>FixedWeather</key> -        <map> -        <key>Comment</key> -            <string>Weather effects do not change over time</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Weather effects do not change over time</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FloaterAboutRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for About window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>440</integer> -                <integer>470</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for About window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>440</integer> +        <integer>470</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterActiveSpeakersRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for active speakers window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>300</integer> -                <integer>250</integer> -                <integer>0</integer> -            </array> -        </map> -    <key>FloaterActiveSpeakersSortColumn</key> -        <map> -        <key>Comment</key> -            <string>Column name to sort on</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>speaker_name</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for active speakers window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>300</integer> +        <integer>250</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterActiveSpeakersSortAscending</key> -        <map> -        <key>Comment</key> -            <string>Whether to sort up or down</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether to sort up or down</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>FloaterActiveSpeakersSortColumn</key> +    <map> +      <key>Comment</key> +      <string>Column name to sort on</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>speaker_name</string> +    </map> +    <key>FloaterAdvancedSkyRect</key> +    <map> +      <key>Comment</key> +      <string>Rectangle for Advanced Sky Editor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>50</integer> +        <integer>220</integer> +        <integer>450</integer> +        <integer>0</integer> +      </array> +    </map> +    <key>FloaterAdvancedWaterRect</key> +    <map> +      <key>Comment</key> +      <string>Rectangle for Advanced Water Editor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>50</integer> +        <integer>220</integer> +        <integer>450</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterAudioVolumeRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Audio Volume window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>440</integer> -                <integer>470</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Audio Volume window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>440</integer> +        <integer>470</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterBuildOptionsRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for build options window.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>0</integer> -                <integer>0</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for build options window.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>0</integer> +        <integer>0</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterBumpRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Bumps/Hits window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>180</integer> -                <integer>400</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Bumps/Hits window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>180</integer> +        <integer>400</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterBuyContentsRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Buy Contents window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>250</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Buy Contents window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>250</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterBuyRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for buy window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>250</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for buy window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>250</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterCameraRect3</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for camera control window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>64</integer> -                <integer>176</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for camera control window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>64</integer> +        <integer>176</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterChatRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for chat history</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>172</integer> -                <integer>500</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for chat history</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>172</integer> +        <integer>500</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterClothingRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for clothing window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>480</integer> -                <integer>320</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for clothing window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>480</integer> +        <integer>320</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterContactsRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for chat history</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>390</integer> -                <integer>395</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for chat history</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>390</integer> +        <integer>395</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterCustomizeAppearanceRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for avatar customization window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>540</integer> -                <integer>494</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for avatar customization window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>540</integer> +        <integer>494</integer> +        <integer>0</integer> +      </array> +    </map> +    <key>FloaterDayCycleRect</key> +    <map> +      <key>Comment</key> +      <string>Rectangle for Day Cycle Editor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>50</integer> +        <integer>450</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map> +    <key>FloaterEnvRect</key> +    <map> +      <key>Comment</key> +      <string>Rectangle for Environment Editor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>50</integer> +        <integer>150</integer> +        <integer>650</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterFindRect2</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Find window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>570</integer> -                <integer>780</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Find window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>570</integer> +        <integer>780</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterFriendsRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for friends window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>250</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for friends window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>250</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterGestureRect2</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for gestures window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>465</integer> -                <integer>350</integer> -                <integer>0</integer> -            </array> -        </map> -    <key>FloaterHtmlRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for HTML window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>100</integer> -                <integer>460</integer> -                <integer>370</integer> -                <integer>100</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for gestures window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>465</integer> +        <integer>350</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterHUDRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for HUD Floater window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>282</integer> -                <integer>342</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for HUD Floater window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>282</integer> +        <integer>342</integer> +        <integer>0</integer> +      </array> +    </map> +    <key>FloaterHtmlRect</key> +    <map> +      <key>Comment</key> +      <string>Rectangle for HTML window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>100</integer> +        <integer>460</integer> +        <integer>370</integer> +        <integer>100</integer> +      </array> +    </map>      <key>FloaterIMRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for IM window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>160</integer> -                <integer>500</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for IM window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>160</integer> +        <integer>500</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterInspectRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Object Inspect window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>400</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Object Inspect window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>400</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterInventoryRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for inventory window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for inventory window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterJoystickRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for joystick controls window.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>0</integer> -                <integer>0</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for joystick controls window.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>0</integer> +        <integer>0</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterLagMeter</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for lag meter</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>142</integer> -                <integer>350</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for lag meter</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>142</integer> +        <integer>350</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterLandRect5</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for About Land window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>370</integer> -                <integer>460</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for About Land window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>370</integer> +        <integer>460</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterLandmarkRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for landmark picker</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>290</integer> -                <integer>310</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for landmark picker</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>290</integer> +        <integer>310</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterMediaRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for media browser window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>16</integer> -                <integer>650</integer> -                <integer>600</integer> -                <integer>128</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for media browser window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>16</integer> +        <integer>650</integer> +        <integer>600</integer> +        <integer>128</integer> +      </array> +    </map>      <key>FloaterMiniMapRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for world map</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>225</integer> -                <integer>200</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for world map</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>225</integer> +        <integer>200</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterMoveRect2</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for avatar control window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>58</integer> -                <integer>135</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for avatar control window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>58</integer> +        <integer>135</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterMuteRect3</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for mute window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>300</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for mute window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>300</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterOpenObjectRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Open Object window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>350</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Open Object window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>350</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterPayRectB</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for pay window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>150</integer> -                <integer>400</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for pay window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>150</integer> +        <integer>400</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterRegionInfo</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for region info window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>512</integer> -                <integer>480</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for region info window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>512</integer> +        <integer>480</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterScriptDebugRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Script Error/Debug window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>130</integer> -                <integer>450</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Script Error/Debug window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>130</integer> +        <integer>450</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FloaterSnapshotRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for snapshot window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>200</integer> -                <integer>200</integer> -                <integer>400</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for snapshot window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>200</integer> +        <integer>200</integer> +        <integer>400</integer> +      </array> +    </map>      <key>FloaterViewBottom</key> -        <map> -        <key>Comment</key> -            <string>[DO NOT MODIFY] Controls layout of floating windows within SL window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>-1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[DO NOT MODIFY] Controls layout of floating windows within SL window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>-1</integer> +    </map>      <key>FloaterWorldMapRect2</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for world map window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>0</integer> -                <integer>0</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for world map window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>0</integer> +        <integer>0</integer> +        <integer>0</integer> +      </array> +    </map>      <key>FlyBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FlycamAbsolute</key> -        <map> -        <key>Comment</key> -            <string>Treat Flycam values as absolute positions (not deltas).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>AutoLeveling</key> -        <map> -        <key>Comment</key> -            <string>Keep Flycam level.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -    <key>Cursor3D</key> -        <map> -        <key>Comment</key> -            <string>Tread Joystick values as absolute positions (not deltas).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -    <key>ZoomDirect</key> -        <map> -        <key>Comment</key> -            <string>Map Joystick zoom axis directly to camera zoom.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>JoystickInitialized</key> -        <map> -        <key>Comment</key> -            <string>Whether or not a joystick has been detected and initiailized.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string></string> -        </map> -    <key>JoystickEnabled</key> -        <map> -        <key>Comment</key> -            <string>Enables Joystick Input.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>JoystickFlycamEnabled</key> -        <map> -        <key>Comment</key> -            <string>Enables the Joystick to control the flycam.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <string>1</string> -        </map> -    <key>JoystickAvatarEnabled</key> -        <map> -        <key>Comment</key> -            <string>Enables the Joystick to control Avatar movmement.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <string>1</string> -        </map> -    <key>JoystickBuildEnabled</key> -        <map> -        <key>Comment</key> -            <string>Enables the Joystick to move edited objects.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <string>1</string> -        </map> -    <key>JoystickAxis0</key> -        <map> -        <key>Comment</key> -            <string>Flycam hardware axis mapping for internal axis 0 ([0, 5]).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -    <key>JoystickAxis1</key> -        <map> -        <key>Comment</key> -            <string>Flycam hardware axis mapping for internal axis 1 ([0, 5]).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>JoystickAxis2</key> -        <map> -        <key>Comment</key> -            <string>Flycam hardware axis mapping for internal axis 2 ([0, 5]).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> -    <key>JoystickAxis3</key> -        <map> -        <key>Comment</key> -            <string>Flycam hardware axis mapping for internal axis 3 ([0, 5]).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>4</integer> -        </map> -    <key>JoystickAxis4</key> -        <map> -        <key>Comment</key> -            <string>Flycam hardware axis mapping for internal axis 4 ([0, 5]).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>3</integer> -        </map> -    <key>JoystickAxis5</key> -        <map> -        <key>Comment</key> -            <string>Flycam hardware axis mapping for internal axis 5 ([0, 5]).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>5</integer> -        </map> -    <key>JoystickAxis6</key> -        <map> -        <key>Comment</key> -            <string>Flycam hardware axis mapping for internal axis 6 ([0, 5]).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>-1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Treat Flycam values as absolute positions (not deltas).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FlycamAxisDeadZone0</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 0 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 0 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>FlycamAxisDeadZone1</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 1 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 1 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>FlycamAxisDeadZone2</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 2 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 2 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>FlycamAxisDeadZone3</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 3 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 3 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>FlycamAxisDeadZone4</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 4 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 4 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>FlycamAxisDeadZone5</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 5 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 5 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>FlycamAxisDeadZone6</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 6 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 6 dead zone.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>FlycamAxisScale0</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 0 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 0 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FlycamAxisScale1</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 1 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 1 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FlycamAxisScale2</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 2 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 2 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FlycamAxisScale3</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 3 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 3 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FlycamAxisScale4</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 4 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 4 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FlycamAxisScale5</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 5 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 5 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FlycamAxisScale6</key> -        <map> -        <key>Comment</key> -            <string>Flycam axis 6 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam axis 6 scaler.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FlycamFeathering</key> -        <map> -        <key>Comment</key> -            <string>Flycam feathering (less is softer)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>16</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Flycam feathering (less is softer)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>16.0</real> +    </map>      <key>FlycamZoomDirect</key> -        <map> -        <key>Comment</key> -            <string>Map flycam zoom axis directly to camera zoom.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Map flycam zoom axis directly to camera zoom.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FlyingAtExit</key> -        <map> -        <key>Comment</key> -            <string>Was flying when last logged out, so fly when logging in</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Was flying when last logged out, so fly when logging in</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FocusOffsetDefault</key> -        <map> -        <key>Comment</key> -            <string>Default focus point offset relative to avatar (x-axis is forward)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Default focus point offset relative to avatar (x-axis is forward)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>FocusPosOnLogout</key> -        <map> -        <key>Comment</key> -            <string>Camera focus point when last logged out (global coordinates)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3D</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>0</real> -                <real>0</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Camera focus point when last logged out (global coordinates)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3D</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>0.0</real> +        <real>0.0</real> +      </array> +    </map>      <key>FolderAutoOpenDelay</key> -        <map> -        <key>Comment</key> -            <string>Seconds before automatically expanding the folder under the mouse when performing inventory drag and drop</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.75</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Seconds before automatically expanding the folder under the mouse when performing inventory drag and drop</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.75</real> +    </map>      <key>FolderLoadingMessageWaitTime</key> -        <map> -        <key>Comment</key> -            <string>Seconds to wait before showing the LOADING... text in folder views</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Seconds to wait before showing the LOADING... text in folder views</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>FontMonospace</key> -        <map> -        <key>Comment</key> -            <string>Name of monospace font (Truetype file name)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>profontwindows.ttf</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Name of monospace font (Truetype file name)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>profontwindows.ttf</string> +    </map>      <key>FontSansSerif</key> -        <map> -        <key>Comment</key> -            <string>Name of san-serif font (Truetype file name)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>MtBkLfRg.ttf</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Name of san-serif font (Truetype file name)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>MtBkLfRg.ttf</string> +    </map>      <key>FontSansSerifBold</key> -        <map> -        <key>Comment</key> -            <string>Name of bold font (Truetype file name)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>MtBdLfRg.ttf</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Name of bold font (Truetype file name)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>MtBdLfRg.ttf</string> +    </map>      <key>FontSansSerifFallback</key> -        <map> -        <key>Comment</key> -            <string>Name of san-serif font (Truetype file name)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string></string> -        </map> +    <map> +      <key>Comment</key> +      <string>Name of san-serif font (Truetype file name)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>FontSansSerifFallbackScale</key> -        <map> -        <key>Comment</key> -            <string>Scale of fallback font relative to huge font (fraction of huge font size)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Scale of fallback font relative to huge font (fraction of huge font size)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>FontScreenDPI</key> -        <map> -        <key>Comment</key> -            <string>Font resolution, higher is bigger (pixels per inch)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>96</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Font resolution, higher is bigger (pixels per inch)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>96.0</real> +    </map>      <key>FontSizeHuge</key> -        <map> -        <key>Comment</key> -            <string>Size of huge font (points, or 1/72 of an inch)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>16</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of huge font (points, or 1/72 of an inch)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>16.0</real> +    </map>      <key>FontSizeLarge</key> -        <map> -        <key>Comment</key> -            <string>Size of large font (points, or 1/72 of an inch)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>12</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of large font (points, or 1/72 of an inch)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>12.0</real> +    </map>      <key>FontSizeMedium</key> -        <map> -        <key>Comment</key> -            <string>Size of medium font (points, or 1/72 of an inch)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>10</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of medium font (points, or 1/72 of an inch)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>10.0</real> +    </map>      <key>FontSizeMonospace</key> -        <map> -        <key>Comment</key> -            <string>Size of monospaced font (points, or 1/72 of an inch)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>9</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of monospaced font (points, or 1/72 of an inch)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>9.0</real> +    </map>      <key>FontSizeSmall</key> -        <map> -        <key>Comment</key> -            <string>Size of small font (points, or 1/72 of an inch)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>9</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of small font (points, or 1/72 of an inch)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>9.0</real> +    </map>      <key>ForceShowGrid</key> -        <map> -        <key>Comment</key> -            <string>Always show grid dropdown on login screen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Always show grid dropdown on login screen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ForwardBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>45</integer> -                <integer>54</integer> -                <integer>66</integer> -                <integer>29</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>45</integer> +        <integer>54</integer> +        <integer>66</integer> +        <integer>29</integer> +      </array> +    </map>      <key>FreezeTime</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FullScreen</key> -        <map> -        <key>Comment</key> -            <string>Run SL in fullscreen mode</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Run SL in fullscreen mode</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>FullScreenAspectRatio</key> -        <map> -        <key>Comment</key> -            <string>Aspect ratio of fullscreen display (width / height)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1.33329999446868896484375</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Aspect ratio of fullscreen display (width / height)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.33329999447</real> +    </map>      <key>FullScreenAutoDetectAspectRatio</key> -        <map> -        <key>Comment</key> -            <string>Automatically detect proper aspect ratio for fullscreen display</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Automatically detect proper aspect ratio for fullscreen display</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>FullScreenHeight</key> -        <map> -        <key>Comment</key> -            <string>Fullscreen resolution in height</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>768</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Fullscreen resolution in height</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>768</integer> +    </map>      <key>FullScreenWidth</key> -        <map> -        <key>Comment</key> -            <string>Fullscreen resolution in width</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1024</integer> -        </map> -    <key>GridChoice</key> -        <map> -        <key>Comment</key> -            <string>The user's grid choice or ip address.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Fullscreen resolution in width</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1024</integer> +    </map>      <key>GridCrossSections</key> -        <map> -        <key>Comment</key> -            <string>Highlight cross sections of prims with grid manipulation plane.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Highlight cross sections of prims with grid manipulation plane.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>GridDrawSize</key> -        <map> -        <key>Comment</key> -            <string>Visible extent of 2D snap grid (meters)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>12</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Visible extent of 2D snap grid (meters)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>12.0</real> +    </map>      <key>GridMode</key> -        <map> -        <key>Comment</key> -            <string>Snap grid reference frame (0 = world, 1 = local, 2 = reference object)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Snap grid reference frame (0 = world, 1 = local, 2 = reference object)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>GridOpacity</key> -        <map> -        <key>Comment</key> -            <string>Grid line opacity (0.0 = completely transparent, 1.0 = completely opaque)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.699999988079071044921875</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Grid line opacity (0.0 = completely transparent, 1.0 = completely opaque)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.699999988079</real> +    </map>      <key>GridResolution</key> -        <map> -        <key>Comment</key> -            <string>Size of single grid step (meters)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of single grid step (meters)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>GridSubUnit</key> -        <map> -        <key>Comment</key> -            <string>Display fractional grid steps, relative to grid size</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display fractional grid steps, relative to grid size</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>GridSubdivision</key> -        <map> -        <key>Comment</key> -            <string>Maximum number of times to divide single snap grid unit when GridSubUnit is true</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>32</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum number of times to divide single snap grid unit when GridSubUnit is true</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>32</integer> +    </map>      <key>GroupNotifyBoxHeight</key> -        <map> -        <key>Comment</key> -            <string>Height of group notice messages</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>260</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Height of group notice messages</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>260</integer> +    </map>      <key>GroupNotifyBoxWidth</key> -        <map> -        <key>Comment</key> -            <string>Width of group notice messages</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>400</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Width of group notice messages</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>400</integer> +    </map>      <key>HTMLLinkColor</key> -        <map> -        <key>Comment</key> -            <string>Color of hyperlinks</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.60000002384185791015625</real> -                <real>0.60000002384185791015625</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of hyperlinks</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.600000023842</real> +        <real>0.600000023842</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>HelpHomeURL</key> -        <map> -        <key>Comment</key> -            <string>URL of initial help page</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>help/index.html</string> -        </map> +    <map> +      <key>Comment</key> +      <string>URL of initial help page</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>help/index.html</string> +    </map>      <key>HelpLastVisitedURL</key> -        <map> -        <key>Comment</key> -            <string>URL of last help page, will be shown next time help is accessed</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>help/index.html</string> -        </map> -    <key>HelperURI</key> -        <map> -        <key>Comment</key> -            <string>helper web CGI prefix to use</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>URL of last help page, will be shown next time help is accessed</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>help/index.html</string> +    </map>      <key>HighResSnapshot</key> -        <map> -        <key>Comment</key> -            <string>Double resolution of snapshot from current window resolution</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Double resolution of snapshot from current window resolution</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>HtmlFindRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for HTML find window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>16</integer> -                <integer>650</integer> -                <integer>600</integer> -                <integer>128</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for HTML find window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>16</integer> +        <integer>650</integer> +        <integer>600</integer> +        <integer>128</integer> +      </array> +    </map>      <key>HtmlHelpLastPage</key> -        <map> -        <key>Comment</key> -            <string>Last URL visited via help system</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Last URL visited via help system</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>HtmlHelpRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for HTML help window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>16</integer> -                <integer>650</integer> -                <integer>600</integer> -                <integer>128</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for HTML help window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>16</integer> +        <integer>650</integer> +        <integer>600</integer> +        <integer>128</integer> +      </array> +    </map>      <key>HtmlReleaseMessage</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for HTML Release Message Floater window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>46</integer> -                <integer>520</integer> -                <integer>400</integer> -                <integer>128</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for HTML Release Message Floater window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>46</integer> +        <integer>520</integer> +        <integer>400</integer> +        <integer>128</integer> +      </array> +    </map> +    <key>IMChatColor</key> +    <map> +      <key>Comment</key> +      <string>Color of instant messages from other residents</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>IMInChatHistory</key> -        <map> -        <key>Comment</key> -            <string>Copy IM into chat history</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Copy IM into chat history</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>IMShowTimestamps</key> -        <map> -        <key>Comment</key> -            <string>Show timestamps in IM</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show timestamps in IM</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>IgnorePixelDepth</key> -        <map> -        <key>Comment</key> -            <string>Ignore pixel depth settings.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Ignore pixel depth settings.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ImagePipelineUseHTTP</key> -        <map> -        <key>Comment</key> -            <string>If TRUE use HTTP GET to fetch textures from the server</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>If TRUE use HTTP GET to fetch textures from the server</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>InBandwidth</key> -        <map> -        <key>Comment</key> -            <string>Incoming bandwidth throttle (bps)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Incoming bandwidth throttle (bps)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map>      <key>InventoryAutoOpenDelay</key> -        <map> -        <key>Comment</key> -            <string>Seconds before automatically opening inventory when mouse is over inventory button when performing inventory drag and drop</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Seconds before automatically opening inventory when mouse is over inventory button when performing inventory drag and drop</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>InventorySortOrder</key> -        <map> -        <key>Comment</key> -            <string>Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>7</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>7</integer> +    </map>      <key>InvertMouse</key> -        <map> -        <key>Comment</key> -            <string>When in mouselook, moving mouse up looks down and vice verse (FALSE = moving up looks up)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>When in mouselook, moving mouse up looks down and vice verse (FALSE = moving up looks up)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>JoystickAvatarEnabled</key> +    <map> +      <key>Comment</key> +      <string>Enables the Joystick to control Avatar movmement.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <string>1</string> +    </map> +    <key>JoystickAxis0</key> +    <map> +      <key>Comment</key> +      <string>Flycam hardware axis mapping for internal axis 0 ([0, 5]).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>JoystickAxis1</key> +    <map> +      <key>Comment</key> +      <string>Flycam hardware axis mapping for internal axis 1 ([0, 5]).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>JoystickAxis2</key> +    <map> +      <key>Comment</key> +      <string>Flycam hardware axis mapping for internal axis 2 ([0, 5]).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>2</integer> +    </map> +    <key>JoystickAxis3</key> +    <map> +      <key>Comment</key> +      <string>Flycam hardware axis mapping for internal axis 3 ([0, 5]).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>4</integer> +    </map> +    <key>JoystickAxis4</key> +    <map> +      <key>Comment</key> +      <string>Flycam hardware axis mapping for internal axis 4 ([0, 5]).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>3</integer> +    </map> +    <key>JoystickAxis5</key> +    <map> +      <key>Comment</key> +      <string>Flycam hardware axis mapping for internal axis 5 ([0, 5]).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>5</integer> +    </map> +    <key>JoystickAxis6</key> +    <map> +      <key>Comment</key> +      <string>Flycam hardware axis mapping for internal axis 6 ([0, 5]).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>-1</integer> +    </map> +    <key>JoystickBuildEnabled</key> +    <map> +      <key>Comment</key> +      <string>Enables the Joystick to move edited objects.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <string>1</string> +    </map> +    <key>JoystickEnabled</key> +    <map> +      <key>Comment</key> +      <string>Enables Joystick Input.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>JoystickFlycamEnabled</key> +    <map> +      <key>Comment</key> +      <string>Enables the Joystick to control the flycam.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <string>1</string> +    </map> +    <key>JoystickInitialized</key> +    <map> +      <key>Comment</key> +      <string>Whether or not a joystick has been detected and initiailized.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>KeepAspectForSnapshot</key> -        <map> -        <key>Comment</key> -            <string>Use full window when taking snapshot, regardless of requested image size</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use full window when taking snapshot, regardless of requested image size</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>LCDDestination</key> -        <map> -        <key>Comment</key> -            <string>Which LCD to use</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Which LCD to use</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LSLHelpRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for LSL help window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>400</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for LSL help window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>400</integer> +        <integer>0</integer> +      </array> +    </map>      <key>LSLHelpURL</key> -        <map> -        <key>Comment</key> -            <string>URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string> -        </map> +    <map> +      <key>Comment</key> +      <string>URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string> +    </map>      <key>LagMeterShrunk</key> -        <map> -        <key>Comment</key> -            <string>Last large/small state for lag meter</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Last large/small state for lag meter</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>Language</key> -        <map> -        <key>Comment</key> -            <string>Language specifier (for XUI)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>default</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Language specifier (for XUI)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>default</string> +    </map>      <key>LanguageIsPublic</key>          <map>          <key>Comment</key> @@ -3820,269 +4184,269 @@              <integer>1</integer>          </map>      <key>LastFeatureVersion</key> -        <map> -        <key>Comment</key> -            <string>[DO NOT MODIFY] Version number for tracking hardware changes</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[DO NOT MODIFY] Version number for tracking hardware changes</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LastFindPanel</key> -        <map> -        <key>Comment</key> -            <string>Controls which find operation appears by default when clicking "Find" button </string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>find_all_panel</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls which find operation appears by default when clicking "Find" button </string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>find_all_panel</string> +    </map>      <key>LastName</key> -        <map> -        <key>Comment</key> -            <string>Login last name</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Login last name</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>LastPrefTab</key> -        <map> -        <key>Comment</key> -            <string>Last selected tab in preferences window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Last selected tab in preferences window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LastRunVersion</key> -        <map> -        <key>Comment</key> -            <string>Version number of last instance of the viewer that you ran</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>0.0.0</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Version number of last instance of the viewer that you ran</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>0.0.0</string> +    </map>      <key>LastSnapshotHeight</key> -        <map> -        <key>Comment</key> -            <string>The height of the last snapshot, in px</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>768</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>The height of the last snapshot, in px</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>768</integer> +    </map>      <key>LastSnapshotType</key> -        <map> -        <key>Comment</key> -            <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LastSnapshotWidth</key> -        <map> -        <key>Comment</key> -            <string>The width of the last snapshot, in px</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1024</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>The width of the last snapshot, in px</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1024</integer> +    </map>      <key>LeftClickShowMenu</key> -        <map> -        <key>Comment</key> -            <string>Left click opens pie menu (FALSE = left click touches or grabs object)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Left click opens pie menu (FALSE = left click touches or grabs object)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LimitDragDistance</key> -        <map> -        <key>Comment</key> -            <string>Limit translation of object via translate tool</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Limit translation of object via translate tool</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>LimitSelectDistance</key> -        <map> -        <key>Comment</key> -            <string>Disallow selection of objects beyond max select distance</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disallow selection of objects beyond max select distance</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>LipSyncAah</key> -        <map> -        <key>Comment</key> -            <string>Aah (jaw opening) babble loop</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>257998776531013446642343</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Aah (jaw opening) babble loop</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>257998776531013446642343</string> +    </map>      <key>LipSyncAahPowerTransfer</key> -        <map> -        <key>Comment</key> -            <string>Transfer curve for Voice Interface power to aah lip sync amplitude</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>0000123456789</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Transfer curve for Voice Interface power to aah lip sync amplitude</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>0000123456789</string> +    </map>      <key>LipSyncEnabled</key> -        <map> -        <key>Comment</key> -            <string>0 disable lip-sync, 1 enable babble loop</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>0 disable lip-sync, 1 enable babble loop</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LipSyncOoh</key> -        <map> -        <key>Comment</key> -            <string>Ooh (mouth width) babble loop</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>1247898743223344444443200000</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Ooh (mouth width) babble loop</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>1247898743223344444443200000</string> +    </map>      <key>LipSyncOohAahRate</key> -        <map> -        <key>Comment</key> -            <string>Rate to babble Ooh and Aah (/sec)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>24.0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Rate to babble Ooh and Aah (/sec)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>24.0</real> +    </map>      <key>LipSyncOohPowerTransfer</key> -        <map> -        <key>Comment</key> -            <string>Transfer curve for Voice Interface power to ooh lip sync amplitude</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>0012345566778899</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Transfer curve for Voice Interface power to ooh lip sync amplitude</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>0012345566778899</string> +    </map>      <key>LocalCacheVersion</key> -        <map> -        <key>Comment</key> -            <string>Version number of cache</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Version number of cache</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LogMessages</key> -        <map> -        <key>Comment</key> -            <string>Log network traffic</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Log network traffic</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LoginAsGod</key> -        <map> -        <key>Comment</key> -            <string>Attempt to login with god powers (Linden accounts only)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Attempt to login with god powers (Linden accounts only)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>LoginLastLocation</key> -        <map> -        <key>Comment</key> -            <string>Login at same location you last logged out</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Login at same location you last logged out</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>LoginPage</key> -        <map> -        <key>Comment</key> -            <string>Login authentication page.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> -    <key>LoginURI</key> -        <map> -        <key>Comment</key> -            <string>login server and CGI prefix to use</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Login authentication page.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>LosslessJ2CUpload</key> -        <map> -        <key>Comment</key> -            <string>Use lossless compression for small image uploads</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use lossless compression for small image uploads</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>MainloopTimeoutDefault</key> +    <map> +      <key>Comment</key> +      <string>Timeout duration for mainloop lock detection, in seconds.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>20.0</real> +    </map>      <key>MainloopTimeoutDefault</key>          <map>          <key>Comment</key> @@ -4095,6123 +4459,5760 @@              <real>10.0</real>          </map>      <key>MapOverlayIndex</key> -        <map> -        <key>Comment</key> -            <string>Currently selected world map type</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Currently selected world map type</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MapScale</key> -        <map> -        <key>Comment</key> -            <string>World map zoom level (pixels per region)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>128</real> -        </map> +    <map> +      <key>Comment</key> +      <string>World map zoom level (pixels per region)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>128.0</real> +    </map>      <key>MapShowClassifieds</key> -        <map> -        <key>Comment</key> -            <string>Show locations associated with classified ads on world map</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show locations associated with classified ads on world map</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>MapShowEvents</key> -        <map> -        <key>Comment</key> -            <string>Show events on world map</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show events on world map</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>MapShowInfohubs</key> -        <map> -        <key>Comment</key> -            <string>Show infohubs on the world map</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show infohubs on the world map</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>MapShowLandForSale</key> -        <map> -        <key>Comment</key> -            <string>Show land for sale on world map</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show land for sale on world map</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MapShowPeople</key> -        <map> -        <key>Comment</key> -            <string>Show other users on world map</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show other users on world map</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>MapShowTelehubs</key> -        <map> -        <key>Comment</key> -            <string>Show telehubs on world map</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show telehubs on world map</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>Marker</key> -        <map> -        <key>Comment</key> -            <string>[NOT USED]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>[NOT USED]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>MaxDragDistance</key> -        <map> -        <key>Comment</key> -            <string>Maximum allowed translation distance in a single operation of translate tool (meters from start point)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>48</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum allowed translation distance in a single operation of translate tool (meters from start point)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>48.0</real> +    </map>      <key>MaxSelectDistance</key> -        <map> -        <key>Comment</key> -            <string>Maximum allowed selection distance (meters from avatar)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>64</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum allowed selection distance (meters from avatar)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>64.0</real> +    </map>      <key>MeanCollisionBump</key> -        <map> -        <key>Comment</key> -            <string>You have experienced an abuse of being bumped by an object or avatar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>You have experienced an abuse of being bumped by an object or avatar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MeanCollisionPhysical</key> -        <map> -        <key>Comment</key> -            <string>You have experienced an abuse from a physical object</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>You have experienced an abuse from a physical object</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MeanCollisionPushObject</key> -        <map> -        <key>Comment</key> -            <string>You have experienced an abuse of being pushed by a scripted object</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>You have experienced an abuse of being pushed by a scripted object</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MeanCollisionScripted</key> -        <map> -        <key>Comment</key> -            <string>You have experienced an abuse from a scripted object</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>You have experienced an abuse from a scripted object</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MeanCollisionSelected</key> +    <map> +      <key>Comment</key> +      <string>You have experienced an abuse of being pushed via a selected object</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>MemoryLogFrequency</key>          <map>          <key>Comment</key> -            <string>You have experienced an abuse of being pushed via a selected object</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>MenuAccessKeyTime</key> -        <map> -        <key>Comment</key> -            <string>Time (seconds) in which the menu key must be tapped to move focus to the menu bar</string> +            <string>Seconds between display of Memory in log (0 for never)</string>          <key>Persist</key>              <integer>1</integer>          <key>Type</key>              <string>F32</string>          <key>Value</key> -            <real>0.25</real> +            <real>600.0</real>          </map> +    <key>MenuAccessKeyTime</key> +    <map> +      <key>Comment</key> +      <string>Time (seconds) in which the menu key must be tapped to move focus to the menu bar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.25</real> +    </map>      <key>MenuBarHeight</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>18</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>18</integer> +    </map>      <key>MenuBarWidth</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>410</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>410</integer> +    </map>      <key>MiniMapRotate</key> -        <map> -        <key>Comment</key> -            <string>Rotate miniature world map to avatar direction</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Rotate miniature world map to avatar direction</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>MiniMapScale</key> -        <map> -        <key>Comment</key> -            <string>Miniature world map zoom levle (pixels per region)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>128</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Miniature world map zoom levle (pixels per region)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>128.0</real> +    </map>      <key>MouseSensitivity</key> -        <map> -        <key>Comment</key> -            <string>Controls responsiveness of mouse when in mouselook mode (fraction or multiple of default mouse sensitivity)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>3</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls responsiveness of mouse when in mouselook mode (fraction or multiple of default mouse sensitivity)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>3.0</real> +    </map>      <key>MouseSmooth</key> -        <map> -        <key>Comment</key> -            <string>Smooths out motion of mouse when in mouselook mode.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Smooths out motion of mouse when in mouselook mode.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MouseSun</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MouselookBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MoveDownBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>91</integer> -                <integer>29</integer> -                <integer>116</integer> -                <integer>4</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>91</integer> +        <integer>29</integer> +        <integer>116</integer> +        <integer>4</integer> +      </array> +    </map>      <key>MoveUpBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>91</integer> -                <integer>54</integer> -                <integer>116</integer> -                <integer>29</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>91</integer> +        <integer>54</integer> +        <integer>116</integer> +        <integer>29</integer> +      </array> +    </map>      <key>MuteAmbient</key> -        <map> -        <key>Comment</key> -            <string>Ambient sound effects, such as wind noise, play at 0 volume</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Ambient sound effects, such as wind noise, play at 0 volume</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MuteAudio</key> -        <map> -        <key>Comment</key> -            <string>All audio plays at 0 volume (streaming audio still takes up bandwidth, for example)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>All audio plays at 0 volume (streaming audio still takes up bandwidth, for example)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MuteMedia</key> -        <map> -        <key>Comment</key> -            <string>Media plays at 0 volume (streaming audio still takes up bandwidth)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Media plays at 0 volume (streaming audio still takes up bandwidth)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MuteMusic</key> -        <map> -        <key>Comment</key> -            <string>Music plays at 0 volume (streaming audio still takes up bandwidth)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Music plays at 0 volume (streaming audio still takes up bandwidth)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MuteSounds</key> -        <map> -        <key>Comment</key> -            <string>Sound effects play at 0 volume</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound effects play at 0 volume</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MuteUI</key> -        <map> -        <key>Comment</key> -            <string>UI sound effects play at 0 volume</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>UI sound effects play at 0 volume</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MuteVoice</key> -        <map> -        <key>Comment</key> -            <string>Voice plays at 0 volume (streaming audio still takes up bandwidth)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Voice plays at 0 volume (streaming audio still takes up bandwidth)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>MuteWhenMinimized</key> -        <map> -        <key>Comment</key> -            <string>Mute audio when SL window is minimized</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Mute audio when SL window is minimized</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>NewCacheLocation</key> -        <map> -        <key>Comment</key> -            <string>Change the location of the local disk cache to this</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Change the location of the local disk cache to this</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>NextLoginLocation</key> -        <map> -        <key>Comment</key> -            <string>Location to log into by default.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Location to log into by default.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>NoAudio</key> -        <map> -        <key>Comment</key> -            <string>Disable audio playback.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disable audio playback.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NoHardwareProbe</key> -        <map> -        <key>Comment</key> -            <string>Disable hardware probe.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disable hardware probe.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NoInventoryLibrary</key> -        <map> -        <key>Comment</key> -            <string>Do not request inventory library.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Do not request inventory library.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NoPreload</key> -        <map> -        <key>Comment</key> -            <string>Disable sound and image preload.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disable sound and image preload.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NoQuickTime</key> -        <map> -        <key>Comment</key> -            <string>Disable quicktime playback.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Disable quicktime playback.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NoVerifySSLCert</key> -        <map> -        <key>Comment</key> -            <string>Do not verify SSL peers.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Do not verify SSL peers.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NotecardEditorRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for notecard editor</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>400</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for notecard editor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>400</integer> +        <integer>0</integer> +      </array> +    </map>      <key>NotifyBoxHeight</key> -        <map> -        <key>Comment</key> -            <string>Height of notification messages</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>200</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Height of notification messages</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>200</integer> +    </map>      <key>NotifyBoxWidth</key> -        <map> -        <key>Comment</key> -            <string>Width of notification messages</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>350</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Width of notification messages</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>350</integer> +    </map>      <key>NotifyMoneyChange</key> -        <map> -        <key>Comment</key> -            <string>Pop up notifications for all L$ transactions</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Pop up notifications for all L$ transactions</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>NotifyTipDuration</key> -        <map> -        <key>Comment</key> -            <string>Length of time that notification tips stay on screen (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>4</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Length of time that notification tips stay on screen (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>4.0</real> +    </map>      <key>NumSessions</key> -        <map> -        <key>Comment</key> -            <string>Number of successful logins to Second Life</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Number of successful logins to Second Life</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>NumpadControl</key> -        <map> -        <key>Comment</key> -            <string>How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ObjectChatColor</key> -        <map> -        <key>Comment</key> -            <string>Color of chat messages from objects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.699999988079071044921875</real> -                <real>0.89999997615814208984375</real> -                <real>0.699999988079071044921875</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of chat messages from objects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.699999988079</real> +        <real>0.899999976158</real> +        <real>0.699999988079</real> +        <real>1.0</real> +      </array> +    </map>      <key>OpenDebugStatAdvanced</key> -        <map> -        <key>Comment</key> -            <string>Expand advanced performance stats display</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Expand advanced performance stats display</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>OpenDebugStatBasic</key> -        <map> -        <key>Comment</key> -            <string>Expand basic performance stats display</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Expand basic performance stats display</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>OpenDebugStatNet</key> -        <map> -        <key>Comment</key> -            <string>Expand network stats display</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Expand network stats display</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>OpenDebugStatRender</key> -        <map> -        <key>Comment</key> -            <string>Expand render stats display</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Expand render stats display</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>OpenDebugStatSim</key> -        <map> -        <key>Comment</key> -            <string>Expand simulator performance stats display</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Expand simulator performance stats display</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>OutBandwidth</key> -        <map> -        <key>Comment</key> -            <string>Outgoing bandwidth throttle (bps)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Outgoing bandwidth throttle (bps)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map>      <key>OverdrivenColor</key> -        <map> -        <key>Comment</key> -            <string>Color of various indicators when resident is speaking too loud.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>0</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of various indicators when resident is speaking too loud.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>OverlayTitle</key> -        <map> -        <key>Comment</key> -            <string>Controls watermark text message displayed on screen when "ShowOverlayTitle" is enabled (one word, underscores become spaces)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>Set_via_OverlayTitle_in_settings.xml</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls watermark text message displayed on screen when "ShowOverlayTitle" is enabled (one word, underscores become spaces)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>Set_via_OverlayTitle_in_settings.xml</string> +    </map>      <key>PTTCurrentlyEnabled</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>PacketDropPercentage</key> -        <map> -        <key>Comment</key> -            <string>Percentage of packets dropped by the client.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Percentage of packets dropped by the client.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>ParcelMediaAutoPlayEnable</key> +    <map> +      <key>Comment</key> +      <string>Auto play parcel media when available</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>PerAccountSettingsFile</key> -        <map> -        <key>Comment</key> -            <string>Persisted client settings file name (per user).</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>Persisted client settings file name (per user).</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>PermissionsCautionEnabled</key> -        <map> -        <key>Comment</key> -            <string>When enabled, changes the handling of script permission requests to help avoid accidental granting of certain permissions, such as the debit permission</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>When enabled, changes the handling of script permission requests to help avoid accidental granting of certain permissions, such as the debit permission</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>PermissionsCautionNotifyBoxHeight</key> -        <map> -        <key>Comment</key> -            <string>Height of caution-style notification messages</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>344</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Height of caution-style notification messages</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>344</integer> +    </map>      <key>PermissionsManagerRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for permissions manager window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>85</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for permissions manager window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>85</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PickerContextOpacity</key> -        <map> -        <key>Comment</key> -            <string>Controls overall opacity of context frustrum connecting color and texture pickers with their swatches</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.3499999940395355224609375</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls overall opacity of context frustrum connecting color and texture pickers with their swatches</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.34999999404</real> +    </map>      <key>PieMenuLineWidth</key> -        <map> -        <key>Comment</key> -            <string>Width of lines in pie menu display (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>2.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Width of lines in pie menu display (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>2.5</real> +    </map>      <key>PinTalkViewOpen</key> -        <map> -        <key>Comment</key> -            <string>Stay in IM after hitting return</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Stay in IM after hitting return</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>PingInterpolate</key> -        <map> -        <key>Comment</key> -            <string>Extrapolate object position along velocity vector based on ping delay</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Extrapolate object position along velocity vector based on ping delay</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>PitchFromMousePosition</key> -        <map> -        <key>Comment</key> -            <string>Vertical range over which avatar head tracks mouse position (degrees of head rotation from top of window to bottom)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>90</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Vertical range over which avatar head tracks mouse position (degrees of head rotation from top of window to bottom)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>90.0</real> +    </map>      <key>PlayTypingAnim</key> -        <map> -        <key>Comment</key> -            <string>Your avatar plays the typing animation whenever you type in the chat bar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Your avatar plays the typing animation whenever you type in the chat bar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>PrecachingDelay</key> -        <map> -        <key>Comment</key> -            <string>Delay when logging in to load world before showing it (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>6</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Delay when logging in to load world before showing it (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>6.0</real> +    </map>      <key>PreviewAnimRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for animation preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>85</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for animation preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>85</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewClassifiedRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for URL preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>530</integer> -                <integer>420</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for URL preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>530</integer> +        <integer>420</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewEventRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for Event preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>530</integer> -                <integer>420</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for Event preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>530</integer> +        <integer>420</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewLandmarkRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for landmark preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>90</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for landmark preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>90</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewObjectRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for object preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>85</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for object preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>85</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewScriptRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for script preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>550</integer> -                <integer>500</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for script preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>550</integer> +        <integer>500</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewSoundRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for sound preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>85</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for sound preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>85</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewTextureRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for texture preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>400</integer> -                <integer>400</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for texture preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>400</integer> +        <integer>400</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewURLRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for URL preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>90</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for URL preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>90</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PreviewWearableRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for wearable preview window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>85</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for wearable preview window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>85</integer> +        <integer>300</integer> +        <integer>0</integer> +      </array> +    </map>      <key>ProbeHardwareOnStartup</key> -        <map> -        <key>Comment</key> -            <string>Query current hardware configuration on application startup</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Query current hardware configuration on application startup</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>PropertiesRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for inventory item properties window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>320</integer> -                <integer>350</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for inventory item properties window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>320</integer> +        <integer>350</integer> +        <integer>0</integer> +      </array> +    </map>      <key>PurgeCacheOnNextStartup</key> -        <map> -        <key>Comment</key> -            <string>Clear local file cache next time viewer is run</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Clear local file cache next time viewer is run</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>PurgeCacheOnStartup</key> -        <map> -        <key>Comment</key> -            <string>Clear local file cache every time viewer is run</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Clear local file cache every time viewer is run</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>PushToTalkButton</key> -        <map> -        <key>Comment</key> -            <string>Which button or keyboard key is used for push-to-talk</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>MiddleMouse</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Which button or keyboard key is used for push-to-talk</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>MiddleMouse</string> +    </map>      <key>PushToTalkToggle</key> -        <map> -        <key>Comment</key> -            <string>Should the push-to-talk button behave as a toggle</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Should the push-to-talk button behave as a toggle</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>QAMode</key> -        <map> -        <key>Comment</key> -            <string>Enable Testing Features.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable Testing Features.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>QuietSnapshotsToDisk</key> -        <map> -        <key>Comment</key> -            <string>Take snapshots to disk without playing animation or sound</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Take snapshots to disk without playing animation or sound</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>QuitAfterSeconds</key> -        <map> -        <key>Comment</key> -            <string>The duration allowed before quitting.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>The duration allowed before quitting.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map>      <key>RadioLandBrushAction</key> -        <map> -        <key>Comment</key> -            <string>Last selected land modification operation (0 = flatten, 1 = raise, 2 = lower, 3 = smooth, 4 = roughen, 5 = revert)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Last selected land modification operation (0 = flatten, 1 = raise, 2 = lower, 3 = smooth, 4 = roughen, 5 = revert)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RadioLandBrushSize</key> -        <map> -        <key>Comment</key> -            <string>Size of land modification brush (0 = small, 1 = medium, 2 = large)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of land modification brush (0 = small, 1 = medium, 2 = large)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RecentItemsSortOrder</key> -        <map> -        <key>Comment</key> -            <string>Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RectangleSelectInclusive</key> -        <map> -        <key>Comment</key> -            <string>Select objects that have at least one vertex inside selection rectangle</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Select objects that have at least one vertex inside selection rectangle</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RegionTextureSize</key> -        <map> -        <key>Comment</key> -            <string>Terrain texture dimensions (power of 2)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>256</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Terrain texture dimensions (power of 2)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>256</integer> +    </map>      <key>RememberPassword</key> -        <map> -        <key>Comment</key> -            <string>Keep password (in encrypted form) for next login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Keep password (in encrypted form) for next login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderAnisotropic</key> -        <map> -        <key>Comment</key> -            <string>Render textures using anisotropic filtering</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Render textures using anisotropic filtering</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderAppleUseMultGL</key> -        <map> -        <key>Comment</key> -            <string>Whether we want to use multi-threaded OpenGL on Apple hardware (requires restart of SL).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether we want to use multi-threaded OpenGL on Apple hardware (requires restart of SL).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderAvatarCloth</key> -        <map> -        <key>Comment</key> -            <string>Controls if avatars use wavy cloth</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls if avatars use wavy cloth</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderAvatarLODFactor</key> -        <map> -        <key>Comment</key> -            <string>Controls level of detail of avatars (multiplier for current screen area when calculated level of detail)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls level of detail of avatars (multiplier for current screen area when calculated level of detail)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>RenderAvatarMaxVisible</key> -        <map> -        <key>Comment</key> -            <string>Maximum number of avatars to display at any one time</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>35</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum number of avatars to display at any one time</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>35</integer> +    </map>      <key>RenderAvatarVP</key> -        <map> -        <key>Comment</key> -            <string>Use vertex programs to perform hardware skinning of avatar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use vertex programs to perform hardware skinning of avatar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderBumpmapMinDistanceSquared</key> -        <map> -        <key>Comment</key> -            <string>Maximum distance at which to render bumpmapped primitives (distance in meters, squared)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>100</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum distance at which to render bumpmapped primitives (distance in meters, squared)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>100.0</real> +    </map>      <key>RenderCubeMap</key> -        <map> -        <key>Comment</key> -            <string>Whether we can render the cube map or not</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether we can render the cube map or not</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderCustomSettings</key> -        <map> -        <key>Comment</key> -            <string>Do you want to set the graphics settings yourself</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -     <key>RenderDebugGL</key> -      <map> -        <key>Comment</key> -        <string>Enable strict GL debugging.</string> -        <key>Persist</key> -        <integer>1</integer> -        <key>Type</key> -        <string>Boolean</string> -        <key>Value</key> -        <integer>0</integer> -      </map> -      <key>RenderDebugPipeline</key> -      <map> -        <key>Comment</key> -        <string>Enable strict pipeline debugging.</string> -        <key>Persist</key> -        <integer>1</integer> -        <key>Type</key> -        <string>Boolean</string> -        <key>Value</key> -        <integer>0</integer> -      </map> +    <map> +      <key>Comment</key> +      <string>Do you want to set the graphics settings yourself</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>RenderDebugGL</key> +    <map> +      <key>Comment</key> +      <string>Enable strict GL debugging.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>RenderDebugPipeline</key> +    <map> +      <key>Comment</key> +      <string>Enable strict pipeline debugging.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderDebugTextureBind</key> -        <map> -        <key>Comment</key> -            <string>Enable texture bind performance test.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable texture bind performance test.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>RenderDeferred</key> +    <map> +      <key>Comment</key> +      <string>Use deferred rendering pipeline.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderDynamicLOD</key> -        <map> -        <key>Comment</key> -            <string>Dynamically adjust level of detail.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Dynamically adjust level of detail.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderDynamicReflections</key> -        <map> -        <key>Comment</key> -            <string>Generate a dynamic cube map for reflections (objects reflect their environment, experimental).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Generate a dynamic cube map for reflections (objects reflect their environment, experimental).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>RenderFSAASamples</key> +    <map> +      <key>Comment</key> +      <string>Number of samples to use for FSAA (0 = no AA).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderFarClip</key> -        <map> -        <key>Comment</key> -            <string>Distance of far clip plane from camera (meters)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>256</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Distance of far clip plane from camera (meters)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>256.0</real> +    </map> +    <key>RenderFastAlpha</key> +    <map> +      <key>Comment</key> +      <string>Use lossy alpha rendering optimization (opaque/nonexistent small alpha faces).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderFastUI</key> -        <map> -        <key>Comment</key> -            <string>[NOT USED]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[NOT USED]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderFlexTimeFactor</key> -        <map> -        <key>Comment</key> -            <string>Controls level of detail of flexible objects (multiplier for amount of time spent processing flex objects)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls level of detail of flexible objects (multiplier for amount of time spent processing flex objects)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderFogRatio</key> -        <map> -        <key>Comment</key> -            <string>Distance from camera where fog reaches maximum density (fraction or multiple of far clip distance)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>4.0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Distance from camera where fog reaches maximum density (fraction or multiple of far clip distance)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>4.0</real> +    </map>      <key>RenderGamma</key> -        <map> -        <key>Comment</key> -            <string>Sets gamma exponent for renderer</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Sets gamma exponent for renderer</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map>      <key>RenderGammaFull</key> -        <map> -        <key>Comment</key> -            <string>Use fully controllable gamma correction, instead of faster, hard-coded gamma correction of 2.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Use fully controllable gamma correction, instead of faster, hard-coded gamma correction of 2.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderGlow</key> -        <map> -        <key>Comment</key> -            <string>Render bloom post effect.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Render bloom post effect.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderGlowIterations</key> -        <map> -        <key>Comment</key> -            <string>Number of times to iterate the glow (higher = wider and smoother but slower)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Number of times to iterate the glow (higher = wider and smoother but slower)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>      <key>RenderGlowLumWeights</key> -        <map> -        <key>Comment</key> -            <string>Weights for each color channel to be used in calculating luminance (should add up to 1.0)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3</string> -        <key>Value</key> -            <array> -                <real>0.299</real> -                <real>0.587</real> -                <real>0.114</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Weights for each color channel to be used in calculating luminance (should add up to 1.0)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>0.299</real> +        <real>0.587</real> +        <real>0.114</real> +      </array> +    </map>      <key>RenderGlowMaxExtractAlpha</key> -        <map> -        <key>Comment</key> -            <string>Max glow alpha value for brightness extraction to auto-glow.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.065</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Max glow alpha value for brightness extraction to auto-glow.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.065</real> +    </map>      <key>RenderGlowMinLuminance</key> -        <map> -        <key>Comment</key> -            <string>Min luminance intensity necessary to consider an object bright enough to automatically glow. (Gets clamped to 0 - 1.0 range)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1.0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Min luminance intensity necessary to consider an object bright enough to automatically glow. (Gets clamped to 0 - 1.0 range)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderGlowResolutionPow</key> -        <map> -        <key>Comment</key> -            <string>Glow map resolution power of two.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>9</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Glow map resolution power of two.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>9</integer> +    </map>      <key>RenderGlowStrength</key> -        <map> -        <key>Comment</key> -            <string>Additive strength of glow.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.35</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Additive strength of glow.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.35</real> +    </map>      <key>RenderGlowWarmthAmount</key> -        <map> -        <key>Comment</key> -            <string>Amount of warmth extraction to use (versus luminance extraction). 0 = lum, 1.0 = warmth</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Amount of warmth extraction to use (versus luminance extraction). 0 = lum, 1.0 = warmth</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map>      <key>RenderGlowWarmthWeights</key> -        <map> -        <key>Comment</key> -            <string>Weight of each color channel used before finding the max warmth</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3</string> -        <key>Value</key> -            <array> -                <real>1.0</real> -                <real>0.5</real> -                <real>0.7</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Weight of each color channel used before finding the max warmth</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.5</real> +        <real>0.7</real> +      </array> +    </map>      <key>RenderGlowWidth</key> -        <map> -        <key>Comment</key> -            <string>Glow sample size (higher = wider and softer but eventually more pixelated)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1.3</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Glow sample size (higher = wider and softer but eventually more pixelated)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.3</real> +    </map>      <key>RenderHUDInSnapshot</key> -        <map> -        <key>Comment</key> -            <string>Display HUD attachments in snapshot</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display HUD attachments in snapshot</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderHiddenSelections</key> -        <map> -        <key>Comment</key> -            <string>Show selection lines on objects that are behind other objects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show selection lines on objects that are behind other objects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderHideGroupTitle</key> -        <map> -        <key>Comment</key> -            <string>Don't show my group title in my name label</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Don't show my group title in my name label</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderHideGroupTitleAll</key> -        <map> -        <key>Comment</key> -            <string>Show group titles in name labels</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show group titles in name labels</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderInitError</key> -        <map> -        <key>Comment</key> -            <string>Error occured while initializing GL</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Error occured while initializing GL</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderLightRadius</key> -        <map> -        <key>Comment</key> -            <string>Render the radius of selected lights</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Render the radius of selected lights</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderLightingDetail</key> -        <map> -        <key>Comment</key> -            <string>Amount of detail for lighting objects/avatars/terrain (0=sun/moon only, 1=enable local lights)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Amount of detail for lighting objects/avatars/terrain (0=sun/moon only, 1=enable local lights)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderMaxPartCount</key> -        <map> -        <key>Comment</key> -            <string>Maximum number of particles to display on screen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>4096</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum number of particles to display on screen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>4096</integer> +    </map>      <key>RenderMaxVBOSize</key> -        <map> -        <key>Comment</key> -            <string>Maximum size of a vertex buffer (in KB).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>32</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum size of a vertex buffer (in KB).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>32</integer> +    </map>      <key>RenderName</key> -        <map> -        <key>Comment</key> -            <string>Controls display of names above avatars (0 = never, 1 = fade, 2 = always)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls display of names above avatars (0 = never, 1 = fade, 2 = always)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>      <key>RenderNameFadeDuration</key> -        <map> -        <key>Comment</key> -            <string>Time interval over which to fade avatar names (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Time interval over which to fade avatar names (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderNameHideSelf</key> -        <map> -        <key>Comment</key> -            <string>Don't display own name above avatar</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Don't display own name above avatar</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderNameShowTime</key> -        <map> -        <key>Comment</key> -            <string>Fade avatar names after specified time (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>10</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Fade avatar names after specified time (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>10.0</real> +    </map>      <key>RenderObjectBump</key> -        <map> -        <key>Comment</key> -            <string>Show bumpmapping on primitives</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show bumpmapping on primitives</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderQualityPerformance</key> -        <map> -        <key>Comment</key> -            <string>Which graphics settings you've chosen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Which graphics settings you've chosen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderReflectionDetail</key> -        <map> -        <key>Comment</key> -            <string>Detail of reflection render pass.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Detail of reflection render pass.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>      <key>RenderReflectionRes</key> -        <map> -        <key>Comment</key> -            <string>Reflection map resolution.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>64</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Reflection map resolution.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>64</integer> +    </map>      <key>RenderResolutionDivisor</key> -        <map> -        <key>Comment</key> -            <string>Divisor for rendering 3D scene at reduced resolution.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Divisor for rendering 3D scene at reduced resolution.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderShaderLODThreshold</key> -        <map> -        <key>Comment</key> -            <string>Fraction of draw distance defining the switch to a different shader LOD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <integer>1.0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Fraction of draw distance defining the switch to a different shader LOD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>RenderShaderParticleThreshold</key> +    <map> +      <key>Comment</key> +      <string>Fraction of draw distance to not use shader on particles</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.25</real> +    </map>      <key>RenderSunDynamicRange</key> -        <map> -        <key>Comment</key> -            <string>Defines what percent brighter the sun is than local point lights (1.0 = 100% brighter. Value should not be less than 0. ).</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <integer>1.0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Defines what percent brighter the sun is than local point lights (1.0 = 100% brighter. Value should not be less than 0. ).</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderTerrainDetail</key> -        <map> -        <key>Comment</key> -            <string>Detail applied to terrain texturing (0 = none, 1 or 2 = full)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Detail applied to terrain texturing (0 = none, 1 or 2 = full)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>      <key>RenderTerrainLODFactor</key> -        <map> -        <key>Comment</key> -            <string>Controls level of detail of terrain (multiplier for current screen area when calculated level of detail)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1.0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls level of detail of terrain (multiplier for current screen area when calculated level of detail)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderTerrainScale</key> -        <map> -        <key>Comment</key> -            <string>Terrain detail texture scale</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>12</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Terrain detail texture scale</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>12.0</real> +    </map> +    <key>RenderTextureMemoryMultiple</key> +    <map> +      <key>Comment</key> +      <string>Multiple of texture memory value to use (should fit: 0 < value <= 1.0)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderTreeLODFactor</key> -        <map> -        <key>Comment</key> -            <string>Controls level of detail of vegetation (multiplier for current screen area when calculated level of detail)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls level of detail of vegetation (multiplier for current screen area when calculated level of detail)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>RenderUIInSnapshot</key> -        <map> -        <key>Comment</key> -            <string>Display user interface in snapshot</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>RenderUseFarClip</key> -        <map> -        <key>Comment</key> -            <string>If false, frustum culling will ignore far clip plane.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display user interface in snapshot</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>RenderUnloadedAvatar</key> +    <map> +      <key>Comment</key> +      <string>Show avatars which haven't finished loading</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderUseFBO</key> -        <map> -        <key>Comment</key> -            <string>Whether we want to use GL_EXT_framebuffer_objects.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether we want to use GL_EXT_framebuffer_objects.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>RenderUseFarClip</key> +    <map> +      <key>Comment</key> +      <string>If false, frustum culling will ignore far clip plane.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderUseImpostors</key> -        <map> -        <key>Comment</key> -            <string>Whether we want to use impostors for far away avatars.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether we want to use impostors for far away avatars.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderUseShaderLOD</key> -        <map> -        <key>Comment</key> -            <string>Whether we want to have different shaders for LOD</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether we want to have different shaders for LOD</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderUseShaderNearParticles</key> -        <map> -        <key>Comment</key> -            <string>Whether we want to use shaders on near particles</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>RenderShaderParticleThreshold</key> -        <map> -        <key>Comment</key> -            <string>Fraction of draw distance to not use shader on particles</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.25</real> -        </map> -    <key>RenderUnloadedAvatar</key> -        <map> -        <key>Comment</key> -            <string>Show avatars which haven't finished loading</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether we want to use shaders on near particles</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RenderVBOEnable</key> -        <map> -        <key>Comment</key> -            <string>Use GL Vertex Buffer Objects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use GL Vertex Buffer Objects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderVolumeLODFactor</key> -        <map> -        <key>Comment</key> -            <string>Controls level of detail of primitives (multiplier for current screen area when calculated level of detail)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls level of detail of primitives (multiplier for current screen area when calculated level of detail)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RenderWater</key> -        <map> -        <key>Comment</key> -            <string>Display water</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display water</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderWaterMipNormal</key> -        <map> -        <key>Comment</key> -            <string>Use mip maps for water normal map.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -    <key>RenderWaterReflections</key> -        <map> -        <key>Comment</key> -            <string>Reflect the environment in the water.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use mip maps for water normal map.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>RenderWaterRefResolution</key> -        <map> -        <key>Comment</key> -            <string>Water planar reflection resolution.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>512</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Water planar reflection resolution.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>512</integer> +    </map> +    <key>RenderWaterReflections</key> +    <map> +      <key>Comment</key> +      <string>Reflect the environment in the water.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RotateRight</key> -        <map> -        <key>Comment</key> -            <string>Make the agent rotate to its right.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Make the agent rotate to its right.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RotationStep</key> -        <map> -        <key>Comment</key> -            <string>All rotations via rotation tool are constrained to multiples of this unit (degrees)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>All rotations via rotation tool are constrained to multiples of this unit (degrees)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>RunBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>RunMultipleThreads</key> -        <map> -        <key>Comment</key> -            <string>If TRUE keep background threads active during render</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>If TRUE keep background threads active during render</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SafeMode</key> -        <map> -        <key>Comment</key> -            <string>Reset preferences, run in safe mode.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Reset preferences, run in safe mode.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SaveMinidump</key> -        <map> -        <key>Comment</key> -            <string>Save minidump for developer debugging on crash</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Save minidump for developer debugging on crash</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ScaleShowAxes</key> -        <map> -        <key>Comment</key> -            <string>Show indicator of selected scale axis when scaling</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show indicator of selected scale axis when scaling</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ScaleStretchTextures</key> -        <map> -        <key>Comment</key> -            <string>Stretch textures along with object when scaling</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Stretch textures along with object when scaling</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ScaleUniform</key> -        <map> -        <key>Comment</key> -            <string>Scale selected objects evenly about center of selection</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Scale selected objects evenly about center of selection</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ScriptErrorColor</key> -        <map> -        <key>Comment</key> -            <string>Color of script error messages</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.8235294117</real> -                <real>0.2745098039</real> -                <real>0.2745098039</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of script error messages</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.8235294117</real> +        <real>0.2745098039</real> +        <real>0.2745098039</real> +        <real>1.0</real> +      </array> +    </map>      <key>ScriptErrorsAsChat</key> -        <map> -        <key>Comment</key> -            <string>Display script errors and warning in chat history</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display script errors and warning in chat history</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ScriptHelpFollowsCursor</key> -        <map> -        <key>Comment</key> -            <string>Scripting help window updates contents based on script editor contents under text cursor</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Scripting help window updates contents based on script editor contents under text cursor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SearchURLDefault</key> -        <map> -        <key>Comment</key> -            <string>URL to load for empty searches</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>http://secondlife.com/app/search/index.php?</string> -        </map> +    <map> +      <key>Comment</key> +      <string>URL to load for empty searches</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://secondlife.com/app/search/index.php?</string> +    </map>      <key>SearchURLQuery</key> -        <map> -        <key>Comment</key> -            <string>URL to use for searches</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&s=[COLLECTION]&</string> -        </map> +    <map> +      <key>Comment</key> +      <string>URL to use for searches</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&s=[COLLECTION]&</string> +    </map>      <key>SearchURLSuffix2</key> -        <map> -        <key>Comment</key> -            <string>Parameters added to end of search queries</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>lang=[LANG]&m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Parameters added to end of search queries</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>lang=[LANG]&m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]</string> +    </map>      <key>SelectMovableOnly</key> -        <map> -        <key>Comment</key> -            <string>Select only objects you can move</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Select only objects you can move</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SelectOwnedOnly</key> -        <map> -        <key>Comment</key> -            <string>Select only objects you own</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Select only objects you own</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SelectionHighlightAlpha</key> -        <map> -        <key>Comment</key> -            <string>Opacity of selection highlight (0.0 = completely transparent, 1.0 = completely opaque)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.4000000059604644775390625</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Opacity of selection highlight (0.0 = completely transparent, 1.0 = completely opaque)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.40000000596</real> +    </map>      <key>SelectionHighlightAlphaTest</key> -        <map> -        <key>Comment</key> -            <string>Alpha value below which pixels are displayed on selection highlight line (0.0 = show all pixels, 1.0 = show now pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Alpha value below which pixels are displayed on selection highlight line (0.0 = show all pixels, 1.0 = show now pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>SelectionHighlightThickness</key> -        <map> -        <key>Comment</key> -            <string>Thickness of selection highlight line (fraction of view distance)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.009999999776482582092285156</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Thickness of selection highlight line (fraction of view distance)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.00999999977648</real> +    </map>      <key>SelectionHighlightUAnim</key> -        <map> -        <key>Comment</key> -            <string>Rate at which texture animates along U direction in selection highlight line (fraction of texture per second)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Rate at which texture animates along U direction in selection highlight line (fraction of texture per second)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map>      <key>SelectionHighlightUScale</key> -        <map> -        <key>Comment</key> -            <string>Scale of texture display on selection highlight line (fraction of texture size)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Scale of texture display on selection highlight line (fraction of texture size)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.1</real> +    </map>      <key>SelectionHighlightVAnim</key> -        <map> -        <key>Comment</key> -            <string>Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.5</real> +    </map>      <key>SelectionHighlightVScale</key> -        <map> -        <key>Comment</key> -            <string>Scale of texture display on selection highlight line (fraction of texture size)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Scale of texture display on selection highlight line (fraction of texture size)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>ServerChoice</key> -        <map> -        <key>Comment</key> -            <string>[DO NOT MODIFY] Controls which grid you connect to</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -    <key>ShowAllObjectHoverTip</key> -        <map> -        <key>Comment</key> -            <string>Show descriptive tooltip when mouse hovers over non-interactive and interactive objects.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[DO NOT MODIFY] Controls which grid you connect to</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowActiveSpeakers</key> -        <map> -        <key>Comment</key> -            <string>Display active speakers list on login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display active speakers list on login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>ShowAllObjectHoverTip</key> +    <map> +      <key>Comment</key> +      <string>Show descriptive tooltip when mouse hovers over non-interactive and interactive objects.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowAxes</key> -        <map> -        <key>Comment</key> -            <string>Render coordinate frame at your position</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Render coordinate frame at your position</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowCameraControls</key> -        <map> -        <key>Comment</key> -            <string>Display camera controls on login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display camera controls on login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowChatHistory</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowCommunicate</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</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> +    <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>ShowCrosshairs</key> -        <map> -        <key>Comment</key> -            <string>Display crosshairs when in mouselook mode</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display crosshairs when in mouselook mode</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowDebugConsole</key> -        <map> -        <key>Comment</key> -            <string>Show log in SL window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show log in SL window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowDebugStats</key> -        <map> -        <key>Comment</key> -            <string>Show performance stats display</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show performance stats display</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowDepthBuffer</key> -        <map> -        <key>Comment</key> -            <string>Show depth buffer contents</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show depth buffer contents</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowDirectory</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowEmptyFoldersWhenSearching</key> -        <map> -        <key>Comment</key> -            <string>Shows folders that do not have any visible contents when applying a filter to inventory</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Shows folders that do not have any visible contents when applying a filter to inventory</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowHoverTips</key> -        <map> -        <key>Comment</key> -            <string>Show descriptive tooltip when mouse hovers over items in world</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show descriptive tooltip when mouse hovers over items in world</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowInventory</key> -        <map> -        <key>Comment</key> -            <string>Open inventory window on login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Open inventory window on login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowLandHoverTip</key> -        <map> -        <key>Comment</key> -            <string>Show descriptive tooltip when mouse hovers over land</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show descriptive tooltip when mouse hovers over land</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowLeaders</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowMatureClassifieds</key> -        <map> -        <key>Comment</key> -            <string>Display results of find classifieds that are flagged as mature</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display results of find classifieds that are flagged as mature</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowMatureEvents</key> -        <map> -        <key>Comment</key> -            <string>Display results of find events that are flagged as mature</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display results of find events that are flagged as mature</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowMatureFindAll</key> -        <map> -        <key>Comment</key> -            <string>Display results of find all that are in mature sims</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display results of find all that are in mature sims</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowMatureGroups</key> -        <map> -        <key>Comment</key> -            <string>Display results of find groups that are in flagged as mature</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display results of find groups that are in flagged as mature</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowMatureSims</key> -        <map> -        <key>Comment</key> -            <string>Display results of find places or find popular that are in mature sims</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display results of find places or find popular that are in mature sims</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowMiniMap</key> -        <map> -        <key>Comment</key> -            <string>Display mini map on login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display mini map on login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowMovementControls</key> -        <map> -        <key>Comment</key> -            <string>Display movement controls on login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display movement controls on login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowNearClip</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowNewInventory</key> -        <map> -        <key>Comment</key> -            <string>Automatically views new notecards/textures/landmarks</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Automatically views new notecards/textures/landmarks</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowObjectUpdates</key> -        <map> -        <key>Comment</key> -            <string>Show when update messages are received for individual objects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show when update messages are received for individual objects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowOverlayTitle</key> -        <map> -        <key>Comment</key> -            <string>Prints watermark text message on screen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Prints watermark text message on screen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowParcelOwners</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowPermissions</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowPropertyLines</key> -        <map> -        <key>Comment</key> -            <string>Show line overlay demarking property boundaries</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show line overlay demarking property boundaries</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowSearchBar</key> -        <map> -        <key>Comment</key> -            <string>Show the Search Bar in the Status Overlay</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show the Search Bar in the Status Overlay</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowSelectionBeam</key> -        <map> -        <key>Comment</key> -            <string>Show selection particle beam when selecting or interacting with objects.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show selection particle beam when selecting or interacting with objects.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowStartLocation</key> -        <map> -        <key>Comment</key> -            <string>Display starting location menu on login screen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display starting location menu on login screen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowTangentBasis</key> -        <map> -        <key>Comment</key> -            <string>Render normal and binormal (debugging bump mapping)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Render normal and binormal (debugging bump mapping)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowToolBar</key> -        <map> -        <key>Comment</key> -            <string>Show toolbar at bottom of screen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show toolbar at bottom of screen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ShowTools</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowVoiceChannelPopup</key> -        <map> -        <key>Comment</key> -            <string>Controls visibility of the current voice channel popup above the voice tab</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls visibility of the current voice channel popup above the voice tab</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowVolumeSettingsPopup</key> -        <map> -        <key>Comment</key> -            <string>Show individual volume slider for voice, sound effects, etc</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show individual volume slider for voice, sound effects, etc</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowWorldMap</key> -        <map> -        <key>Comment</key> -            <string>Display world map on login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display world map on login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowXUINames</key> -        <map> -        <key>Comment</key> -            <string>Display XUI Names as Tooltips</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display XUI Names as Tooltips</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SitBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SkinFolder</key> -        <map> -        <key>Comment</key> -            <string>The skin folder to use.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>The skin folder to use.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>SkyAmbientScale</key> -        <map> -        <key>Comment</key> -            <string>Controls strength of ambient, or non-directional light from the sun and moon (fraction or multiple of default ambient level)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.300000011920928955078125</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls strength of ambient, or non-directional light from the sun and moon (fraction or multiple of default ambient level)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.300000011921</real> +    </map> +    <key>SkyEditPresets</key> +    <map> +      <key>Comment</key> +      <string>Whether to be able to edit the sky defaults or not</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SkyNightColorShift</key> -        <map> -        <key>Comment</key> -            <string>Controls moonlight color (base color applied to moon as light source)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color3</string> -        <key>Value</key> -            <array> -                <real>0.699999988079071044921875</real> -                <real>0.699999988079071044921875</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls moonlight color (base color applied to moon as light source)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color3</string> +      <key>Value</key> +      <array> +        <real>0.699999988079</real> +        <real>0.699999988079</real> +        <real>1.0</real> +      </array> +    </map>      <key>SkyOverrideSimSunPosition</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SkySunDefaultPosition</key> -        <map> -        <key>Comment</key> -            <string>Default position of sun in sky (direction in world coordinates)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Vector3</string> -        <key>Value</key> -            <array> -                <real>1</real> -                <real>0</real> -                <real>0.1</real> -            </array> -        </map> -	<key>SkyUseClassicClouds</key> -		<map> -		<key>Comment</key> -			<string>Whether to use the old Second Life particle clouds or not</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<integer>1</integer> -		</map> +    <map> +      <key>Comment</key> +      <string>Default position of sun in sky (direction in world coordinates)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Vector3</string> +      <key>Value</key> +      <array> +        <real>1.0</real> +        <real>0.0</real> +        <real>0.1</real> +      </array> +    </map> +    <key>SkyUseClassicClouds</key> +    <map> +      <key>Comment</key> +      <string>Whether to use the old Second Life particle clouds or not</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>SlideLeftBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>20</integer> -                <integer>54</integer> -                <integer>45</integer> -                <integer>29</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>20</integer> +        <integer>54</integer> +        <integer>45</integer> +        <integer>29</integer> +      </array> +    </map>      <key>SlideRightBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>66</integer> -                <integer>54</integer> -                <integer>91</integer> -                <integer>29</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>66</integer> +        <integer>54</integer> +        <integer>91</integer> +        <integer>29</integer> +      </array> +    </map>      <key>SmallAvatarNames</key> -        <map> -        <key>Comment</key> -            <string>Display avatar name text in smaller font</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display avatar name text in smaller font</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>SnapEnabled</key> -        <map> -        <key>Comment</key> -            <string>Enable snapping to grid</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable snapping to grid</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>SnapMargin</key> -        <map> -        <key>Comment</key> -            <string>Controls maximum distance between windows before they auto-snap together (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>10</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Controls maximum distance between windows before they auto-snap together (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>10</integer> +    </map>      <key>SnapToMouseCursor</key> -        <map> -        <key>Comment</key> -            <string>When snapping to grid, center object on nearest grid point to mouse cursor</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>When snapping to grid, center object on nearest grid point to mouse cursor</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SnapshotLocalLastResolution</key> -        <map> -        <key>Comment</key> -            <string>Take next local snapshot at this resolution</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Take next local snapshot at this resolution</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SnapshotPostcardLastResolution</key> -        <map> -        <key>Comment</key> -            <string>Take next postcard snapshot at this resolution</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Take next postcard snapshot at this resolution</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SnapshotQuality</key> -        <map> -        <key>Comment</key> -            <string>Quality setting of postcard JPEGs (0 = worst, 100 = best)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>75</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Quality setting of postcard JPEGs (0 = worst, 100 = best)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>75</integer> +    </map>      <key>SnapshotTextureLastResolution</key> -        <map> -        <key>Comment</key> -            <string>Take next texture snapshot at this resolution</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Take next texture snapshot at this resolution</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>SpeakingColor</key> -        <map> -        <key>Comment</key> -            <string>Color of various indicators when resident is speaking on a voice channel.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0</real> -                <real>1</real> -                <real>0</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of various indicators when resident is speaking on a voice channel.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.0</real> +        <real>1.0</real> +        <real>0.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>SpeedTest</key> -        <map> -        <key>Comment</key> -            <string>Performance testing mode, no network</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Performance testing mode, no network</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>StatsAutoRun</key> -        <map> -        <key>Comment</key> -            <string>Play back autopilot</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Play back autopilot</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>StatsFile</key> -        <map> -        <key>Comment</key> -            <string>Filename for stats logging output</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>fs.txt</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Filename for stats logging output</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>fs.txt</string> +    </map>      <key>StatsNumRuns</key> -        <map> -        <key>Comment</key> -            <string>Loop autopilot playback this number of times</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>-1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Loop autopilot playback this number of times</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>-1</integer> +    </map>      <key>StatsPilotFile</key> -        <map> -        <key>Comment</key> -            <string>Filename for stats logging autopilot path</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>pilot.txt</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Filename for stats logging autopilot path</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>pilot.txt</string> +    </map>      <key>StatsQuitAfterRuns</key> -        <map> -        <key>Comment</key> -            <string>Quit application after this number of autopilot playback runs</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Quit application after this number of autopilot playback runs</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>StatsSessionTrackFrameStats</key> -        <map> -        <key>Comment</key> -            <string>Track rendering and network statistics</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Track rendering and network statistics</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>StatsSummaryFile</key> -        <map> -        <key>Comment</key> -            <string>Filename for stats logging summary</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>fss.txt</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Filename for stats logging summary</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>fss.txt</string> +    </map>      <key>StatusBarHeight</key> -        <map> -        <key>Comment</key> -            <string>Height of menu/status bar at top of screen (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>26</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Height of menu/status bar at top of screen (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>26</integer> +    </map>      <key>StatusBarPad</key> -        <map> -        <key>Comment</key> -            <string>Spacing between popup buttons at bottom of screen (Stand up, Release Controls)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>10</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Spacing between popup buttons at bottom of screen (Stand up, Release Controls)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>10</integer> +    </map>      <key>SystemChatColor</key> -        <map> -        <key>Comment</key> -            <string>Color of chat messages from SL System</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.800000011920928955078125</real> -                <real>1</real> -                <real>1</real> -                <real>1</real> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of chat messages from SL System</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.800000011921</real> +        <real>1.0</real> +        <real>1.0</real> +        <real>1.0</real> +      </array> +    </map>      <key>SystemLanguage</key> -        <map> -        <key>Comment</key> -            <string>Language indicated by system settings (for XUI)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>en-us</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Language indicated by system settings (for XUI)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>en-us</string> +    </map>      <key>TabToTextFieldsOnly</key> -        <map> -        <key>Comment</key> -            <string>TAB key takes you to next text entry field, instead of next widget</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>TAB key takes you to next text entry field, instead of next widget</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>TerrainColorHeightRange</key> -        <map> -        <key>Comment</key> -            <string>Altitude range over which a given terrain texture has effect (meters)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>60</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Altitude range over which a given terrain texture has effect (meters)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>60.0</real> +    </map>      <key>TerrainColorStartHeight</key> -        <map> -        <key>Comment</key> -            <string>Starting altitude for terrain texturing (meters)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>20</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Starting altitude for terrain texturing (meters)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>20.0</real> +    </map>      <key>TextureMemory</key> -        <map> -        <key>Comment</key> -            <string>Amount of memory to use for textures in MB (0 = autodetect)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Amount of memory to use for textures in MB (0 = autodetect)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>TexturePickerRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for texture picker</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>290</integer> -                <integer>350</integer> -                <integer>0</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for texture picker</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>290</integer> +        <integer>350</integer> +        <integer>0</integer> +      </array> +    </map>      <key>TexturePickerShowFolders</key> -        <map> -        <key>Comment</key> -            <string>Show folders with no texures in texture picker</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show folders with no texures in texture picker</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>TexturePickerSortOrder</key> -        <map> -        <key>Comment</key> -            <string>Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>2</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>2</integer> +    </map>      <key>ThirdPersonBtnState</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>ThrottleBandwidthKBPS</key> -        <map> -        <key>Comment</key> -            <string>Maximum allowable downstream bandwidth (kilo bits per second)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>500</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum allowable downstream bandwidth (kilo bits per second)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>500.0</real> +    </map>      <key>ToolHelpRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>8</integer> -                <integer>178</integer> -                <integer>75</integer> -                <integer>162</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>8</integer> +        <integer>178</integer> +        <integer>75</integer> +        <integer>162</integer> +      </array> +    </map>      <key>ToolTipDelay</key> -        <map> -        <key>Comment</key> -            <string>Seconds before displaying tooltip when mouse stops over UI element</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.699999988079071044921875</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Seconds before displaying tooltip when mouse stops over UI element</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.699999988079</real> +    </map>      <key>ToolboxAutoMove</key> -        <map> -        <key>Comment</key> -            <string>[NOT USED]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[NOT USED]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ToolboxRect</key> -        <map> -        <key>Comment</key> -            <string>Rectangle for tools window</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>0</integer> -                <integer>100</integer> -                <integer>100</integer> -                <integer>100</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string>Rectangle for tools window</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>0</integer> +        <integer>100</integer> +        <integer>100</integer> +        <integer>100</integer> +      </array> +    </map>      <key>ToolboxShowMore</key> -        <map> -        <key>Comment</key> -            <string>Whether to show additional build tool controls</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Whether to show additional build tool controls</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>TrackFocusObject</key> -        <map> -        <key>Comment</key> -            <string>Camera tracks last object zoomed on</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Camera tracks last object zoomed on</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>TurnLeftBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>20</integer> -                <integer>29</integer> -                <integer>45</integer> -                <integer>4</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>20</integer> +        <integer>29</integer> +        <integer>45</integer> +        <integer>4</integer> +      </array> +    </map>      <key>TurnRightBtnRect</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Rect</string> -        <key>Value</key> -            <array> -                <integer>66</integer> -                <integer>29</integer> -                <integer>91</integer> -                <integer>4</integer> -            </array> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Rect</string> +      <key>Value</key> +      <array> +        <integer>66</integer> +        <integer>29</integer> +        <integer>91</integer> +        <integer>4</integer> +      </array> +    </map>      <key>TypeAheadTimeout</key> -        <map> -        <key>Comment</key> -            <string>Time delay before clearing type-ahead buffer in lists (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1.5</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Time delay before clearing type-ahead buffer in lists (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.5</real> +    </map>      <key>UIAutoScale</key> -        <map> -        <key>Comment</key> -            <string>Keep UI scale consistent across different resolutions</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Keep UI scale consistent across different resolutions</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>UIFloaterTestBool</key> -        <map> -        <key>Comment</key> -            <string>Example saved setting for the test floater</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Example saved setting for the test floater</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UIImgBtnCloseActiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +    </map>      <key>UIImgBtnCloseInactiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>779e4fa3-9b13-f74a-fba9-3886fe9c86ba</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>779e4fa3-9b13-f74a-fba9-3886fe9c86ba</string> +    </map>      <key>UIImgBtnClosePressedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +    </map>      <key>UIImgBtnForwardInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>54197a61-f5d1-4c29-95d2-c071d08849cb</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>54197a61-f5d1-4c29-95d2-c071d08849cb</string> +    </map>      <key>UIImgBtnForwardOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>a0eb4021-1b20-4a53-892d-8faa9265a6f5</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>a0eb4021-1b20-4a53-892d-8faa9265a6f5</string> +    </map>      <key>UIImgBtnJumpLeftInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1</string> +    </map>      <key>UIImgBtnJumpLeftOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>3c18c87e-5f50-14e2-e744-f44734aa365f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>3c18c87e-5f50-14e2-e744-f44734aa365f</string> +    </map>      <key>UIImgBtnJumpRightInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7dabc040-ec13-2309-ddf7-4f161f6de2f4</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7dabc040-ec13-2309-ddf7-4f161f6de2f4</string> +    </map>      <key>UIImgBtnJumpRightOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>ff9a71eb-7414-4cf8-866e-a701deb7c3cf</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>ff9a71eb-7414-4cf8-866e-a701deb7c3cf</string> +    </map>      <key>UIImgBtnLeftInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>95463c78-aaa6-464d-892d-3a805b6bb7bf</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>95463c78-aaa6-464d-892d-3a805b6bb7bf</string> +    </map>      <key>UIImgBtnLeftOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>13a93910-6b44-45eb-ad3a-4d1324c59bac</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>13a93910-6b44-45eb-ad3a-4d1324c59bac</string> +    </map>      <key>UIImgBtnMinimizeActiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>34c9398d-bb78-4643-9633-46a2fa3e9637</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>34c9398d-bb78-4643-9633-46a2fa3e9637</string> +    </map>      <key>UIImgBtnMinimizeInactiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>6e72abba-1378-437f-bf7a-f0c15f3e99a3</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>6e72abba-1378-437f-bf7a-f0c15f3e99a3</string> +    </map>      <key>UIImgBtnMinimizePressedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>39801651-26cb-4926-af57-7af9352c273c</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>39801651-26cb-4926-af57-7af9352c273c</string> +    </map>      <key>UIImgBtnMoveDownInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>b92a70b9-c841-4c94-b4b3-cee9eb460d48</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>b92a70b9-c841-4c94-b4b3-cee9eb460d48</string> +    </map>      <key>UIImgBtnMoveDownOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>b5abc9fa-9e62-4e03-bc33-82c4c1b6b689</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>b5abc9fa-9e62-4e03-bc33-82c4c1b6b689</string> +    </map>      <key>UIImgBtnMoveUpInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>49b4b357-e430-4b56-b9e0-05b8759c3c82</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>49b4b357-e430-4b56-b9e0-05b8759c3c82</string> +    </map>      <key>UIImgBtnMoveUpOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>f887146d-829f-4e39-9211-cf872b78f97c</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>f887146d-829f-4e39-9211-cf872b78f97c</string> +    </map>      <key>UIImgBtnPanDownInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +    </map>      <key>UIImgBtnPanDownOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +    </map>      <key>UIImgBtnPanLeftInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +    </map>      <key>UIImgBtnPanLeftOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +    </map>      <key>UIImgBtnPanRightInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +    </map>      <key>UIImgBtnPanRightOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +    </map>      <key>UIImgBtnPanUpInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +    </map>      <key>UIImgBtnPanUpOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +    </map>      <key>UIImgBtnRestoreActiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>111b39de-8928-4690-b7b2-e17d5c960277</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>111b39de-8928-4690-b7b2-e17d5c960277</string> +    </map>      <key>UIImgBtnRestoreInactiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>0eafa471-70af-4882-b8c1-40a310929744</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>0eafa471-70af-4882-b8c1-40a310929744</string> +    </map>      <key>UIImgBtnRestorePressedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>90a0ed5c-2e7b-4845-9958-a64a1b30f312</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>90a0ed5c-2e7b-4845-9958-a64a1b30f312</string> +    </map>      <key>UIImgBtnRightInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5e616d0d-4335-476f-9977-560bccd009da</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5e616d0d-4335-476f-9977-560bccd009da</string> +    </map>      <key>UIImgBtnRightOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5a44fd04-f52b-4c30-8b00-4a31e27614bd</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5a44fd04-f52b-4c30-8b00-4a31e27614bd</string> +    </map>      <key>UIImgBtnScrollDownInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>d2421bab-2eaf-4863-b8f6-5e4c52519247</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>d2421bab-2eaf-4863-b8f6-5e4c52519247</string> +    </map>      <key>UIImgBtnScrollDownOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>b4ecdecf-5c8d-44e7-b882-17a77e88ed55</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>b4ecdecf-5c8d-44e7-b882-17a77e88ed55</string> +    </map>      <key>UIImgBtnScrollLeftInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>ea137a32-6718-4d05-9c22-7d570d27b2cd</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>ea137a32-6718-4d05-9c22-7d570d27b2cd</string> +    </map>      <key>UIImgBtnScrollLeftOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>43773e8d-49aa-48e0-80f3-a04715f4677a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>43773e8d-49aa-48e0-80f3-a04715f4677a</string> +    </map>      <key>UIImgBtnScrollRightInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>b749de64-e903-4c3c-ac0b-25fb6fa39cb5</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>b749de64-e903-4c3c-ac0b-25fb6fa39cb5</string> +    </map>      <key>UIImgBtnScrollRightOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>3d700d19-e708-465d-87f2-46c8c0ee7938</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>3d700d19-e708-465d-87f2-46c8c0ee7938</string> +    </map>      <key>UIImgBtnScrollUpInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>a93abdf3-27b5-4e22-a8fa-c48216cd2e3a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>a93abdf3-27b5-4e22-a8fa-c48216cd2e3a</string> +    </map>      <key>UIImgBtnScrollUpOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>dad084d7-9a46-452a-b0ff-4b9f1cefdde9</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>dad084d7-9a46-452a-b0ff-4b9f1cefdde9</string> +    </map>      <key>UIImgBtnSlideLeftInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>724996f5-b956-46f6-9844-4fcfce1d5e83</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>724996f5-b956-46f6-9844-4fcfce1d5e83</string> +    </map>      <key>UIImgBtnSlideLeftOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>82476321-0374-4c26-9567-521535ab4cd7</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>82476321-0374-4c26-9567-521535ab4cd7</string> +    </map>      <key>UIImgBtnSlideRightInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7eeb57d2-3f37-454d-a729-8b217b8be443</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7eeb57d2-3f37-454d-a729-8b217b8be443</string> +    </map>      <key>UIImgBtnSlideRightOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>1fbe4e60-0607-44d1-a50a-032eff56ae75</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>1fbe4e60-0607-44d1-a50a-032eff56ae75</string> +    </map>      <key>UIImgBtnSpinDownInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>a985ac71-052f-48e6-9c33-d931c813ac92</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>a985ac71-052f-48e6-9c33-d931c813ac92</string> +    </map>      <key>UIImgBtnSpinDownOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>b6d240dd-5602-426f-b606-bbb49a30726d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>b6d240dd-5602-426f-b606-bbb49a30726d</string> +    </map>      <key>UIImgBtnSpinUpInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c8450082-96a0-4319-8090-d3ff900b4954</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c8450082-96a0-4319-8090-d3ff900b4954</string> +    </map>      <key>UIImgBtnSpinUpOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>56576e6e-6710-4e66-89f9-471b59122794</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>56576e6e-6710-4e66-89f9-471b59122794</string> +    </map>      <key>UIImgBtnTabBottomInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c001d8fd-a869-4b6f-86a1-fdcb106df9c7</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c001d8fd-a869-4b6f-86a1-fdcb106df9c7</string> +    </map>      <key>UIImgBtnTabBottomOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>bf0a8779-689b-48c3-bb9a-6af546366ef4</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>bf0a8779-689b-48c3-bb9a-6af546366ef4</string> +    </map>      <key>UIImgBtnTabBottomPartialInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>eb0b0904-8c91-4f24-b500-1180b91140de</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>eb0b0904-8c91-4f24-b500-1180b91140de</string> +    </map>      <key>UIImgBtnTabBottomPartialOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>8dca716c-b29c-403a-9886-91c028357d6e</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>8dca716c-b29c-403a-9886-91c028357d6e</string> +    </map>      <key>UIImgBtnTabTopInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>16d032e8-817b-4368-8a4e-b7b947ae3889</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>16d032e8-817b-4368-8a4e-b7b947ae3889</string> +    </map>      <key>UIImgBtnTabTopOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>1ed83f57-41cf-4052-a3b4-2e8bb78d8191</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>1ed83f57-41cf-4052-a3b4-2e8bb78d8191</string> +    </map>      <key>UIImgBtnTabTopPartialInUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7c6c6c26-0e25-4438-89bd-30d8b8e9d704</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7c6c6c26-0e25-4438-89bd-30d8b8e9d704</string> +    </map>      <key>UIImgBtnTabTopPartialOutUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>932ad585-0e45-4a57-aa23-4cf81beeb7b0</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>932ad585-0e45-4a57-aa23-4cf81beeb7b0</string> +    </map>      <key>UIImgBtnTearOffActiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string> +    </map>      <key>UIImgBtnTearOffInactiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string> +    </map>      <key>UIImgBtnTearOffPressedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>d2524c13-4ba6-af7c-e305-8ac6cc18d86a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>d2524c13-4ba6-af7c-e305-8ac6cc18d86a</string> +    </map>      <key>UIImgCheckboxActiveSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>cf4a2ed7-1533-4686-9dde-df9a37ddca55</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>cf4a2ed7-1533-4686-9dde-df9a37ddca55</string> +    </map>      <key>UIImgCheckboxActiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>05bb64ee-96fd-4243-b74e-f40a41bc53ba</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>05bb64ee-96fd-4243-b74e-f40a41bc53ba</string> +    </map>      <key>UIImgCheckboxInactiveSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c817c642-9abd-4236-9287-ae0513fe7d2b</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c817c642-9abd-4236-9287-ae0513fe7d2b</string> +    </map>      <key>UIImgCheckboxInactiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7d94cb59-32a2-49bf-a516-9e5a2045f9d9</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7d94cb59-32a2-49bf-a516-9e5a2045f9d9</string> +    </map>      <key>UIImgCreateSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>0098b015-3daf-4cfe-a72f-915369ea97c2</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>0098b015-3daf-4cfe-a72f-915369ea97c2</string> +    </map>      <key>UIImgCreateUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b</string> +    </map>      <key>UIImgCrosshairsUUID</key> -        <map> -        <key>Comment</key> -            <string>Image to use for crosshair display (UUID texture reference)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>6e1a3980-bf2d-4274-8970-91e60d85fb52</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Image to use for crosshair display (UUID texture reference)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>6e1a3980-bf2d-4274-8970-91e60d85fb52</string> +    </map>      <key>UIImgDefaultEyesUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>6522e74d-1660-4e7f-b601-6f48c1659a77</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>6522e74d-1660-4e7f-b601-6f48c1659a77</string> +    </map>      <key>UIImgDefaultGlovesUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDefaultHairUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7ca39b4c-bd19-4699-aff7-f93fd03d3e7b</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7ca39b4c-bd19-4699-aff7-f93fd03d3e7b</string> +    </map>      <key>UIImgDefaultJacketUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDefaultPantsUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDefaultShirtUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDefaultShoesUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDefaultSkirtUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDefaultSocksUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDefaultUnderwearUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIImgDirectionArrowUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>586383e8-4d9b-4fba-9196-2b5938e79c2c</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>586383e8-4d9b-4fba-9196-2b5938e79c2c</string> +    </map>      <key>UIImgFaceSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>b4870163-6208-42a9-9801-93133bf9a6cd</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>b4870163-6208-42a9-9801-93133bf9a6cd</string> +    </map>      <key>UIImgFaceUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>ce15fd63-b0b6-463c-a37d-ea6393208b3e</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>ce15fd63-b0b6-463c-a37d-ea6393208b3e</string> +    </map>      <key>UIImgFocusSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>ab6a730e-ddfd-4982-9a32-c6de3de6d31d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>ab6a730e-ddfd-4982-9a32-c6de3de6d31d</string> +    </map>      <key>UIImgFocusUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>57bc39d1-288c-4519-aea6-6d1786a5c274</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>57bc39d1-288c-4519-aea6-6d1786a5c274</string> +    </map>      <key>UIImgGrabSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c1e21504-f136-451d-b8e9-929037812f1d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c1e21504-f136-451d-b8e9-929037812f1d</string> +    </map>      <key>UIImgGrabUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c63f124c-6340-4fbf-b59e-0869a44adb64</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c63f124c-6340-4fbf-b59e-0869a44adb64</string> +    </map>      <key>UIImgMoveSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>46f17c7b-8381-48c3-b628-6a406e060dd6</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>46f17c7b-8381-48c3-b628-6a406e060dd6</string> +    </map>      <key>UIImgMoveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>2fa5dc06-bcdd-4e09-a426-f9f262d4fa65</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>2fa5dc06-bcdd-4e09-a426-f9f262d4fa65</string> +    </map>      <key>UIImgRadioActiveSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>52f09e07-5816-4052-953c-94c6c10479b7</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>52f09e07-5816-4052-953c-94c6c10479b7</string> +    </map>      <key>UIImgRadioActiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7a1ba9b8-1047-4d1e-9cfc-bc478c80b63f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7a1ba9b8-1047-4d1e-9cfc-bc478c80b63f</string> +    </map>      <key>UIImgRadioInactiveSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>1975db39-aa29-4251-aea0-409ac09d414d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>1975db39-aa29-4251-aea0-409ac09d414d</string> +    </map>      <key>UIImgRadioInactiveUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>90688481-67ff-4af0-be69-4aa084bcad1e</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>90688481-67ff-4af0-be69-4aa084bcad1e</string> +    </map>      <key>UIImgResizeBottomRightUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>e3690e25-9690-4f6c-a745-e7dcd885285a</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>e3690e25-9690-4f6c-a745-e7dcd885285a</string> +    </map>      <key>UIImgRotateSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>cdfb7fde-0d13-418a-9d89-2bd91019fc95</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>cdfb7fde-0d13-418a-9d89-2bd91019fc95</string> +    </map>      <key>UIImgRotateUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c34b1eaa-aae3-4351-b082-e26c0b636779</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c34b1eaa-aae3-4351-b082-e26c0b636779</string> +    </map>      <key>UIImgScaleSelectedUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>55aa57ef-508a-47f7-8867-85d21c5a810d</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>55aa57ef-508a-47f7-8867-85d21c5a810d</string> +    </map>      <key>UIImgScaleUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>88a90fef-b448-4883-9344-ecf378a60433</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>88a90fef-b448-4883-9344-ecf378a60433</string> +    </map>      <key>UIImgWhiteUUID</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +    </map>      <key>UIScaleFactor</key> -        <map> -        <key>Comment</key> -            <string>Size of UI relative to default layout on 1024x768 screen</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Size of UI relative to default layout on 1024x768 screen</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>UISndAlert</key> -        <map> -        <key>Comment</key> -            <string>Sound file for alerts (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>ed124764-705d-d497-167a-182cd9fa2e6c</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for alerts (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>ed124764-705d-d497-167a-182cd9fa2e6c</string> +    </map>      <key>UISndBadKeystroke</key> -        <map> -        <key>Comment</key> -            <string>Sound file for invalid keystroke (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>2ca849ba-2885-4bc3-90ef-d4987a5b983a</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for invalid keystroke (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>2ca849ba-2885-4bc3-90ef-d4987a5b983a</string> +    </map>      <key>UISndClick</key> -        <map> -        <key>Comment</key> -            <string>Sound file for mouse click (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for mouse click (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string> +    </map>      <key>UISndClickRelease</key> -        <map> -        <key>Comment</key> -            <string>Sound file for mouse button release (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for mouse button release (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string> +    </map>      <key>UISndDebugSpamToggle</key> -        <map> -        <key>Comment</key> -            <string>Log UI sound effects as they are played</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Log UI sound effects as they are played</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UISndHealthReductionF</key> -        <map> -        <key>Comment</key> -            <string>Sound file for female pain (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>219c5d93-6c09-31c5-fb3f-c5fe7495c115</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for female pain (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>219c5d93-6c09-31c5-fb3f-c5fe7495c115</string> +    </map>      <key>UISndHealthReductionM</key> -        <map> -        <key>Comment</key> -            <string>Sound file for male pain (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>e057c244-5768-1056-c37e-1537454eeb62</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for male pain (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>e057c244-5768-1056-c37e-1537454eeb62</string> +    </map>      <key>UISndHealthReductionThreshold</key> -        <map> -        <key>Comment</key> -            <string>Amount of health reduction required to trigger "pain" sound</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>10</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Amount of health reduction required to trigger "pain" sound</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>10.0</real> +    </map>      <key>UISndInvalidOp</key> -        <map> -        <key>Comment</key> -            <string>Sound file for invalid operations (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>4174f859-0d3d-c517-c424-72923dc21f65</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for invalid operations (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>4174f859-0d3d-c517-c424-72923dc21f65</string> +    </map>      <key>UISndMoneyChangeDown</key> -        <map> -        <key>Comment</key> -            <string>Sound file for L$ balance increase (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>104974e3-dfda-428b-99ee-b0d4e748d3a3</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for L$ balance increase (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>104974e3-dfda-428b-99ee-b0d4e748d3a3</string> +    </map>      <key>UISndMoneyChangeThreshold</key> -        <map> -        <key>Comment</key> -            <string>Amount of change in L$ balance required to trigger "money" sound</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>50</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Amount of change in L$ balance required to trigger "money" sound</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>50.0</real> +    </map>      <key>UISndMoneyChangeUp</key> -        <map> -        <key>Comment</key> -            <string>Sound file for L$ balance decrease(uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>77a018af-098e-c037-51a6-178f05877c6f</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for L$ balance decrease(uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>77a018af-098e-c037-51a6-178f05877c6f</string> +    </map>      <key>UISndNewIncomingIMSession</key> -        <map> -        <key>Comment</key> -            <string>Sound file for new instant message session(uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>67cc2844-00f3-2b3c-b991-6418d01e1bb7</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for new instant message session(uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>67cc2844-00f3-2b3c-b991-6418d01e1bb7</string> +    </map>      <key>UISndObjectCreate</key> -        <map> -        <key>Comment</key> -            <string>Sound file for object creation (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>f4a0660f-5446-dea2-80b7-6482a082803c</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for object creation (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>f4a0660f-5446-dea2-80b7-6482a082803c</string> +    </map>      <key>UISndObjectDelete</key> -        <map> -        <key>Comment</key> -            <string>Sound file for object deletion (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>0cb7b00a-4c10-6948-84de-a93c09af2ba9</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for object deletion (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>0cb7b00a-4c10-6948-84de-a93c09af2ba9</string> +    </map>      <key>UISndObjectRezIn</key> -        <map> -        <key>Comment</key> -            <string>Sound file for rezzing objects (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>3c8fc726-1fd6-862d-fa01-16c5b2568db6</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for rezzing objects (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>3c8fc726-1fd6-862d-fa01-16c5b2568db6</string> +    </map>      <key>UISndObjectRezOut</key> -        <map> -        <key>Comment</key> -            <string>Sound file for derezzing objects (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>00000000-0000-0000-0000-000000000000</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for derezzing objects (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>00000000-0000-0000-0000-000000000000</string> +    </map>      <key>UISndPieMenuAppear</key> -        <map> -        <key>Comment</key> -            <string>Sound file for opening pie menu (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>8eaed61f-92ff-6485-de83-4dcc938a478e</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for opening pie menu (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>8eaed61f-92ff-6485-de83-4dcc938a478e</string> +    </map>      <key>UISndPieMenuHide</key> -        <map> -        <key>Comment</key> -            <string>Sound file for closing pie menu (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>00000000-0000-0000-0000-000000000000</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for closing pie menu (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>00000000-0000-0000-0000-000000000000</string> +    </map>      <key>UISndPieMenuSliceHighlight0</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 0 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>d9f73cf8-17b4-6f7a-1565-7951226c305d</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 0 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>d9f73cf8-17b4-6f7a-1565-7951226c305d</string> +    </map>      <key>UISndPieMenuSliceHighlight1</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 1 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>f6ba9816-dcaf-f755-7b67-51b31b6233e5</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 1 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>f6ba9816-dcaf-f755-7b67-51b31b6233e5</string> +    </map>      <key>UISndPieMenuSliceHighlight2</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 2 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>7aff2265-d05b-8b72-63c7-dbf96dc2f21f</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 2 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>7aff2265-d05b-8b72-63c7-dbf96dc2f21f</string> +    </map>      <key>UISndPieMenuSliceHighlight3</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 3 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>09b2184e-8601-44e2-afbb-ce37434b8ba1</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 3 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>09b2184e-8601-44e2-afbb-ce37434b8ba1</string> +    </map>      <key>UISndPieMenuSliceHighlight4</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 4 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>bbe4c7fc-7044-b05e-7b89-36924a67593c</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 4 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>bbe4c7fc-7044-b05e-7b89-36924a67593c</string> +    </map>      <key>UISndPieMenuSliceHighlight5</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 5 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>d166039b-b4f5-c2ec-4911-c85c727b016c</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 5 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>d166039b-b4f5-c2ec-4911-c85c727b016c</string> +    </map>      <key>UISndPieMenuSliceHighlight6</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 6 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>242af82b-43c2-9a3b-e108-3b0c7e384981</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 6 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>242af82b-43c2-9a3b-e108-3b0c7e384981</string> +    </map>      <key>UISndPieMenuSliceHighlight7</key> -        <map> -        <key>Comment</key> -            <string>Sound file for selecting pie menu item 7 (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c1f334fb-a5be-8fe7-22b3-29631c21cf0b</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for selecting pie menu item 7 (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c1f334fb-a5be-8fe7-22b3-29631c21cf0b</string> +    </map>      <key>UISndSnapshot</key> -        <map> -        <key>Comment</key> -            <string>Sound file for taking a snapshot (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>3d09f582-3851-c0e0-f5ba-277ac5c73fb4</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for taking a snapshot (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>3d09f582-3851-c0e0-f5ba-277ac5c73fb4</string> +    </map>      <key>UISndStartIM</key> -        <map> -        <key>Comment</key> -            <string>Sound file for starting a new IM session (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c825dfbc-9827-7e02-6507-3713d18916c1</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for starting a new IM session (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c825dfbc-9827-7e02-6507-3713d18916c1</string> +    </map>      <key>UISndTeleportOut</key> -        <map> -        <key>Comment</key> -            <string>Sound file for teleporting (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>d7a9a565-a013-2a69-797d-5332baa1a947</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for teleporting (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>d7a9a565-a013-2a69-797d-5332baa1a947</string> +    </map>      <key>UISndTyping</key> -        <map> -        <key>Comment</key> -            <string>Sound file for starting to type a chat message (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>5e191c7b-8996-9ced-a177-b2ac32bfea06</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for starting to type a chat message (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>5e191c7b-8996-9ced-a177-b2ac32bfea06</string> +    </map>      <key>UISndWindowClose</key> -        <map> -        <key>Comment</key> -            <string>Sound file for closing a window (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>2c346eda-b60c-ab33-1119-b8941916a499</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for closing a window (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>2c346eda-b60c-ab33-1119-b8941916a499</string> +    </map>      <key>UISndWindowOpen</key> -        <map> -        <key>Comment</key> -            <string>Sound file for opening a window (uuid for sound asset)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>c80260ba-41fd-8a46-768a-6bf236360e3a</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Sound file for opening a window (uuid for sound asset)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>c80260ba-41fd-8a46-768a-6bf236360e3a</string> +    </map>      <key>UseAltKeyForMenus</key> -        <map> -        <key>Comment</key> -            <string>Access menus via keyboard by tapping Alt</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Access menus via keyboard by tapping Alt</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseChatBubbles</key> -        <map> -        <key>Comment</key> -            <string>Show chat above avatars head in chat bubbles</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Show chat above avatars head in chat bubbles</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseDebugLogin</key> -        <map> -        <key>Comment</key> -            <string>Provides extra control over which grid to connect to</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Provides extra control over which grid to connect to</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseDebugMenus</key> -        <map> -        <key>Comment</key> -            <string>Turns on "Debug" menu</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Turns on "Debug" menu</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseDefaultColorPicker</key> -        <map> -        <key>Comment</key> -            <string>Use color picker supplied by operating system</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use color picker supplied by operating system</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseEnergy</key> -        <map> -        <key>Comment</key> -            <string /> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string /> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>UseExternalBrowser</key> -        <map> -        <key>Comment</key> -            <string>Use default browser when opening web pages instead of in-world browser.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Use default browser when opening web pages instead of in-world browser.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseFreezeFrame</key> -        <map> -        <key>Comment</key> -            <string>Freeze time when taking snapshots.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Freeze time when taking snapshots.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UseOcclusion</key> -        <map> -        <key>Comment</key> -            <string>Enable object culling based on occlusion (coverage) by other objects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable object culling based on occlusion (coverage) by other objects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>UseStartScreen</key> +    <map> +      <key>Comment</key> +      <string>Whether to load a start screen image or not.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>UseWebPagesOnPrims</key> -        <map> -        <key>Comment</key> -            <string>[NOT USED]</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[NOT USED]</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UserConnectionPort</key> -        <map> -        <key>Comment</key> -            <string>Port that this client transmits on.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Port that this client transmits on.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>UserLogFile</key> -        <map> -        <key>Comment</key> -            <string>User specified log file name.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string /> -        </map> +    <map> +      <key>Comment</key> +      <string>User specified log file name.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>UserLoginInfo</key> -        <map> -        <key>Comment</key> -            <string>Users loging data.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>LLSD</string> -        <key>Value</key> -            <map /> -        </map> -    <key>UseStartScreen</key> -        <map> -        <key>Comment</key> -            <string>Whether to load a start screen image or not.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Users loging data.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>LLSD</string> +      <key>Value</key> +      <map> +      </map> +    </map>      <key>VFSOldSize</key> -        <map> -        <key>Comment</key> -            <string>[DO NOT MODIFY] Controls resizing of local file cache</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[DO NOT MODIFY] Controls resizing of local file cache</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>VFSSalt</key> -        <map> -        <key>Comment</key> -            <string>[DO NOT MODIFY] Controls local file caching behavior</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>[DO NOT MODIFY] Controls local file caching behavior</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>VectorizeEnable</key> -        <map> -        <key>Comment</key> -            <string>Enable general vector operations and data alignment.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable general vector operations and data alignment.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>VectorizePerfTest</key> -        <map> -        <key>Comment</key> -            <string>Test SSE/vectorization performance and choose fastest version.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Test SSE/vectorization performance and choose fastest version.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>VectorizeProcessor</key> -        <map> -        <key>Comment</key> -            <string>0=Compiler Default, 1=SSE, 2=SSE2, autodetected</string> -        <key>Persist</key> -            <integer>0</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>0=Compiler Default, 1=SSE, 2=SSE2, autodetected</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>VectorizeSkin</key> -        <map> -        <key>Comment</key> -            <string>Enable vector operations for avatar skinning.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable vector operations for avatar skinning.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>VelocityInterpolate</key> -        <map> -        <key>Comment</key> -            <string>Extrapolate object motion from last packet based on received velocity</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Extrapolate object motion from last packet based on received velocity</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>VerboseLogs</key> -        <map> -        <key>Comment</key> -            <string>Display source file and line number for each log item for debugging purposes</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Display source file and line number for each log item for debugging purposes</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>VersionChannelName</key> -        <map> -        <key>Comment</key> -            <string>Versioning Channel Name.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>Second Life Release</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Versioning Channel Name.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>Second Life Release</string> +    </map>      <key>VertexShaderEnable</key> -        <map> -        <key>Comment</key> -            <string>Enable/disable all GLSL shaders (debug)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enable/disable all GLSL shaders (debug)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>VivoxDebugLevel</key> -        <map> -        <key>Comment</key> -            <string>Logging level to use when launching the vivox daemon</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>-1</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Logging level to use when launching the vivox daemon</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>-1</string> +    </map>      <key>VivoxDebugServerName</key> -        <map> -        <key>Comment</key> -            <string>Hostname of the vivox account server to use for voice when not connected to Agni.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>bhd.vivox.com</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Hostname of the vivox account server to use for voice when not connected to Agni.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>bhd.vivox.com</string> +    </map>      <key>VoiceCallsFriendsOnly</key> -        <map> -        <key>Comment</key> -            <string>Only accept voice calls from residents on your friends list</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Only accept voice calls from residents on your friends list</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>VoiceEarLocation</key> -        <map> -        <key>Comment</key> -            <string>Location of the virtual ear for voice</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Location of the virtual ear for voice</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>VoiceHost</key> -        <map> -        <key>Comment</key> -            <string>Client SLVoice host to connect to</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>127.0.0.1</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Client SLVoice host to connect to</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>127.0.0.1</string> +    </map>      <key>VoiceImageLevel0</key> -        <map> -        <key>Comment</key> -            <string>Texture UUID for voice image level 0</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>041ee5a0-cb6a-9ac5-6e49-41e9320507d5</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture UUID for voice image level 0</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>041ee5a0-cb6a-9ac5-6e49-41e9320507d5</string> +    </map>      <key>VoiceImageLevel1</key> -        <map> -        <key>Comment</key> -            <string>Texture UUID for voice image level 1</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture UUID for voice image level 1</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +    </map>      <key>VoiceImageLevel2</key> -        <map> -        <key>Comment</key> -            <string>Texture UUID for voice image level 2</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture UUID for voice image level 2</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +    </map>      <key>VoiceImageLevel3</key> -        <map> -        <key>Comment</key> -            <string>Texture UUID for voice image level 3</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture UUID for voice image level 3</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +    </map>      <key>VoiceImageLevel4</key> -        <map> -        <key>Comment</key> -            <string>Texture UUID for voice image level 4</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture UUID for voice image level 4</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +    </map>      <key>VoiceImageLevel5</key> -        <map> -        <key>Comment</key> -            <string>Texture UUID for voice image level 5</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture UUID for voice image level 5</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +    </map>      <key>VoiceImageLevel6</key> -        <map> -        <key>Comment</key> -            <string>Texture UUID for voice image level 6</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Texture UUID for voice image level 6</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +    </map>      <key>VoiceInputAudioDevice</key> -        <map> -        <key>Comment</key> -            <string>Audio input device to use for voice</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>Default</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio input device to use for voice</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>Default</string> +    </map>      <key>VoiceOutputAudioDevice</key> -        <map> -        <key>Comment</key> -            <string>Audio output device to use for voice</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>String</string> -        <key>Value</key> -            <string>Default</string> -        </map> +    <map> +      <key>Comment</key> +      <string>Audio output device to use for voice</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string>Default</string> +    </map>      <key>VoicePort</key> -        <map> -        <key>Comment</key> -            <string>Client SLVoice port to connect to</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>U32</string> -        <key>Value</key> -            <integer>44124</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Client SLVoice port to connect to</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>44124</integer> +    </map> +    <key>WLSkyDetail</key> +    <map> +      <key>Comment</key> +      <string>Controls vertex detail on the WindLight sky.  Lower numbers will give better performance and uglier skies.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>64</integer> +    </map>      <key>WarnAboutBadPCI</key> -        <map> -        <key>Comment</key> -            <string>Enables AboutBadPCI warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables AboutBadPCI warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnAboutDirectX9</key> -        <map> -        <key>Comment</key> -            <string>Enables AboutDirectX9 warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables AboutDirectX9 warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnAboutOldGraphicsDriver</key> -        <map> -        <key>Comment</key> -            <string>Enables AboutOldGraphicsDriver warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables AboutOldGraphicsDriver warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnAboutPCIGraphics</key> -        <map> -        <key>Comment</key> -            <string>Enables AboutPCIGraphics warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables AboutPCIGraphics warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnBrowserLaunch</key> -        <map> -        <key>Comment</key> -            <string>Enables BrowserLaunch warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables BrowserLaunch warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnDeedObject</key> -        <map> -        <key>Comment</key> -            <string>Enables DeedObject warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables DeedObject warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstAppearance</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstAppearance warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -    <key>WarnFirstMedia</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstMedia warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstAppearance warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstAttach</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstAttach warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstAttach warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstBalanceDecrease</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstBalanceDecrease warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstBalanceDecrease warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstBalanceIncrease</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstBalanceIncrease warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstBalanceIncrease warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstBuild</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstBuild warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstBuild warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstDebugMenus</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstDebugMenus warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstDebugMenus warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstFlexible</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstFlexible warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstFlexible warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstGoTo</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstGoTo warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstGoTo warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstInventory</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstInventory warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstInventory warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstLeftClickNoHit</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstLeftClickNoHit warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstLeftClickNoHit warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstMap</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstMap warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstMap warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstMedia</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstMedia warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstMedia warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstOverrideKeys</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstOverrideKeys warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstOverrideKeys warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstSandbox</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstSandbox warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstSandbox warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstSculptedPrim</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstSculptedPrim warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstSculptedPrim warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstSit</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstSit warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstSit warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstStreamingMusic</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstStreamingMusic warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstStreamingMusic warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstStreamingVideo</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstStreamingVideo warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstStreamingVideo warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstTeleport</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstTeleport warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstTeleport warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnFirstVoice</key> -        <map> -        <key>Comment</key> -            <string>Enables FirstVoice warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables FirstVoice warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnNewClassified</key> -        <map> -        <key>Comment</key> -            <string>Enables NewClassified warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables NewClassified warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnQuickTimeInstalled</key> -        <map> -        <key>Comment</key> -            <string>Enables QuickTimeInstalled warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Enables QuickTimeInstalled warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WarnReturnToOwner</key> -        <map> -        <key>Comment</key> -            <string>Enables ReturnToOwner warning dialog</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> -	<key>WindLightUseAtmosShaders</key> -		<map> -		<key>Comment</key> -			<string>Whether to enable or disable WindLight atmospheric shaders.</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<integer>1</integer> -		</map> +    <map> +      <key>Comment</key> +      <string>Enables ReturnToOwner warning dialog</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>WatchdogEnabled</key> +    <map> +      <key>Comment</key> +      <string>Controls whether the thread watchdog timer is activated.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>WaterEditPresets</key> +    <map> +      <key>Comment</key> +      <string>Whether to be able to edit the water defaults or not</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>WaterGLFogDensityScale</key> +    <map> +      <key>Comment</key> +      <string>Maps shader water fog density to gl fog density</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.02</real> +    </map> +    <key>WaterGLFogDepthFloor</key> +    <map> +      <key>Comment</key> +      <string>Controls how dark water gl fog can get</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.25</real> +    </map> +    <key>WaterGLFogDepthScale</key> +    <map> +      <key>Comment</key> +      <string>Controls how quickly gl fog gets dark under water</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>50.0</real> +    </map> +    <key>WindLightUseAtmosShaders</key> +    <map> +      <key>Comment</key> +      <string>Whether to enable or disable WindLight atmospheric shaders.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WindowHeight</key> -        <map> -        <key>Comment</key> -            <string>SL viewer window height</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>700</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>SL viewer window height</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>700</integer> +    </map>      <key>WindowMaximized</key> -        <map> -        <key>Comment</key> -            <string>SL viewer window maximized on login</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>SL viewer window maximized on login</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>WindowWidth</key> -        <map> -        <key>Comment</key> -            <string>SL viewer window width</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>1000</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>SL viewer window width</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>1000</integer> +    </map>      <key>WindowX</key> -        <map> -        <key>Comment</key> -            <string>X coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>10</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>X coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>10</integer> +    </map>      <key>WindowY</key> -        <map> -        <key>Comment</key> -            <string>Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>10</integer> -        </map> -    <key>WLSkyDetail</key> -		<map> -		<key>Comment</key> -			<string>Controls vertex detail on the WindLight sky.  Lower numbers will give better performance and uglier skies.</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>U32</string> -		<key>Value</key> -			<integer>64</integer> -		</map> +    <map> +      <key>Comment</key> +      <string>Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>10</integer> +    </map>      <key>XferThrottle</key> -        <map> -        <key>Comment</key> -            <string>Maximum allowable downstream bandwidth for asset transfers (bits per second)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>150000</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Maximum allowable downstream bandwidth for asset transfers (bits per second)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>150000.0</real> +    </map>      <key>YawFromMousePosition</key> -        <map> -        <key>Comment</key> -            <string>Horizontal range over which avatar head tracks mouse position (degrees of head rotation from left of window to right)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>90</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Horizontal range over which avatar head tracks mouse position (degrees of head rotation from left of window to right)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>90.0</real> +    </map>      <key>YieldTime</key> -        <map> -        <key>Comment</key> -            <string>Yield some time to the local host.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>S32</string> -        <key>Value</key> -            <integer>-1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Yield some time to the local host.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>-1</integer> +    </map> +    <key>ZoomDirect</key> +    <map> +      <key>Comment</key> +      <string>Map Joystick zoom axis directly to camera zoom.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ZoomTime</key> -        <map> -        <key>Comment</key> -            <string>Time of transition between different camera modes (seconds)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.4000000059604644775390625</real> -        </map> +    <map> +      <key>Comment</key> +      <string>Time of transition between different camera modes (seconds)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.40000000596</real> +    </map>      <key>llOwnerSayChatColor</key> -        <map> -        <key>Comment</key> -            <string>Color of chat messages from objects only visible to the owner</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Color4</string> -        <key>Value</key> -            <array> -                <real>0.9900000095367431640625</real> -                <real>0.9900000095367431640625</real> -                <real>0.689999997615814208984375</real> -                <real>1</real> -            </array> -        </map> -    <key>ParcelMediaAutoPlayEnable</key> -        <map> -        <key>Comment</key> -            <string>Auto play parcel media when available</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Color of chat messages from objects only visible to the owner</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Color4</string> +      <key>Value</key> +      <array> +        <real>0.990000009537</real> +        <real>0.990000009537</real> +        <real>0.689999997616</real> +        <real>1.0</real> +      </array> +    </map>      <key>particlesbeacon</key> -        <map> -        <key>Comment</key> -            <string>Beacon / Highlight particle generators</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Beacon / Highlight particle generators</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>physicalbeacon</key> -        <map> -        <key>Comment</key> -            <string>Beacon / Highlight physical objects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Beacon / Highlight physical objects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>renderbeacons</key> -        <map> -        <key>Comment</key> -            <string>Beacon / Highlight particle generators</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Beacon / Highlight particle generators</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>renderhighlights</key> -        <map> -        <key>Comment</key> -            <string>Beacon / Highlight scripted objects with touch function</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Beacon / Highlight scripted objects with touch function</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>scriptsbeacon</key> -        <map> -        <key>Comment</key> -            <string>Beacon / Highlight scripted objects</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Beacon / Highlight scripted objects</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>scripttouchbeacon</key> -        <map> -        <key>Comment</key> -            <string>Beacon / Highlight scripted objects with touch function</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>1</integer> -        </map> +    <map> +      <key>Comment</key> +      <string>Beacon / Highlight scripted objects with touch function</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>soundsbeacon</key> -        <map> -        <key>Comment</key> -            <string>Beacon / Highlight sound generators</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>Boolean</string> -        <key>Value</key> -            <integer>0</integer> -        </map> -	<key>SkyEditPresets</key> -		<map> -		<key>Comment</key> -			<string>Whether to be able to edit the sky defaults or not</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<integer>0</integer> -		</map> -	<key>WaterGLFogDepthFloor</key> -		<map> -		<key>Comment</key> -			<string>Controls how dark water gl fog can get</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>F32</string> -		<key>Value</key> -			<real>0.25</real> -		</map> -	<key>WaterGLFogDepthScale</key> -		<map> -		<key>Comment</key> -			<string>Controls how quickly gl fog gets dark under water</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>F32</string> -		<key>Value</key> -			<real>50.0</real> -		</map> -	<key>WaterGLFogDensityScale</key> -		<map> -		<key>Comment</key> -			<string>Maps shader water fog density to gl fog density</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>F32</string> -		<key>Value</key> -			<real>0.02</real> -		</map> -	<key>EnableRippleWater</key> -		<map> -		<key>Comment</key> -			<string>Whether to use ripple water shader or not</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<integer>1</integer> -		</map> -	<key>WaterEditPresets</key> -	    <map> -	    <key>Comment</key> -		    <string>Whether to be able to edit the water defaults or not</string> -	    <key>Persist</key> -		    <integer>1</integer> -	    <key>Type</key> -		    <string>Boolean</string> -	    <key>Value</key> -		    <integer>0</integer> -	    </map> -    <key>FloaterEnvRect</key> -	    <map> -	    <key>Comment</key> -		    <string>Rectangle for Environment Editor</string> -	    <key>Persist</key> -		    <integer>1</integer> -	    <key>Type</key> -		    <string>Rect</string> -	    <key>Value</key> -            <array> -                <integer>50</integer> -                <integer>150</integer> -                <integer>650</integer> -                <integer>0</integer> -            </array> -	    </map> -    <key>FloaterAdvancedSkyRect</key> -	    <map> -	    <key>Comment</key> -		    <string>Rectangle for Advanced Sky Editor</string> -	    <key>Persist</key> -		    <integer>1</integer> -	    <key>Type</key> -		    <string>Rect</string> -	    <key>Value</key> -            <array> -                <integer>50</integer> -                <integer>220</integer> -                <integer>450</integer> -                <integer>0</integer> -            </array> -	    </map> -    <key>FloaterDayCycleRect</key> -	    <map> -	    <key>Comment</key> -		    <string>Rectangle for Day Cycle Editor</string> -	    <key>Persist</key> -		    <integer>1</integer> -	    <key>Type</key> -		    <string>Rect</string> -	    <key>Value</key> -            <array> -                <integer>50</integer> -                <integer>450</integer> -                <integer>300</integer> -                <integer>0</integer> -            </array> -	    </map> -    <key>FloaterAdvancedWaterRect</key> -	    <map> -	    <key>Comment</key> -		    <string>Rectangle for Advanced Water Editor</string> -	    <key>Persist</key> -		    <integer>1</integer> -	    <key>Type</key> -		    <string>Rect</string> -	    <key>Value</key> -            <array> -                <integer>50</integer> -                <integer>220</integer> -                <integer>450</integer> -                <integer>0</integer> -            </array> -	    </map> -    <key>RenderFastAlpha</key> -		<map> -		<key>Comment</key> -			<string>Use lossy alpha rendering optimization (opaque/nonexistent small alpha faces).</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<integer>0</integer> -		</map> -    <key>RenderDeferred</key> -		<map> -		<key>Comment</key> -			<string>Use deferred rendering pipeline.</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<integer>0</integer> -		</map> -    <key>RenderFSAASamples</key> -		<map> -		<key>Comment</key> -			<string>Number of samples to use for FSAA (0 = no AA).</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>U32</string> -		<key>Value</key> -			<integer>0</integer> -		</map> -    <key>RenderTextureMemoryMultiple</key> -		<map> -		<key>Comment</key> -			<string>Multiple of texture memory value to use (should fit: 0 < value <= 1.0)</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>F32</string> -		<key>Value</key> -			<real>1.0</real> -		</map> -    <key>Disregard128DefaultDrawDistance</key> -		<map> -		<key>Comment</key> -			<string>Whether to use the auto default to 128 draw distance</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<real>1</real> -		</map> -    <key>Disregard96DefaultDrawDistance</key> -		<map> -		<key>Comment</key> -			<string>Whether to use the auto default to 96 draw distance</string> -		<key>Persist</key> -			<integer>1</integer> -		<key>Type</key> -			<string>Boolean</string> -		<key>Value</key> -			<real>1</real> -		</map> - -    <key>AvatarAxisDeadZone0</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 0 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>AvatarAxisDeadZone1</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 1 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>AvatarAxisDeadZone2</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 2 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>AvatarAxisDeadZone3</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 3 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>AvatarAxisDeadZone4</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 4 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>AvatarAxisDeadZone5</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 5 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>AvatarAxisScale0</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 0 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>AvatarAxisScale1</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 1 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>AvatarAxisScale2</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 2 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>AvatarAxisScale3</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 3 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>AvatarAxisScale4</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 4 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>AvatarAxisScale5</key> -        <map> -        <key>Comment</key> -            <string>Avatar axis 5 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>AvatarFeathering</key> -        <map> -        <key>Comment</key> -            <string>Avatar feathering (less is softer)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>16</real> -        </map> - -    <key>BuildAxisDeadZone0</key> -        <map> -        <key>Comment</key> -            <string>Build axis 0 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>BuildAxisDeadZone1</key> -        <map> -        <key>Comment</key> -            <string>Build axis 1 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>BuildAxisDeadZone2</key> -        <map> -        <key>Comment</key> -            <string>Build axis 2 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>BuildAxisDeadZone3</key> -        <map> -        <key>Comment</key> -            <string>Build axis 3 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>BuildAxisDeadZone4</key> -        <map> -        <key>Comment</key> -            <string>Build axis 4 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>BuildAxisDeadZone5</key> -        <map> -        <key>Comment</key> -            <string>Build axis 5 dead zone.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>0.1</real> -        </map> -    <key>BuildAxisScale0</key> -        <map> -        <key>Comment</key> -            <string>Build axis 0 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>BuildAxisScale1</key> -        <map> -        <key>Comment</key> -            <string>Build axis 1 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>BuildAxisScale2</key> -        <map> -        <key>Comment</key> -            <string>Build axis 2 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>BuildAxisScale3</key> -        <map> -        <key>Comment</key> -            <string>Build axis 3 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>BuildAxisScale4</key> -        <map> -        <key>Comment</key> -            <string>Build axis 4 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>BuildAxisScale5</key> -        <map> -        <key>Comment</key> -            <string>Build axis 5 scaler.</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>1</real> -        </map> -    <key>BuildFeathering</key> -        <map> -        <key>Comment</key> -            <string>Build feathering (less is softer)</string> -        <key>Persist</key> -            <integer>1</integer> -        <key>Type</key> -            <string>F32</string> -        <key>Value</key> -            <real>16</real> -        </map> - +    <map> +      <key>Comment</key> +      <string>Beacon / Highlight sound generators</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer>      </map> +  </map>  </llsd> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index a6173f45df..2b5691ffe8 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -64,7 +64,7 @@  #include "llurldispatcher.h"  #include "llurlhistory.h"  #include "llfirstuse.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llweb.h"  #include "llsecondlifeurls.h" @@ -192,24 +192,6 @@  // viewer.cpp - these are only used in viewer, should be easily moved.  extern void disable_win_error_reporting(); -//#define APPLE_PREVIEW // Define this if you're doing a preview build on the Mac -#if LL_RELEASE_FOR_DOWNLOAD -// Default userserver for production builds is agni -#ifndef APPLE_PREVIEW -static EGridInfo GridDefaultChoice = GRID_INFO_AGNI; -#else -static EGridInfo GridDefaultChoice = GRID_INFO_ADITI; -#endif -#else -// Default userserver for development builds is none -static EGridInfo GridDefaultChoice = GRID_INFO_NONE; -#endif - -#if LL_WINDOWS -extern void create_console(); -#endif - -  #if LL_DARWIN  #include <Carbon/Carbon.h>  extern void init_apple_menu(const char* product); @@ -287,6 +269,7 @@ BOOL				gUseWireframe = FALSE;  LLVFS* gStaticVFS = NULL;  LLMemoryInfo gSysMemory; +U64 gMemoryAllocated = 0; // updated in display_stats() in llviewerdisplay.cpp  LLString gLastVersionChannel; @@ -303,6 +286,7 @@ BOOL gPeriodicSlowFrame = FALSE;  BOOL gCrashOnStartup = FALSE;  BOOL gLLErrorActivated = FALSE;  BOOL gLogoutInProgress = FALSE; +  ////////////////////////////////////////////////////////////  // Internal globals... that should be removed.  static LLString gArgs; @@ -338,6 +322,48 @@ void idle_afk_check()  	}  } +//this function checks if the system can allocate (num_chunk)MB memory successfully. +//if this check fails, the allocated memory is NOT freed. +void idle_mem_check(S32 num_chunk) +{ +	//this flag signals if memory allocation check is necessary +	static BOOL check = TRUE ; + +	if(!check) //if memory check fails before, do not repeat it. +	{ +		return ; +	} +	check = FALSE ; //before memory check for this frame, turn off check signal for the next frame.  + +	S32 i = 0 ; +	char**p = new char*[num_chunk] ; +	if(!p) +	{ +		return ; +	} +	for(i = 0 ; i < num_chunk ; i++) +	{ +		//1MB per chunk +		//if the allocation fails, the system should catch it. +		p[i] = new char[1024 * 1024] ; + +		if(!p[i]) //in case that system try-catch is turned off +		{ +			return ; +		} +	} + +	//release memory if the allocation check does not fail. +	for(i = 0 ; i < num_chunk ; i++) +	{ +		delete[] p[i] ;	 +	} +	delete[] p ; + +	//memory check for this frame succeeds, turn on next frame check. +	check = TRUE ; +} +  // A callback set in LLAppViewer::init()  static void ui_audio_callback(const LLUUID& uuid)  { @@ -369,6 +395,24 @@ void request_initial_instant_messages()  	}  } +// A settings system callback for CrashSubmitBehavior +bool handleCrashSubmitBehaviorChanged(const LLSD& newvalue) +{ +	S32 cb = newvalue.asInteger(); +	const S32 NEVER_SUBMIT_REPORT = 2; +	if(cb == NEVER_SUBMIT_REPORT) +	{ +// 		LLWatchdog::getInstance()->cleanup(); // SJB: cleaning up a running watchdog is unsafe +		LLAppViewer::instance()->destroyMainloopTimeout(); +	} +	else if(gSavedSettings.getBOOL("WatchdogEnabled") == TRUE) +	{ +// 		LLWatchdog::getInstance()->init(); +// 		LLAppViewer::instance()->initMainloopTimeout("Mainloop Resume"); +	} +	return true; +} +  // Use these strictly for things that are constructed at startup,  // or for things that are performance critical.  JC  static void settings_to_globals() @@ -464,72 +508,32 @@ static void settings_modify()  	gSavedSettings.setBOOL("PTTCurrentlyEnabled", TRUE); //gSavedSettings.getBOOL("EnablePushToTalk"));  } -void initGridChoice() +void LLAppViewer::initGridChoice()  { -    LLString gridChoice = gSavedSettings.getString("GridChoice"); -    if(!gridChoice.empty()) -		// Used to show first chunk of each argument passed in the  -		// window title. -    { -        // find the grid choice from the user setting. -        int gridIndex = GRID_INFO_NONE;  -        for(;gridIndex < GRID_INFO_OTHER; ++gridIndex ) -        { -            if(0 == LLString::compareInsensitive(gGridInfo[gridIndex].mLabel, gridChoice.c_str())) -            { -                gGridChoice = (EGridInfo)gridIndex; - -                if(GRID_INFO_LOCAL == gGridChoice) -                { -                    gGridName = LOOPBACK_ADDRESS_STRING; -                    break; -                } -                else -                { -                    gGridName = gGridInfo[gGridChoice].mName; -                    break; -                } -            } -        } - -        if(GRID_INFO_OTHER == gridIndex) -        { -                // *FIX:MEP Can and should we validate that this is an IP address? -                gGridChoice = (EGridInfo)gridIndex; -                gGridName = llformat("%s", gSavedSettings.getString("GridChoice").c_str()); - -        } -    } - - -#if !LL_RELEASE_FOR_DOWNLOAD -	if (gGridChoice == GRID_INFO_NONE) -	{ -		// Development version: load last server choice by default (overridden by cmd line args) -		S32 server = gSavedSettings.getS32("ServerChoice"); -		if (server != 0) -			gGridChoice = (EGridInfo)llclamp(server, 0, (S32)GRID_INFO_COUNT - 1); -		if (server == GRID_INFO_OTHER) +	// Load	up the initial grid	choice from: +	//	- hard coded defaults... +	//	- command line settings... +	//	- if dev build,	persisted settings... + +	// Set the "grid choice", this is specified	by command line. +	std::string	grid_choice	= gSavedSettings.getString("CmdLineGridChoice"); +	LLViewerLogin::getInstance()->setGridChoice(grid_choice); + +	// Load last server choice by default  +	// ignored if the command line grid	choice has been	set +	if(grid_choice.empty()) +	{ +		S32	server = gSavedSettings.getS32("ServerChoice"); +		server = llclamp(server, 0,	(S32)GRID_INFO_COUNT - 1); +		if(server == GRID_INFO_OTHER)  		{  			LLString custom_server = gSavedSettings.getString("CustomServer"); -			if (custom_server.empty()) -			{ -				gGridName = "none"; -			} -			else -			{ -				gGridName = custom_server.c_str(); -			} +			LLViewerLogin::getInstance()->setGridChoice(custom_server); +		} +		else if(server != 0) +		{ +			LLViewerLogin::getInstance()->setGridChoice((EGridInfo)server);  		} - -        gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mLabel); -	} -#endif - -	if (gGridChoice == GRID_INFO_NONE) -	{ -		gGridChoice = GridDefaultChoice; -        gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mLabel);  	}  } @@ -577,7 +581,6 @@ LLTextureFetch* LLAppViewer::sTextureFetch = NULL;  LLAppViewer::LLAppViewer() :   	mMarkerFile(NULL), -	mCrashBehavior(CRASH_BEHAVIOR_ASK),  	mReportedCrash(false),  	mNumSessions(0),  	mPurgeCache(false), @@ -586,7 +589,8 @@ LLAppViewer::LLAppViewer() :  	mSavedFinalSnapshot(false),  	mQuitRequested(false),  	mLogoutRequestSent(false), -	mYieldTime(-1) +	mYieldTime(-1), +	mMainloopTimeout(NULL)  {  	if(NULL != sInstance)  	{ @@ -594,15 +598,11 @@ LLAppViewer::LLAppViewer() :  	}  	sInstance = this; - -	// Initialize the mainloop timeout.  -	mMainloopTimeout = new LLWatchdogTimeout();  }  LLAppViewer::~LLAppViewer()  { -	// Initialize the mainloop timeout.  -	delete mMainloopTimeout; +	destroyMainloopTimeout();  	// If we got to this destructor somehow, the app didn't hang.  	removeMarkerFile(); @@ -610,13 +610,6 @@ LLAppViewer::~LLAppViewer()  bool LLAppViewer::init()  { -    // *NOTE:Mani - LLCurl::initClass is not thread safe.  -    // Called before threads are created. -    LLCurl::initClass(); - -    initThreads(); - -  	//  	// Start of the application  	// @@ -629,7 +622,6 @@ bool LLAppViewer::init()  	// that touches files should really go through the lldir API  	gDirUtilp->initAppDirs("SecondLife"); -  	initLogging();  	// @@ -638,6 +630,12 @@ bool LLAppViewer::init()      if (!initConfiguration())  		return false; +    // *NOTE:Mani - LLCurl::initClass is not thread safe.  +    // Called before threads are created. +    LLCurl::initClass(); + +    initThreads(); +      writeSystemInfo();  	// Build a string representing the current version number. @@ -888,10 +886,6 @@ bool LLAppViewer::init()  bool LLAppViewer::mainLoop()  { -	mMainloopTimeout = new LLWatchdogTimeout(); -	// *FIX:Mani - Make this a setting, once new settings exist in this branch. -	mMainloopTimeout->setTimeout(5); -	  	//-------------------------------------------  	// Run main loop until time to quit  	//------------------------------------------- @@ -920,6 +914,8 @@ bool LLAppViewer::mainLoop()  		{  			LLFastTimer t(LLFastTimer::FTM_FRAME); +			pingMainloopTimeout("Main:GatherInput"); +			  			{  				LLFastTimer t2(LLFastTimer::FTM_MESSAGES);  			#if LL_WINDOWS @@ -940,8 +936,13 @@ bool LLAppViewer::mainLoop()  			}  #endif +			//at the beginning of every frame, check if the system can successfully allocate 10 * 1 MB memory. +			idle_mem_check(10) ; +  			if (!LLApp::isExiting())  			{ +				pingMainloopTimeout("Main:JoystickKeyboard"); +				  				// Scan keyboard for movement keys.  Command keys and typing  				// are handled by windows callbacks.  Don't do this until we're  				// done initializing.  JC @@ -956,6 +957,8 @@ bool LLAppViewer::mainLoop()  					gKeyboard->scanKeyboard();  				} +				pingMainloopTimeout("Main:Messages"); +				  				// Update state based on messages, user input, object idle.  				{  					LLFastTimer t3(LLFastTimer::FTM_IDLE); @@ -972,25 +975,34 @@ bool LLAppViewer::mainLoop()  				if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED))  				{ +					pauseMainloopTimeout();  					saveFinalSnapshot();  					disconnectViewer(); +					resumeMainloopTimeout();  				}  				// Render scene.  				if (!LLApp::isExiting())  				{ +					pingMainloopTimeout("Main:Display");  					display(); +					pingMainloopTimeout("Main:Snapshot");  					LLFloaterSnapshot::update(); // take snapshots  #if LL_LCD_COMPILE  					// update LCD Screen +					pingMainloopTimeout("Main:LCD");  					gLcdScreen->UpdateDisplay();  #endif  				}  			} +			pingMainloopTimeout("Main:Sleep"); +			 +			pauseMainloopTimeout(); +  			// Sleep and run background threads  			{  				LLFastTimer t2(LLFastTimer::FTM_SLEEP); @@ -1073,7 +1085,9 @@ bool LLAppViewer::mainLoop()  				//LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering.  				//LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering. -				mMainloopTimeout->ping(); +				resumeMainloopTimeout(); +	 +				pingMainloopTimeout("Main:End");  			}  		} @@ -1098,7 +1112,7 @@ bool LLAppViewer::mainLoop()  	delete gServicePump; -	mMainloopTimeout->stop(); +	destroyMainloopTimeout();  	llinfos << "Exiting main_loop" << llendflush; @@ -1400,7 +1414,12 @@ bool LLAppViewer::initThreads()  	static const bool enable_threads = true;  #endif -	LLWatchdog::getInstance()->init(); +	const S32 NEVER_SUBMIT_REPORT = 2; +	if(TRUE == gSavedSettings.getBOOL("WatchdogEnabled")  +		&& (gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) != NEVER_SUBMIT_REPORT)) +	{ +		LLWatchdog::getInstance()->init(); +	}  	LLVFSThread::initClass(enable_threads && true);  	LLLFSThread::initClass(enable_threads && true); @@ -1556,6 +1575,19 @@ bool LLAppViewer::initConfiguration()  				 LLWindow::getFontListSans());  #endif +	//*FIX:Mani - Set default to disabling watchdog mainloop  +	// timeout for mac and linux. There is no call stack info  +	// on these platform to help debug. +#ifndef	LL_RELEASE_FOR_DOWNLOAD +	gSavedSettings.setBOOL("WatchdogEnabled", FALSE); +#endif + +#ifndef LL_WINDOWS +	gSavedSettings.setBOOL("WatchdogEnabled", FALSE); +#endif + +	gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _1));	 +  	// These are warnings that appear on the first experience of that condition.  	// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse  	// for disable/reset ability @@ -1787,18 +1819,6 @@ bool LLAppViewer::initConfiguration()          }      } -    const LLControlVariable* loginuri = gSavedSettings.getControl("LoginURI"); -    if(loginuri && LLString::null != loginuri->getValue().asString()) -    {    -        addLoginURI(loginuri->getValue().asString()); -    } - -    const LLControlVariable* helperuri = gSavedSettings.getControl("HelperURI"); -    if(helperuri && LLString::null != helperuri->getValue().asString()) -    {    -        setHelperURI(helperuri->getValue().asString()); -    } -      const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinFolder");      if(skinfolder && LLString::null != skinfolder->getValue().asString())      {    @@ -2180,10 +2200,6 @@ void LLAppViewer::cleanupSavedSettings()  	{  		gSavedSettings.setF32("RenderFarClip", gAgent.mDrawDistance);  	} - -	// *REMOVE: This is now done via LLAppViewer::setCrashBehavior() -	// Left vestigially in case I borked it. -	// gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior);  }  void LLAppViewer::removeCacheFiles(const char* file_mask) @@ -2210,8 +2226,15 @@ void LLAppViewer::writeSystemInfo()  	gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE();  	gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2(); -	gDebugInfo["RAMInfo"] = llformat("%u", gSysMemory.getPhysicalMemoryKB()); +	gDebugInfo["RAMInfo"]["Physical"] = (LLSD::Integer)(gSysMemory.getPhysicalMemoryKB()); +	gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer)(gMemoryAllocated>>10); // MB -> KB  	gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple(); +		 +	// *FIX:Mani - move this ddown in llappviewerwin32 +#ifdef LL_WINDOWS +	DWORD thread_id = GetCurrentThreadId(); +	gDebugInfo["MainloopThreadID"] = (S32)thread_id; +#endif  	// Dump some debugging info  	LL_INFOS("SystemInfo") << gSecondLife @@ -2242,7 +2265,10 @@ void LLAppViewer::handleSyncViewerCrash()  void LLAppViewer::handleViewerCrash()  {  	llinfos << "Handle viewer crash entry." << llendl; -	 + +	// Make sure the watchdog gets turned off... +// 	LLWatchdog::getInstance()->cleanup(); // SJB: This causes the Watchdog to hang for an extra 20-40s?! +  	LLAppViewer* pApp = LLAppViewer::instance();  	if (pApp->beingDebugged())  	{ @@ -2297,6 +2323,12 @@ void LLAppViewer::handleViewerCrash()  		gDebugInfo["CurrentRegion"] = gAgent.getRegion()->getName();  	} +	if(LLAppViewer::instance()->mMainloopTimeout) +	{ +		gDebugInfo["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState(); +	} +	 +      	//Write out the crash status file  	//Use marker file style setup, as that's the simplest, especially since  	//we're already in a crash situation	 @@ -2360,12 +2392,6 @@ void LLAppViewer::handleViewerCrash()  	return;  } -void LLAppViewer::setCrashBehavior(S32 cb)  -{  -	mCrashBehavior = cb;  -	gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, mCrashBehavior); -}  -  bool LLAppViewer::anotherInstanceRunning()  {  	// We create a marker file when the program starts and remove the file when it finishes. @@ -2822,61 +2848,6 @@ const LLString& LLAppViewer::getWindowTitle() const  	return gWindowTitle;  } -void LLAppViewer::resetURIs() const -{ -    // Clear URIs when picking a new server -	gLoginURIs.clear(); -	gHelperURI.clear(); -} - -const std::vector<std::string>& LLAppViewer::getLoginURIs() const -{ -	if (gLoginURIs.empty()) -	{ -		// not specified on the command line, use value from table -		gLoginURIs.push_back(gGridInfo[gGridChoice].mLoginURI); -	} -	return gLoginURIs; -} - -const std::string& LLAppViewer::getHelperURI() const -{ -	if (gHelperURI.empty()) -	{ -		// not specified on the command line, use value from table -		gHelperURI = gGridInfo[gGridChoice].mHelperURI; -	} -	return gHelperURI; -} - -void LLAppViewer::addLoginURI(const std::string& uri) -{ -	// *NOTE:Mani - login uri trumps the --grid (gGridChoice) setting. -	// Update gGridChoice to reflect the loginURI setting. -    gLoginURIs.push_back(uri); -	 -	const std::string& top_uri = getLoginURIs()[0]; -	int i = 0; -	for(; i < GRID_INFO_COUNT; ++i) -	{ -		if(top_uri == gGridInfo[i].mLoginURI) -		{ -			gGridChoice = (EGridInfo)i; -			break; -		} -	} - -	if(GRID_INFO_COUNT == i) -	{ -		gGridChoice = GRID_INFO_OTHER; -	} -} - -void LLAppViewer::setHelperURI(const std::string& uri) -{ -    gHelperURI = uri; -} -  // Callback from a dialog indicating user was logged out.    void finish_disconnect(S32 option, void* userdata)  { @@ -3014,15 +2985,6 @@ void LLAppViewer::saveNameCache()  	}  } -bool LLAppViewer::isInProductionGrid() -{ -	// *NOTE:Mani This used to compare GRID_INFO_AGNI to gGridChoice, -	// but it seems that loginURI trumps that. -	const std::string& loginURI = getLoginURIs()[0]; -	return (loginURI == gGridInfo[GRID_INFO_AGNI].mLoginURI); -} - -  /*!	@brief		This class is an LLFrameTimer that can be created with  				an elapsed time that starts counting up from the given value  				rather than 0.0. @@ -3531,6 +3493,8 @@ static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;  void LLAppViewer::idleNetwork()  { +	pingMainloopTimeout("idleNetwork"); +  	gObjectList.mNumNewObjects = 0;  	S32 total_decoded = 0; @@ -3716,18 +3680,58 @@ void LLAppViewer::forceErrorSoftwareException()      throw;   } -void LLAppViewer::startMainloopTimeout(F32 secs) +void LLAppViewer::initMainloopTimeout(const std::string& state, F32 secs)  { -	if(secs < 0.0f) +	if(!mMainloopTimeout)  	{ -		secs = gSavedSettings.getF32("MainloopTimeoutDefault"); +		mMainloopTimeout = new LLWatchdogTimeout(); +		resumeMainloopTimeout(state, secs); +	} +} + +void LLAppViewer::destroyMainloopTimeout() +{ +	if(mMainloopTimeout) +	{ +		delete mMainloopTimeout; +		mMainloopTimeout = NULL; +	} +} + +void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs) +{ +	if(mMainloopTimeout) +	{ +		if(secs < 0.0f) +		{ +			secs = gSavedSettings.getF32("MainloopTimeoutDefault"); +		} +		 +		mMainloopTimeout->setTimeout(secs); +		mMainloopTimeout->start(state); +	} +} + +void LLAppViewer::pauseMainloopTimeout() +{ +	if(mMainloopTimeout) +	{ +		mMainloopTimeout->stop();  	} -	 -	mMainloopTimeout->setTimeout(secs); -	mMainloopTimeout->start();  } -void LLAppViewer::stopMainloopTimeout() +void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)  { -	mMainloopTimeout->stop(); +	if(mMainloopTimeout) +	{ +		if(secs < 0.0f) +		{ +			secs = gSavedSettings.getF32("MainloopTimeoutDefault"); +		} + +		mMainloopTimeout->setTimeout(secs); +		mMainloopTimeout->ping(state); +	}  } + + diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index de127e5cf8..8ef22deb27 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -77,8 +77,6 @@ public:  	// Report true if under the control of a debugger. A null-op default.  	virtual bool beingDebugged() { return false; }  -	S32 getCrashBehavior() const { return mCrashBehavior; }  -	void setCrashBehavior(S32 cb);  	virtual void handleCrashReporting() = 0; // What to do with crash report?  	virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered.  	static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon. @@ -96,13 +94,6 @@ public:  	const LLString& getSecondLifeTitle() const; // The Second Life title.  	const LLString& getWindowTitle() const; // The window display name. -    // Helpers for URIs -    void addLoginURI(const std::string& uri); -    void setHelperURI(const std::string& uri); -    const std::vector<std::string>& getLoginURIs() const; -    const std::string& getHelperURI() const; -    void resetURIs() const; -      void forceDisconnect(const LLString& msg); // Force disconnection, with a message to the user.      void badNetworkHandler(); // Cause a crash state due to bad network packet. @@ -112,8 +103,6 @@ public:      void loadNameCache();      void saveNameCache(); -    bool isInProductionGrid(); -  	void removeMarkerFile(bool leave_logout_marker = false);      // LLAppViewer testing helpers. @@ -138,10 +127,13 @@ public:  	std::string getSettingsFileName(const std::string& file);  	// For thread debugging.  -	// llstartup needs to control this. -	// llworld, send_agent_pause() also controls this. -	void startMainloopTimeout(F32 secs = -1.0f); -	void stopMainloopTimeout(); +	// llstartup needs to control init. +	// llworld, send_agent_pause() also controls pause/resume. +	void initMainloopTimeout(const std::string& state, F32 secs = -1.0f); +	void destroyMainloopTimeout(); +	void pauseMainloopTimeout(); +	void resumeMainloopTimeout(const std::string& state = "", F32 secs = -1.0f); +	void pingMainloopTimeout(const std::string& state, F32 secs = -1.0f);  protected:  	virtual bool initWindow(); // Initialize the viewer's window. @@ -159,6 +151,7 @@ private:  	bool initThreads(); // Initialize viewer threads, return false on failure.  	bool initConfiguration(); // Initialize settings from the command line/config file. +	void initGridChoice();  	bool initCache(); // Initialize local client cache.  	void purgeCache(); // Clear the local cache.  @@ -192,7 +185,6 @@ private:  	LLOSInfo mSysOSInfo;  -	S32 mCrashBehavior;  	bool mReportedCrash;  	// Thread objects. @@ -293,6 +285,7 @@ extern BOOL		gUseWireframe;  extern LLVFS	*gStaticVFS;  extern LLMemoryInfo gSysMemory; +extern U64 gMemoryAllocated;  extern LLString gLastVersionChannel; diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index cb44e2b1de..0a2cb43c80 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -333,13 +333,15 @@ void LLAppViewerLinux::handleSyncCrashTrace()  void LLAppViewerLinux::handleCrashReporting()  { +	const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); +  	// Always generate the report, have the logger do the asking, and  	// don't wait for the logger before exiting (-> total cleanup). -	if (CRASH_BEHAVIOR_NEVER_SEND != LLAppViewer::instance()->getCrashBehavior()) +	if (CRASH_BEHAVIOR_NEVER_SEND != cb)  	{	  		// launch the actual crash logger  		const char* ask_dialog = "-dialog"; -		if (CRASH_BEHAVIOR_ASK != LLAppViewer::instance()->getCrashBehavior()) +		if (CRASH_BEHAVIOR_ASK != cb)  			ask_dialog = ""; // omit '-dialog' option  		std::string cmd =gDirUtilp->getAppRODataDir();  		cmd += gDirUtilp->getDirDelimiter(); @@ -348,7 +350,7 @@ void LLAppViewerLinux::handleCrashReporting()  			{cmd.c_str(),  			 ask_dialog,  			 "-user", -			 (char*)gGridName.c_str(), +			 (char*)LLViewerLogin::getInstance()->getGridLabel().c_str(),  			 "-name",  			 LLAppViewer::instance()->getSecondLifeTitle().c_str(),  			 NULL}; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index dee36fa3c3..e2663f05bd 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -71,7 +71,6 @@ extern "C" {  #endif  #endif -  LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)  {      // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. @@ -421,9 +420,10 @@ void LLAppViewerWin32::handleCrashReporting()  	exe_path += "win_crash_logger.exe";  	std::string arg_string = "-user "; -	arg_string += gGridName; - -	switch(getCrashBehavior()) +	arg_string += LLViewerLogin::getInstance()->getGridLabel(); +	 +	S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); +	switch(cb)  	{  	case CRASH_BEHAVIOR_ASK:  	default: diff --git a/indra/newview/llbox.cpp b/indra/newview/llbox.cpp index 1a3cf36ce6..95e16cf872 100644 --- a/indra/newview/llbox.cpp +++ b/indra/newview/llbox.cpp @@ -34,7 +34,7 @@  #include "llbox.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llglheaders.h"  LLBox		gBox; diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index 8571046c6e..e4256b40f5 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -39,7 +39,7 @@  // Project includes  #include "llui.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "lluiconstants.h"  #include "llviewerwindow.h"  #include "llviewercontrol.h" diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index a6e002a04d..f06a8abfe0 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -291,12 +291,15 @@ bool LLCommandLineParser::parseAndStoreResults(po::command_line_parser& clp)      }      catch(LLCLPLastOption&)       { -        // Continue without parsing. -		std::string msg = "Found tokens past last option. Ignoring."; -        llwarns << msg << llendl; -		mErrorMsg = msg; -        // boost::po will have stored a mal-formed option.  +		// This exception means a token was read after an option  +		// that must be the last option was reached (see url and slurl options) + +        // boost::po will have stored a malformed option.           // All such options will be removed below. +		// The last option read, the last_option option, and its value +		// are put into the error message. +		std::string last_option; +		std::string last_value;          for(po::variables_map::iterator i = gVariableMap.begin(); i != gVariableMap.end();)          {              po::variables_map::iterator tempI = i++; @@ -304,7 +307,27 @@ bool LLCommandLineParser::parseAndStoreResults(po::command_line_parser& clp)              {                  gVariableMap.erase(tempI);              } +			else +			{ +				last_option = tempI->first; +		        LLCommandLineParser::token_vector_t* tv =  +				    boost::any_cast<LLCommandLineParser::token_vector_t>(&(tempI->second.value()));  +				if(!tv->empty()) +				{ +					last_value = (*tv)[tv->size()-1]; +				} +			}          } + +		// Continue without parsing. +		std::ostringstream msg; +		msg << "Caught Error: Found options after last option: "  +			<< last_option << " " +			<< last_value; + +        llwarns << msg.str() << llendl; +		mErrorMsg = msg.str(); +        return false;      }       return true;  } diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index bbcb7e64d4..c32bf7c268 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -44,7 +44,7 @@  #include "lllineeditor.h"  #include "llviewchildren.h"  #include "llxmlrpctransaction.h" -#include "llappviewer.h" +#include "llviewernetwork.h"  const F64 CURRENCY_ESTIMATE_FREQUENCY = 2.0; @@ -239,7 +239,7 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type,  	static std::string transactionURI;  	if (transactionURI.empty())  	{ -		transactionURI = LLAppViewer::instance()->getHelperURI() + "currency.php"; +		transactionURI = LLViewerLogin::getInstance()->getHelperURI() + "currency.php";  	}  	delete mTransaction; @@ -527,3 +527,4 @@ std::string LLCurrencyUIManager::errorURI()  } + diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index b0dd0a99ac..a03adfa338 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -122,6 +122,7 @@ void LLDrawable::destroy()  		sNumZombieDrawables--;  	} +	LLFace::sDeleteLock = mFaces.size() ;  	std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());  	mFaces.clear(); @@ -184,6 +185,7 @@ void LLDrawable::cleanupReferences()  {  	LLFastTimer t(LLFastTimer::FTM_PIPELINE); +	LLFace::sDeleteLock = mFaces.size() ;  	std::for_each(mFaces.begin(), mFaces.end(), DeletePointer());  	mFaces.clear(); @@ -277,6 +279,7 @@ void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerImag  	}  	else if (newFaces < (S32)mFaces.size())  	{ +		LLFace::sDeleteLock = (S32)mFaces.size() - newFaces ;  		std::for_each(mFaces.begin() + newFaces, mFaces.end(), DeletePointer());  		mFaces.erase(mFaces.begin() + newFaces, mFaces.end());  	} @@ -288,6 +291,8 @@ void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerImag  			addFace(poolp, texturep);  		}  	} + +	llassert_always(mFaces.size() == newFaces);  }  void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewerImage *texturep) @@ -298,6 +303,7 @@ void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewer  	}  	else if (newFaces < (S32)mFaces.size())  	{ +		LLFace::sDeleteLock = (S32)mFaces.size() - newFaces ;  		std::for_each(mFaces.begin() + newFaces, mFaces.end(), DeletePointer());  		mFaces.erase(mFaces.begin() + newFaces, mFaces.end());  	} @@ -309,6 +315,8 @@ void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewer  			addFace(poolp, texturep);  		}  	} + +	llassert_always(mFaces.size() == newFaces) ;  }  void LLDrawable::mergeFaces(LLDrawable* src) @@ -329,8 +337,13 @@ void LLDrawable::deleteFaces(S32 offset, S32 count)  {  	face_list_t::iterator face_begin = mFaces.begin() + offset;  	face_list_t::iterator face_end = face_begin + count; + +	S32 end = (S32)mFaces.size() ; +	LLFace::sDeleteLock = count ;  	std::for_each(face_begin, face_end, DeletePointer());  	mFaces.erase(face_begin, face_end); + +	llassert_always(mFaces.size() == end - count) ;  }  void LLDrawable::update() diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 6cd2152a28..b7966f2b20 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -32,7 +32,7 @@  #include "llviewerprecompiledheaders.h"  #include "lldrawpool.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llfasttimer.h"  #include "llviewercontrol.h" diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 09901984c4..5cc4e37c97 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -37,6 +37,7 @@  #include "llviewercontrol.h"  #include "llcriticaldamp.h"  #include "llfasttimer.h" +#include "llrender.h"  #include "llcubemap.h"  #include "llsky.h" @@ -93,7 +94,7 @@ void LLDrawPoolAlpha::beginRenderPass(S32 pass)  	{  		// Start out with no shaders.  		current_shader = target_shader = NULL; -		glUseProgramObjectARB(0); +		LLGLSLShader::bindNoShader();  	}  	gPipeline.enableLightsDynamic();  } @@ -105,7 +106,7 @@ void LLDrawPoolAlpha::endRenderPass( S32 pass )  	if(gPipeline.canUseWindLightShaders())   	{ -		glUseProgramObjectARB(0); +		LLGLSLShader::bindNoShader();  	}  } @@ -123,7 +124,7 @@ void LLDrawPoolAlpha::render(S32 pass)  	{  		if(gPipeline.canUseWindLightShaders())   		{ -			glUseProgramObjectARB(0); +			LLGLSLShader::bindNoShader();  		}  		gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));  		glColor4f(1,0,0,1); @@ -207,18 +208,17 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask  		{  			return;  		} -		// *TODO - Uhhh, we should always be doing some type of alpha rejection.  These should probably both be 0.01f -		glAlphaFunc(GL_GREATER, 0.f); +		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	}  	else  	{  		if (LLPipeline::sImpostorRender)  		{ -			glAlphaFunc(GL_GREATER, 0.5f); +			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  		}  		else  		{ -			glAlphaFunc(GL_GREATER, 0.01f); +			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  		}  	} @@ -230,7 +230,8 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask  		if (texture && params.mTexture.notNull())  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB); +			llassert_always(gGL.getTexUnit(0)) ; +			gGL.getTexUnit(0)->activate();  			params.mTexture->bind();  			params.mTexture->addTextureStats(params.mVSize);  			if (params.mTextureMatrix) @@ -283,7 +284,7 @@ void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask  		}  		else if (!use_shaders && current_shader != NULL)  		{ -			glUseProgramObjectARB(0); +			LLGLSLShader::bindNoShader();  			current_shader = NULL;  		} diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 95e3bc2205..f1d88aa54a 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -32,7 +32,7 @@  #include "llviewerprecompiledheaders.h"  #include "lldrawpoolavatar.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llvoavatar.h"  #include "m3math.h" @@ -299,7 +299,7 @@ void LLDrawPoolAvatar::beginSkinned()  		}  		sVertexProgram->enableTexture(LLShaderMgr::BUMP_MAP); -		glActiveTextureARB(GL_TEXTURE0_ARB); +		gGL.getTexUnit(0)->activate();  	}  	else  	{ @@ -319,7 +319,7 @@ void LLDrawPoolAvatar::endSkinned()  	{  		sRenderingSkinned = FALSE;  		sVertexProgram->disableTexture(LLShaderMgr::BUMP_MAP); -		glActiveTextureARB(GL_TEXTURE0_ARB); +		gGL.getTexUnit(0)->activate();  		disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);  		if (sShaderLevel >= SHADER_LEVEL_BUMP)  		{ @@ -343,7 +343,7 @@ void LLDrawPoolAvatar::endSkinned()  		}  	} -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  } @@ -395,7 +395,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  		return;  	} -	if (!avatarp->isFullyLoaded()) +	if (!single_avatar && !avatarp->isFullyLoaded())  	{  		/* // debug code to draw a cube in place of avatar @@ -599,22 +599,12 @@ void LLDrawPoolAvatar::renderForSelect()  	BOOL impostor = avatarp->isImpostor();  	if (impostor)  	{ -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -		glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -		glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_MODULATE); - -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PRIMARY_COLOR); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); - -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); - -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB,		GL_PRIMARY_COLOR_ARB); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB,	GL_SRC_ALPHA); +		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_COLOR); +		gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);  		avatarp->renderImpostor(color); -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  		return;  	} @@ -623,8 +613,8 @@ void LLDrawPoolAvatar::renderForSelect()  	{  		gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX];  	} -	glAlphaFunc(GL_GEQUAL, 0.2f); -	gGL.blendFunc(GL_ONE, GL_ZERO); +	gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f); +	gGL.setSceneBlendType(LLRender::BT_REPLACE);  	glColor4ubv(color.mV); @@ -645,11 +635,11 @@ void LLDrawPoolAvatar::renderForSelect()  		disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);  	} -	glAlphaFunc(GL_GREATER, 0.01f); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	// restore texture mode -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  }  //----------------------------------------------------------------------------- diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 3f52021711..1dfaf6569e 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -41,7 +41,7 @@  #include "m4math.h"  #include "v4math.h"  #include "llglheaders.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "llcubemap.h" @@ -371,17 +371,8 @@ void LLDrawPoolBump::beginShiny(bool invisible)  			cube_map->setMatrix(0);  			cube_map->bind(); -			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,	GL_COMBINE_ARB); -			 -			//use RGB from texture -			glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,	GL_REPLACE); -			glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,	GL_TEXTURE); -			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,	GL_SRC_COLOR); - -			// use alpha from color -			glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); -			glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_PRIMARY_COLOR); -			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR); +			gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_ALPHA);  		}  	}  } @@ -443,15 +434,17 @@ void LLDrawPoolBump::endShiny(bool invisible)  			}  			shader->unbind(); -			glActiveTextureARB(GL_TEXTURE0_ARB); +			gGL.getTexUnit(0)->activate();  			glEnable(GL_TEXTURE_2D);  		} - -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		if (cube_channel >= 0) +		{ +			gGL.getTexUnit(cube_channel)->setTextureBlendType(LLTexUnit::TB_MULT); +		}  	}  	LLImageGL::unbindTexture(0, GL_TEXTURE_2D); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	diffuse_channel = -1;  	cube_channel = 0; @@ -540,16 +533,16 @@ void LLDrawPoolBump::endFullbrightShiny()  		{  			shader->disableTexture(LLShaderMgr::DIFFUSE_MAP);  		} -		glActiveTextureARB(GL_TEXTURE0_ARB); +		gGL.getTexUnit(0)->activate();  		glEnable(GL_TEXTURE_2D);  		shader->unbind(); -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	}  	LLImageGL::unbindTexture(0, GL_TEXTURE_2D); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	diffuse_channel = -1;  	cube_channel = 0; @@ -614,6 +607,10 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params)  		if( tex )  		{  			bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code ); +			//------------------------------------------ +			//error check to make sure bump is valid +			llassert_always(!bump || bump->getNumRefs() == 1) ;			 +			//------------------------------------------  		}  		break; @@ -628,6 +625,11 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params)  	if (bump)  	{ +		//------------------------------------------ +		//error check to make sure bump is valid +		llassert_always(bump->getNumRefs() > 0 && bump->getNumRefs() < 100000) ; +		//------------------------------------------ +  		bump->bind(1);  		bump->bind(0);  		return TRUE; @@ -650,37 +652,18 @@ void LLDrawPoolBump::beginBump()  	// TEXTURE UNIT 0  	// Output.rgb = texture at texture coord 0 -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate(); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,	GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,	GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,	GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,	GL_SRC_ALPHA); - -	// Don't care about alpha output -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); +	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);  	// TEXTURE UNIT 1 -	glActiveTextureARB(GL_TEXTURE1_ARB); - +	gGL.getTexUnit(1)->activate(); +   	glEnable(GL_TEXTURE_2D); // Texture unit 1 -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,	GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,	GL_ADD_SIGNED_ARB); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,	GL_PREVIOUS_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,	GL_SRC_COLOR); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,	GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,	GL_ONE_MINUS_SRC_ALPHA); - -	// Don't care about alpha output -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA); +	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);  	// src	= tex0 + (1 - tex1) - 0.5  	//		= (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5 @@ -692,9 +675,8 @@ void LLDrawPoolBump::beginBump()  	//		= 2 * ((1 + bump0 - bump1) / 2) * dst   [0 - 2 * dst]  	//		= (1 + bump0 - bump1) * dst.rgb  	//		= dst.rgb + dst.rgb * (bump0 - bump1) -	gGL.blendFunc(GL_DST_COLOR, GL_SRC_COLOR); -//	gGL.blendFunc(GL_ONE, GL_ZERO);  // temp -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.setSceneBlendType(LLRender::BT_MULT_X2); +	gGL.getTexUnit(0)->activate();  	stop_glerror();  	LLViewerImage::unbindTexture(1, GL_TEXTURE_2D); @@ -728,15 +710,15 @@ void LLDrawPoolBump::endBump()  	}  	// Disable texture unit 1 -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glDisable(GL_TEXTURE_2D); // Texture unit 1 -	glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);  	// Disable texture unit 0 -	glActiveTextureARB(GL_TEXTURE0_ARB); -	glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->activate(); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); -	gGL.blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  }  //////////////////////////////////////////////////////////////// @@ -890,9 +872,15 @@ LLImageGL* LLBumpImageList::getBrightnessDarknessImage(LLViewerImage* src_image,  		{  			LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1);  			raw->clear(0x77, 0x77, 0x77, 0xFF); + +			//------------------------------  			bump = new LLImageGL( raw, TRUE); -			bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); +			//immediately assign bump to a global smart pointer in case some local smart pointer +			//accidently releases it.  			(*entries_list)[src_image->getID()] = bump; +			//------------------------------ + +			bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA);			  			// Note: this may create an LLImageGL immediately  			src_image->setLoadedCallback( callback_func, 0, TRUE, new LLUUID(src_image->getID()) ); @@ -1047,10 +1035,15 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerImage *src_vi, LLIma  				}  			} +			//---------------------------------------------------  			LLImageGL* bump = new LLImageGL( TRUE); -			bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); -			bump->createGLTexture(0, dst_image); +			//immediately assign bump to a global smart pointer in case some local smart pointer +			//accidently releases it.  			iter->second = bump; // derefs (and deletes) old image +			//--------------------------------------------------- + +			bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); +			bump->createGLTexture(0, dst_image);			  		}  		else  		{ @@ -1101,16 +1094,16 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)  	{  		if (mShiny)  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB); +			gGL.getTexUnit(0)->activate();  			glMatrixMode(GL_TEXTURE);  		}  		else  		{ -			glActiveTextureARB(GL_TEXTURE1_ARB); +			gGL.getTexUnit(1)->activate();  			glMatrixMode(GL_TEXTURE);  			glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);  			gPipeline.mTextureMatrixOps++; -			glActiveTextureARB(GL_TEXTURE0_ARB); +			gGL.getTexUnit(0)->activate();  		}  		glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); @@ -1153,13 +1146,13 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)  	{  		if (mShiny)  		{ -			glActiveTextureARB(GL_TEXTURE0_ARB); +			gGL.getTexUnit(0)->activate();  		}  		else  		{ -			glActiveTextureARB(GL_TEXTURE1_ARB); +			gGL.getTexUnit(1)->activate();  			glLoadIdentity(); -			glActiveTextureARB(GL_TEXTURE0_ARB); +			gGL.getTexUnit(0)->activate();  		}  		glLoadIdentity();  		glMatrixMode(GL_MODELVIEW); @@ -1172,9 +1165,9 @@ void LLDrawPoolInvisible::render(S32 pass)  	U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;  	glStencilMask(0); -	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); +	gGL.setColorMask(false, false);  	pushBatches(LLRenderPass::PASS_INVISIBLE, invisi_mask, FALSE); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +	gGL.setColorMask(true, false);  	glStencilMask(0xFFFFFFFF);  	if (gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY)) diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index a2a82eada5..b534886047 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -41,7 +41,7 @@  #include "pipeline.h"  #include "llspatialpartition.h"  #include "llglslshader.h" -#include "llglimmediate.h" +#include "llrender.h"  static LLGLSLShader* simple_shader = NULL; @@ -52,7 +52,7 @@ void LLDrawPoolGlow::render(S32 pass)  	LLFastTimer t(LLFastTimer::FTM_RENDER_GLOW);  	LLGLEnable blend(GL_BLEND);  	LLGLDisable test(GL_ALPHA_TEST); -	gGL.blendFunc(GL_ONE, GL_ONE); +	gGL.setSceneBlendType(LLRender::BT_ADD);  	U32 shader_level = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT); @@ -66,11 +66,11 @@ void LLDrawPoolGlow::render(S32 pass)  	}  	LLGLDepthTest depth(GL_TRUE, GL_FALSE); -	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); +	gGL.setColorMask(false, true);  	renderTexture(LLRenderPass::PASS_GLOW, getVertexDataMask()); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setColorMask(true, false); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	if (shader_level > 0 && fullbright_shader)  	{ @@ -120,7 +120,7 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass)  		// don't use shaders!  		if (gGLManager.mHasShaderObjects)  		{ -			glUseProgramObjectARB(0); +			LLGLSLShader::bindNoShader();  		}		  	}  } @@ -140,7 +140,7 @@ void LLDrawPoolSimple::render(S32 pass)  {  	LLGLDisable blend(GL_BLEND);  	LLGLState alpha_test(GL_ALPHA_TEST, gPipeline.canUseWindLightShadersOnObjects()); -	glAlphaFunc(GL_GREATER, 0.5f); +	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  	{ //render simple  		LLFastTimer t(LLFastTimer::FTM_RENDER_SIMPLE); @@ -152,7 +152,7 @@ void LLDrawPoolSimple::render(S32 pass)  		LLFastTimer t(LLFastTimer::FTM_RENDER_GRASS);  		LLGLEnable test(GL_ALPHA_TEST);  		LLGLEnable blend(GL_BLEND); -		gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +		gGL.setSceneBlendType(LLRender::BT_ALPHA);  		//render grass  		LLRenderPass::renderTexture(LLRenderPass::PASS_GRASS, getVertexDataMask());  	}			 @@ -172,6 +172,6 @@ void LLDrawPoolSimple::render(S32 pass)  		renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);  	} -	glAlphaFunc(GL_GREATER, 0.01f); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  } diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 828c9b0848..585af6c47f 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -90,7 +90,7 @@ void LLDrawPoolSky::render(S32 pass)  		{  			// Ironically, we must support shader objects to be  			// able to use this call. -			glUseProgramObjectARB(0); +			LLGLSLShader::bindNoShader();  		}  		mShader = NULL;  	} diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index c60ddbc517..854067a32d 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -52,7 +52,7 @@  #include "llworld.h"  #include "pipeline.h"  #include "llglslshader.h" -#include "llglimmediate.h" +#include "llrender.h"  const F32 DETAIL_SCALE = 1.f/16.f;  int DebugDetailMap = 0; @@ -69,14 +69,16 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerImage *texturep) :  	sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");  	sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");  	mAlphaRampImagep = gImageList.getImageFromFile("alpha_gradient.tga", -												   TRUE, TRUE, GL_ALPHA8, GL_ALPHA, -												   LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); +													TRUE, TRUE, GL_ALPHA8, GL_ALPHA, +													LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); +  	mAlphaRampImagep->bind(0);  	mAlphaRampImagep->setClamp(TRUE, TRUE);  	m2DAlphaRampImagep = gImageList.getImageFromFile("alpha_gradient_2d.j2c",  													TRUE, TRUE, GL_ALPHA8, GL_ALPHA,  													LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); +  	m2DAlphaRampImagep->bind(0);  	m2DAlphaRampImagep->setClamp(TRUE, TRUE); @@ -239,7 +241,7 @@ void LLDrawPoolTerrain::renderFullShader()  	//  	S32 detail0 = sShader->enableTexture(LLShaderMgr::TERRAIN_DETAIL0);  	LLViewerImage::bindTexture(detail_texture0p,detail0); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glEnable(GL_TEXTURE_GEN_S);  	glEnable(GL_TEXTURE_GEN_T); @@ -259,7 +261,7 @@ void LLDrawPoolTerrain::renderFullShader()  	LLViewerImage::bindTexture(detail_texture1p,detail1);  	/// ALPHA TEXTURE COORDS 0: -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glMatrixMode(GL_MODELVIEW); @@ -271,7 +273,7 @@ void LLDrawPoolTerrain::renderFullShader()  	glEnable(GL_TEXTURE_2D);  	/// ALPHA TEXTURE COORDS 1: -	glActiveTextureARB(GL_TEXTURE2_ARB); +	gGL.getTexUnit(2)->activate();  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glTranslatef(-2.f, 0.f, 0.f); @@ -284,7 +286,7 @@ void LLDrawPoolTerrain::renderFullShader()  	LLViewerImage::bindTexture(detail_texture3p,detail3);  	/// ALPHA TEXTURE COORDS 2: -	glActiveTextureARB(GL_TEXTURE3_ARB); +	gGL.getTexUnit(3)->activate();  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glTranslatef(-1.f, 0.f, 0.f); @@ -307,7 +309,7 @@ void LLDrawPoolTerrain::renderFullShader()  	sShader->disableTexture(LLShaderMgr::TERRAIN_DETAIL3);  	LLImageGL::unbindTexture(alpha_ramp, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE4_ARB);	 +	gGL.getTexUnit(4)->activate();  	glDisable(GL_TEXTURE_2D); // Texture unit 4  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T); @@ -316,7 +318,7 @@ void LLDrawPoolTerrain::renderFullShader()  	glMatrixMode(GL_MODELVIEW);  	LLImageGL::unbindTexture(detail3, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE3_ARB); +	gGL.getTexUnit(3)->activate();  	glDisable(GL_TEXTURE_2D);	  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T); @@ -325,7 +327,7 @@ void LLDrawPoolTerrain::renderFullShader()  	glMatrixMode(GL_MODELVIEW);  	LLImageGL::unbindTexture(detail2, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE2_ARB); +	gGL.getTexUnit(2)->activate();  	glDisable(GL_TEXTURE_2D);		  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T); @@ -334,7 +336,7 @@ void LLDrawPoolTerrain::renderFullShader()  	glMatrixMode(GL_MODELVIEW);  	LLImageGL::unbindTexture(detail1, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glDisable(GL_TEXTURE_2D);		  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T); @@ -346,7 +348,7 @@ void LLDrawPoolTerrain::renderFullShader()  	// Restore Texture Unit 0 defaults  	LLImageGL::unbindTexture(detail0, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glEnable(GL_TEXTURE_2D);  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T); @@ -377,7 +379,7 @@ void LLDrawPoolTerrain::renderFull4TU()  	tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);  	tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y); -	gGL.blendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); +	gGL.blendFunc(LLRender::BF_ONE_MINUS_SOURCE_ALPHA, LLRender::BF_SOURCE_ALPHA);  	//----------------------------------------------------------------------------  	// Pass 1/1 @@ -385,7 +387,7 @@ void LLDrawPoolTerrain::renderFull4TU()  	//  	// Stage 0: detail texture 0  	// -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	LLViewerImage::bindTexture(detail_texture0p,0);  	glClientActiveTextureARB(GL_TEXTURE0_ARB); @@ -397,36 +399,27 @@ void LLDrawPoolTerrain::renderFull4TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);  	//  	// Stage 1: Generate alpha ramp for detail0/detail1 transition  	// +  	LLViewerImage::bindTexture(m2DAlphaRampImagep,1); -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 1  	glClientActiveTextureARB(GL_TEXTURE1_ARB);  	glEnableClientState(GL_TEXTURE_COORD_ARRAY);  	// Care about alpha only -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);  	//  	// Stage 2: Interpolate detail1 with existing based on ramp  	//  	LLViewerImage::bindTexture(detail_texture1p,2); -	glActiveTextureARB(GL_TEXTURE2_ARB); +	gGL.getTexUnit(2)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 2  	glClientActiveTextureARB(GL_TEXTURE2_ARB); @@ -438,34 +431,20 @@ void LLDrawPoolTerrain::renderFull4TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_INTERPOLATE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB,		GL_PREVIOUS_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB,		GL_SRC_ALPHA); +	gGL.getTexUnit(2)->setTextureColorBlend(LLTexUnit::TBO_LERP_PREV_ALPHA, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_TEX_COLOR);  	//  	// Stage 3: Modulate with primary (vertex) color for lighting  	//  	LLViewerImage::bindTexture(detail_texture1p,3); // bind any texture -	glActiveTextureARB(GL_TEXTURE3_ARB); +	gGL.getTexUnit(3)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 3  	glClientActiveTextureARB(GL_TEXTURE3_ARB);  	// Set alpha texture and do lighting modulation -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); +	gGL.getTexUnit(3)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_VERT_COLOR); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glClientActiveTextureARB(GL_TEXTURE0_ARB);  	// GL_BLEND disabled by default @@ -476,7 +455,7 @@ void LLDrawPoolTerrain::renderFull4TU()  	// Stage 0: Write detail3 into base  	// -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	LLViewerImage::bindTexture(detail_texture3p,0);  	glClientActiveTextureARB(GL_TEXTURE0_ARB); @@ -488,18 +467,13 @@ void LLDrawPoolTerrain::renderFull4TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); - +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);  	//  	// Stage 1: Generate alpha ramp for detail2/detail3 transition  	//  	LLViewerImage::bindTexture(m2DAlphaRampImagep,1); -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 1  	glClientActiveTextureARB(GL_TEXTURE1_ARB); @@ -511,25 +485,20 @@ void LLDrawPoolTerrain::renderFull4TU()  	glTranslatef(-2.f, 0.f, 0.f);  	// Care about alpha only -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);  	//  	// Stage 2: Interpolate detail2 with existing based on ramp  	//  	LLViewerImage::bindTexture(detail_texture2p,2); -	glActiveTextureARB(GL_TEXTURE2_ARB); +	gGL.getTexUnit(2)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 2 -	glClientActiveTextureARB(GL_TEXTURE2_ARB); +	glClientActiveTextureARB(GL_TEXTURE2_ARB);  	glDisableClientState(GL_TEXTURE_COORD_ARRAY); +  	glEnable(GL_TEXTURE_GEN_S);  	glEnable(GL_TEXTURE_GEN_T);  	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -537,26 +506,16 @@ void LLDrawPoolTerrain::renderFull4TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_INTERPOLATE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB,		GL_PREVIOUS_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB,		GL_ONE_MINUS_SRC_ALPHA); -	 +	gGL.getTexUnit(2)->setTextureColorBlend(LLTexUnit::TBO_LERP_PREV_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);	  	//  	// Stage 3: Generate alpha ramp for detail1/detail2 transition  	//  	LLViewerImage::bindTexture(m2DAlphaRampImagep,3); -	glActiveTextureARB(GL_TEXTURE3_ARB); -	 +	gGL.getTexUnit(3)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 3 -	glClientActiveTextureARB(GL_TEXTURE3_ARB); +	glClientActiveTextureARB(GL_TEXTURE3_ARB);  	glEnableClientState(GL_TEXTURE_COORD_ARRAY);  	// Set the texture matrix @@ -565,18 +524,10 @@ void LLDrawPoolTerrain::renderFull4TU()  	glTranslatef(-1.f, 0.f, 0.f);  	// Set alpha texture and do lighting modulation -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); - -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(3)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_VERT_COLOR); +	gGL.getTexUnit(3)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); + +	gGL.getTexUnit(0)->activate();  	glClientActiveTextureARB(GL_TEXTURE0_ARB);  	{  		LLGLEnable blend(GL_BLEND); @@ -586,19 +537,21 @@ void LLDrawPoolTerrain::renderFull4TU()  	LLVertexBuffer::unbind();  	// Disable multitexture  	LLImageGL::unbindTexture(3, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE3_ARB); +	gGL.getTexUnit(3)->activate();  	glClientActiveTextureARB(GL_TEXTURE3_ARB);  	glDisableClientState(GL_TEXTURE_COORD_ARRAY);  	glDisable(GL_TEXTURE_2D); // Texture unit 3 +  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glMatrixMode(GL_MODELVIEW);  	LLImageGL::unbindTexture(2, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE2_ARB); +	gGL.getTexUnit(2)->activate();  	glClientActiveTextureARB(GL_TEXTURE2_ARB);  	glDisableClientState(GL_TEXTURE_COORD_ARRAY);  	glDisable(GL_TEXTURE_2D); // Texture unit 2 +  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T);  	glMatrixMode(GL_TEXTURE); @@ -606,33 +559,34 @@ void LLDrawPoolTerrain::renderFull4TU()  	glMatrixMode(GL_MODELVIEW);  	LLImageGL::unbindTexture(1, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE1_ARB); -	glClientActiveTextureARB(GL_TEXTURE1_ARB); -	glDisableClientState(GL_TEXTURE_COORD_ARRAY); +	gGL.getTexUnit(1)->activate(); + 	glClientActiveTextureARB(GL_TEXTURE1_ARB); + 	glDisableClientState(GL_TEXTURE_COORD_ARRAY);  	glDisable(GL_TEXTURE_2D); // Texture unit 1 +  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glMatrixMode(GL_MODELVIEW);  	// Restore blend state -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	//----------------------------------------------------------------------------  	// Restore Texture Unit 0 defaults -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);  	glClientActiveTextureARB(GL_TEXTURE0_ARB); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate(); +	glDisableClientState(GL_NORMAL_ARRAY); +  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T);  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glMatrixMode(GL_MODELVIEW); -	// Restore non Texture Unit specific defaults -	glDisableClientState(GL_NORMAL_ARRAY); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  }  void LLDrawPoolTerrain::renderFull2TU() @@ -654,7 +608,7 @@ void LLDrawPoolTerrain::renderFull2TU()  	tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);  	tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y); -	gGL.blendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); +	gGL.blendFunc(LLRender::BF_ONE_MINUS_SOURCE_ALPHA, LLRender::BF_SOURCE_ALPHA);  	//----------------------------------------------------------------------------  	// Pass 1/4 @@ -671,13 +625,7 @@ void LLDrawPoolTerrain::renderFull2TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);  	drawLoop(); @@ -693,22 +641,17 @@ void LLDrawPoolTerrain::renderFull2TU()  	glDisable(GL_TEXTURE_GEN_T);  	// Care about alpha only -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);  	//  	// Stage 1: Write detail1  	//  	LLViewerImage::bindTexture(detail_texture1p,1); // Texture unit 1 -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glEnable(GL_TEXTURE_2D);		// Texture unit 1 +  	glEnable(GL_TEXTURE_GEN_S);  	glEnable(GL_TEXTURE_GEN_T);  	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -716,18 +659,10 @@ void LLDrawPoolTerrain::renderFull2TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR); +	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	{  		LLGLEnable blend(GL_BLEND);  		drawLoop(); @@ -739,26 +674,21 @@ void LLDrawPoolTerrain::renderFull2TU()  	// Stage 0: Generate alpha ramp for detail1/detail2 transition  	//  	LLViewerImage::bindTexture(m2DAlphaRampImagep,0); +  	// Set the texture matrix  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glTranslatef(-1.f, 0.f, 0.f);  	// Care about alpha only -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);  	//  	// Stage 1: Write detail2  	// -	  	LLViewerImage::bindTexture(detail_texture2p,1); +	gGL.getTexUnit(1)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 1  	glEnable(GL_TEXTURE_GEN_S); @@ -768,16 +698,8 @@ void LLDrawPoolTerrain::renderFull2TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR); +	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA);  	{  		LLGLEnable blend(GL_BLEND); @@ -790,27 +712,22 @@ void LLDrawPoolTerrain::renderFull2TU()  	//  	// Stage 0: Generate alpha ramp for detail2/detail3 transition  	// -	LLViewerImage::bindTexture(m2DAlphaRampImagep,0); +	gGL.getTexUnit(0)->activate(); +	LLViewerImage::bindTexture(m2DAlphaRampImagep,0);	  	// Set the texture matrix  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glTranslatef(-2.f, 0.f, 0.f);  	// Care about alpha only -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);  	// Stage 1: Write detail3 -  	LLViewerImage::bindTexture(detail_texture3p,1); -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 1 +  	glEnable(GL_TEXTURE_GEN_S);  	glEnable(GL_TEXTURE_GEN_T);  	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); @@ -818,30 +735,24 @@ void LLDrawPoolTerrain::renderFull2TU()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR); +	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	{  		LLGLEnable blend(GL_BLEND);  		drawLoop();  	}  	// Restore blend state -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	// Disable multitexture +	  	LLImageGL::unbindTexture(1, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glDisable(GL_TEXTURE_2D); // Texture unit 1 +  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T);  	glMatrixMode(GL_TEXTURE); @@ -851,18 +762,16 @@ void LLDrawPoolTerrain::renderFull2TU()  	//----------------------------------------------------------------------------  	// Restore Texture Unit 0 defaults -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	LLImageGL::unbindTexture(0, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T);  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glMatrixMode(GL_MODELVIEW); - -	// Restore non Texture Unit specific defaults -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  } @@ -877,7 +786,7 @@ void LLDrawPoolTerrain::renderSimple()  	mTexturep->addTextureStats(1024.f*1024.f);  	mTexturep->bind(0); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 2  	LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent(); @@ -892,13 +801,7 @@ void LLDrawPoolTerrain::renderSimple()  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);  	drawLoop(); @@ -906,15 +809,13 @@ void LLDrawPoolTerrain::renderSimple()  	// Restore Texture Unit 0 defaults  	LLImageGL::unbindTexture(0, GL_TEXTURE_2D); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glDisable(GL_TEXTURE_GEN_S);  	glDisable(GL_TEXTURE_GEN_T);  	glMatrixMode(GL_TEXTURE);  	glLoadIdentity();  	glMatrixMode(GL_MODELVIEW); - -	// Restore non Texture Unit specific defaults -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  }  //============================================================================ diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index eabc0f1268..1ebd0772a8 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -41,7 +41,7 @@  #include "pipeline.h"  #include "llviewercamera.h"  #include "llglslshader.h" -#include "llglimmediate.h" +#include "llrender.h"  S32 LLDrawPoolTree::sDiffTex = 0;  static LLGLSLShader* shader = NULL; @@ -67,7 +67,7 @@ void LLDrawPoolTree::prerender()  void LLDrawPoolTree::beginRenderPass(S32 pass)  {  	LLFastTimer t(LLFastTimer::FTM_RENDER_TREES); -	glAlphaFunc(GL_GREATER, 0.5f); +	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  	if (LLPipeline::sUnderWaterRender)  	{ @@ -106,7 +106,7 @@ void LLDrawPoolTree::render(S32 pass)  void LLDrawPoolTree::endRenderPass(S32 pass)  {  	LLFastTimer t(LLFastTimer::FTM_RENDER_TREES); -	glAlphaFunc(GL_GREATER, 0.01f); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	if (gPipeline.canUseWindLightShadersOnObjects())  	{ @@ -125,28 +125,18 @@ void LLDrawPoolTree::renderForSelect()  	LLGLSObjectSelectAlpha gls_alpha; -	gGL.blendFunc(GL_ONE, GL_ZERO); -	glAlphaFunc(GL_GREATER, 0.5f); +	gGL.setSceneBlendType(LLRender::BT_REPLACE); +	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_MODULATE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);  	renderTree(TRUE); -	glAlphaFunc(GL_GREATER, 0.01f); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	gGL.setSceneBlendType(LLRender::BT_ALPHA); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  }  void LLDrawPoolTree::renderTree(BOOL selecting) diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 9ffa552895..e76423c8eb 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -37,6 +37,7 @@  #include "lldir.h"  #include "llerror.h"  #include "m3math.h" +#include "llrender.h"  #include "llagent.h"		// for gAgent for getRegion for getWaterHeight  #include "llcubemap.h" @@ -166,7 +167,7 @@ void LLDrawPoolWater::render(S32 pass)  	// Set up second pass first  	mWaterImagep->addTextureStats(1024.f*1024.f);  	mWaterImagep->bind(1); -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glEnable(GL_TEXTURE_2D); // Texture unit 1 @@ -198,18 +199,10 @@ void LLDrawPoolWater::render(S32 pass)  	glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);  	glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_MODULATE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_REPLACE); +	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_PREVIOUS_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); - -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glClearStencil(1);  	glClear(GL_STENCIL_BUFFER_BIT); @@ -230,14 +223,14 @@ void LLDrawPoolWater::render(S32 pass)  	}  	// Now, disable texture coord generation on texture state 1 -	glActiveTextureARB(GL_TEXTURE1_ARB); +	gGL.getTexUnit(1)->activate();  	glDisable(GL_TEXTURE_2D); // Texture unit 1  	glDisable(GL_TEXTURE_GEN_S); //texture unit 1  	glDisable(GL_TEXTURE_GEN_T); //texture unit 1  	LLImageGL::unbindTexture(1, GL_TEXTURE_2D);  	// Disable texture coordinate and color arrays -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	LLImageGL::unbindTexture(0, GL_TEXTURE_2D);  	stop_glerror(); @@ -258,7 +251,7 @@ void LLDrawPoolWater::render(S32 pass)  		glMatrixMode(GL_MODELVIEW);  		LLOverrideFaceColor overrid(this, 1.f, 1.f, 1.f,  0.5f*up_dot); -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  		for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();  			 iter != mDrawFace.end(); iter++) @@ -276,7 +269,7 @@ void LLDrawPoolWater::render(S32 pass)  			}  		} -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  		if (gSky.mVOSkyp->getCubeMap())  		{ @@ -298,7 +291,7 @@ void LLDrawPoolWater::render(S32 pass)  		renderReflection(refl_face);  	} -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  }  void LLDrawPoolWater::renderReflection(LLFace* face) @@ -331,7 +324,7 @@ void LLDrawPoolWater::renderReflection(LLFace* face)  void LLDrawPoolWater::shade()  { -	glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); +	gGL.setColorMask(true, true);  	LLVOSky *voskyp = gSky.mVOSkyp; @@ -396,9 +389,9 @@ void LLDrawPoolWater::shade()  	if (reftex > -1)  	{ -		glActiveTextureARB(GL_TEXTURE0_ARB+reftex); +		gGL.getTexUnit(reftex)->activate();  		gPipeline.mWaterRef.bindTexture(); -		glActiveTextureARB(GL_TEXTURE0_ARB); +		gGL.getTexUnit(0)->activate();  	}	  	//bind normal map @@ -414,14 +407,8 @@ void LLDrawPoolWater::shade()  	mWaterNormp->addTextureStats(1024.f*1024.f);  	mWaterNormp->bind(bumpTex); -	if (!gSavedSettings.getBOOL("RenderWaterMipNormal")) -	{ -		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -	} -	else -	{ -		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); -	} +	mWaterNormp->setMipFilterNearest (mWaterNormp->getMipFilterNearest(), +									  !gSavedSettings.getBOOL("RenderWaterMipNormal"));  	S32 screentex = shader->enableTexture(LLShaderMgr::WATER_SCREENTEX);	  	stop_glerror(); @@ -548,9 +535,9 @@ void LLDrawPoolWater::shade()  	shader->disableTexture(LLShaderMgr::WATER_SCREENDEPTH);  	shader->unbind(); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	glEnable(GL_TEXTURE_2D); -	glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); +	gGL.setColorMask(true, false);  } diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index e2d0c6088a..09a87f2402 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -44,7 +44,7 @@  #include "llagent.h"  #include "llviewerregion.h"  #include "llface.h" -#include "llglimmediate.h" +#include "llrender.h"  LLPointer<LLImageGL> LLDrawPoolWLSky::sCloudNoiseTexture = NULL; @@ -153,7 +153,7 @@ void LLDrawPoolWLSky::renderStars(void) const  {  	LLGLSPipelineSkyBox gls_sky;  	LLGLEnable blend(GL_BLEND); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	// *NOTE: have to have bound the cloud noise texture already since register  	// combiners blending below requires something to be bound @@ -176,16 +176,8 @@ void LLDrawPoolWLSky::renderStars(void) const  	// gl_FragColor.rgb = gl_Color.rgb;  	// gl_FragColor.a = gl_Color.a * star_alpha.a; -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_MODULATE); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB, GL_CONSTANT); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB, GL_SRC_ALPHA); -	glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 2.0f); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_PREV_ALPHA, LLTexUnit::TBS_CONST_ALPHA);  	glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV);  	gSky.mVOWLSkyp->drawStars(); @@ -193,8 +185,7 @@ void LLDrawPoolWLSky::renderStars(void) const  	glPointSize(1.f);  	// and disable the combiner states -	glTexEnvf(GL_TEXTURE_ENV, GL_ALPHA_SCALE, 1.0f); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  }  void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const @@ -208,7 +199,7 @@ void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const  		LLGLEnable blend(GL_BLEND);  		LLGLSBlendFunc blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -		glAlphaFunc(GL_GREATER, 0.01f); +		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  		sCloudNoiseTexture->bind();  		shader->bind(); diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index 7b88349ef4..039ed2862f 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -40,9 +40,7 @@  #include "llviewerimage.h"  #include "llvertexbuffer.h"  #include "llviewerdisplay.h" -#include "llglimmediate.h" - -void render_ui_and_swap_if_needed(); +#include "llrender.h"  // static  LLDynamicTexture::instance_list_t LLDynamicTexture::sInstances[ LLDynamicTexture::ORDER_COUNT ]; @@ -219,9 +217,8 @@ BOOL LLDynamicTexture::updateAllInstances()  			LLDynamicTexture *dynamicTexture = *iter;  			if (dynamicTexture->needsRender())  			{ -				render_ui_and_swap_if_needed();  				glClear(GL_DEPTH_BUFFER_BIT); -				gDisplaySwapBuffers = FALSE; +				gDepthDirty = TRUE;  				gGL.color4f(1,1,1,1); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 723477a833..8474762d9b 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -42,7 +42,7 @@  #include "lldrawpoolbump.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "lllightconstants.h"  #include "llsky.h"  #include "llviewercamera.h" @@ -57,6 +57,7 @@  extern BOOL gPickFaces;  BOOL LLFace::sSafeRenderSelect = TRUE; // FALSE +S32  LLFace::sDeleteLock = 0 ;  #define DOTVEC(a,b) (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2]) @@ -177,6 +178,9 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)  void LLFace::destroy()  { +	llassert_always(sDeleteLock >= 1); +	--sDeleteLock; +	  	mDrawablep = NULL;  	mVObjp = NULL; @@ -468,6 +472,7 @@ void LLFace::renderSelectedUV(const S32 offset, const S32 count)  			if (pass == 0)  			{  				LLViewerImage::bindTexture(red_blue_imagep); +				red_blue_imagep->setMipFilterNearest (TRUE, TRUE);  			}  			else // pass == 1  			{ @@ -476,9 +481,8 @@ void LLFace::renderSelectedUV(const S32 offset, const S32 count)  				glMatrixMode(GL_TEXTURE);  				glPushMatrix();  				glScalef(256.f, 256.f, 1.f); +				green_imagep->setMipFilterNearest (TRUE, TRUE);  			} -			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);  			if (!isState(GLOBAL)) diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 070283ecd2..34c81c3fdd 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -34,6 +34,7 @@  #include "llstrider.h" +#include "llrender.h"  #include "v2math.h"  #include "v3math.h"  #include "v4math.h" @@ -295,6 +296,9 @@ public:  				lhs->getTexture() < rhs->getTexture();  		}  	}; + +public://paranoia check only +	static S32 sDeleteLock ;  };  #endif // LL_LLFACE_H diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 8133c20bf7..ad89d8220f 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -37,7 +37,7 @@  #include "llrect.h"  #include "llerror.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llmath.h"  #include "llfontgl.h" diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index c07319e224..3cd1158ec0 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -37,6 +37,7 @@  #include "indra_constants.h"  // viewer includes +#include "llagent.h"	// for gAgent.inPrelude()  #include "llnotify.h"  #include "llviewercontrol.h"  #include "llui.h" @@ -107,12 +108,14 @@ void LLFirstUse::useBalanceDecrease(S32 delta)  // static  void LLFirstUse::useSit()  { -	if (gSavedSettings.getWarning("FirstSit")) -	{ -		gSavedSettings.setWarning("FirstSit", FALSE); - -		LLNotifyBox::showXml("FirstSit"); -	} +	// Our orientation island uses sitting to teach vehicle driving +	// so just never show this message. JC +	//if (gSavedSettings.getWarning("FirstSit")) +	//{ +	//	gSavedSettings.setWarning("FirstSit", FALSE); + +	//	LLNotifyBox::showXml("FirstSit"); +	//}  }  // static @@ -168,11 +171,16 @@ void LLFirstUse::useTeleport()  // static  void LLFirstUse::useOverrideKeys()  { -	if (gSavedSettings.getWarning("FirstOverrideKeys")) +	// Our orientation island uses key overrides to teach vehicle driving +	// so don't show this message until you get off OI. JC +	if (!gAgent.inPrelude())  	{ -		gSavedSettings.setWarning("FirstOverrideKeys", FALSE); +		if (gSavedSettings.getWarning("FirstOverrideKeys")) +		{ +			gSavedSettings.setWarning("FirstOverrideKeys", FALSE); -		LLNotifyBox::showXml("FirstOverrideKeys"); +			LLNotifyBox::showXml("FirstOverrideKeys"); +		}  	}  } diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index 248e680c1b..b59648f433 100644 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -305,7 +305,7 @@ BOOL LLVolumeImplFlexible::doIdleUpdate(LLAgent &agent, LLWorld &world, const F6  		new_res = mRenderRes;  	} -	if (!mInitialized) +	if (!mInitialized || (mSimulateRes != new_res))  	{  		mSimulateRes = new_res;  		setAttributesOfAllSections(); diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index d9411b58d8..1e0ebb7248 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -46,7 +46,7 @@  #include "llcombobox.h"  #include "lldrawable.h"  #include "lldrawpoolavatar.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llface.h"  #include "llkeyframemotion.h"  #include "lllineeditor.h" @@ -1037,7 +1037,7 @@ LLPreviewAnimation::LLPreviewAnimation(S32 width, S32 height) : LLDynamicTexture  	mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion());  	mDummyAvatar->createDrawable(&gPipeline);  	mDummyAvatar->mIsDummy = TRUE; -	mDummyAvatar->mSpecialRenderMode = 1; +	mDummyAvatar->mSpecialRenderMode = 2;  	mDummyAvatar->setPositionAgent(LLVector3::zero);  	mDummyAvatar->slamPosition();  	mDummyAvatar->updateJointLODs(); @@ -1135,6 +1135,7 @@ BOOL	LLPreviewAnimation::render()  	if (avatarp->mDrawable.notNull())  	{  		LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool(); +		avatarp->dirtyMesh();  		avatarPoolp->renderAvatars(avatarp);  // renders only one avatar  	} diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 33925fa305..41bc0db6a6 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -53,7 +53,7 @@  #include "llviewerdisplay.h"  #include "llviewercontrol.h"  #include "llui.h" -#include "llglimmediate.h" +#include "llrender.h"  ///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 9741fbb7c7..1ab42efef3 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -375,7 +375,7 @@ void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price)  	{  		LLStringBase<char>::format_map_t args;  		args["[NAME]"] = name.c_str(); -		args["[PRICE]"] = price; +		args["[PRICE]"] = llformat("%d", price);  		gViewerWindow->alertXml("NotEnoughCurrency", args);  		return;  	} diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 4d8f85159f..936aad6606 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -62,7 +62,7 @@  #include "llwindow.h"  #include "llworld.h"  #include "llxmlrpctransaction.h" -#include "llappviewer.h" +#include "llviewernetwork.h"  #include "roles_constants.h"  // NOTE: This is duplicated in lldatamoney.cpp ... @@ -841,7 +841,7 @@ void LLFloaterBuyLandUI::startTransaction(TransactionType type,  	static std::string transaction_uri;  	if (transaction_uri.empty())  	{ -		transaction_uri = LLAppViewer::instance()->getHelperURI() + "landtool.php"; +		transaction_uri = LLViewerLogin::getInstance()->getHelperURI() + "landtool.php";  	}  	const char* method; @@ -1363,3 +1363,4 @@ void LLFloaterBuyLandUI::onClickErrorWeb(void* data)  } + diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp index 3aaa14ab73..fd428990f8 100644 --- a/indra/newview/llfloaterchat.cpp +++ b/indra/newview/llfloaterchat.cpp @@ -207,7 +207,8 @@ void add_timestamped_line(LLViewerTextEditor* edit, const LLChat &chat, const LL  	{  		line = line.substr(chat.mFromName.length());  		const LLStyleSP &sourceStyle = LLStyleMap::instance().lookup(chat.mFromID); -		edit->appendStyledText(chat.mFromName, false, false, &sourceStyle); +		edit->appendStyledText(chat.mFromName, false, prepend_newline, &sourceStyle); +		prepend_newline = false;  	}  	edit->appendColoredText(line, false, prepend_newline, color);  } diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 5f6bf1cd28..ec659b5146 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -39,7 +39,7 @@  #include "llfontgl.h"  #include "llsys.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "v3dmath.h"  #include "lldir.h"  #include "llui.h" diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 790af61264..830b38faf8 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -43,7 +43,7 @@  #include "llcombobox.h"  #include "lldrawable.h"  #include "lldrawpoolavatar.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llface.h"  #include "lltextbox.h"  #include "lltoolmgr.h" diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 9ff5739255..925ba0156d 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -1147,7 +1147,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()  		{  			LLString::format_map_t args; -			args["[TEXTURE_NUM]"] = i+1; +			args["[TEXTURE_NUM]"] = llformat("%d",i+1);  			args["[TEXTURE_SIZE_X]"] = llformat("%d",width);  			args["[TEXTURE_SIZE_Y]"] = llformat("%d",height);  			gViewerWindow->alertXml("InvalidTerrainSize", args); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 25b8abefc7..369ac4f3ee 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -81,7 +81,7 @@  #include "llselectmgr.h"  #include "llviewerbuild.h"  #include "lluictrlfactory.h" -#include "llappviewer.h" +#include "llviewernetwork.h"  #include "llassetuploadresponders.h" @@ -656,7 +656,7 @@ LLSD LLFloaterReporter::gatherReport()  	mCopyrightWarningSeen = FALSE;  	std::ostringstream summary; -    if (!LLAppViewer::instance()->isInProductionGrid()) +	if (!LLViewerLogin::getInstance()->isInProductionGrid())  	{  		summary << "Preview ";  	} @@ -898,7 +898,7 @@ void LLFloaterReporter::takeScreenshot()  						mResourceDatap->mAssetInfo.mType);  	// store in the image list so it doesn't try to fetch from the server -	LLViewerImage* image_in_list = new LLViewerImage(mResourceDatap->mAssetInfo.mUuid, TRUE); +	LLPointer<LLViewerImage> image_in_list = new LLViewerImage(mResourceDatap->mAssetInfo.mUuid, TRUE);  	image_in_list->createGLTexture(0, raw);  	gImageList.addImage(image_in_list);  diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index b2301808a1..7dd4f293c4 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -36,7 +36,7 @@  #include "llfontgl.h"  #include "llsys.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "v3dmath.h"  #include "llmath.h"  #include "lldir.h" diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 6b51687c68..af3321c814 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -215,7 +215,7 @@ LLFloaterTOS::~LLFloaterTOS()  	LLWebBrowserCtrl* web_browser = getChild<LLWebBrowserCtrl>("tos_html");  	if ( web_browser )  	{ -		web_browser->addObserver( this );		 +		web_browser->remObserver( this );		  	};  	// tell the responder we're not here anymore diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 848d01d5ac..401cc9fc6c 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -871,6 +871,8 @@ void LLFloaterWorldMap::buildLandmarkIDLists()  	{  		list->selectItemRange(1, -1);  		list->operateOnSelection(LLCtrlListInterface::OP_DELETE); + +		llassert_always(list->getItemCount() == 1) ;  	}  	mLandmarkItemIDList.reset(); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index c26a8dfc55..a514d9b997 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -40,7 +40,7 @@  #include "llfocusmgr.h"  #include "llfontgl.h"  #include "llgl.h"  -#include "llglimmediate.h" +#include "llrender.h"  #include "llinventory.h"  #include "llcallbacklist.h" @@ -349,10 +349,10 @@ void LLFolderViewItem::arrangeFromRoot()  // UI. If open is TRUE, then folders are opened up along the way to  // the selection.  void LLFolderViewItem::setSelectionFromRoot(LLFolderViewItem* selection, -											BOOL open,					/* Flawfinder: ignore */ +											BOOL openitem,  											BOOL take_keyboard_focus)  { -	getRoot()->setSelection(selection, open, take_keyboard_focus);		/* Flawfinder: ignore */ +	getRoot()->setSelection(selection, openitem, take_keyboard_focus);  }  // helper function to change the selection from the root. @@ -368,7 +368,7 @@ void LLFolderViewItem::extendSelectionFromRoot(LLFolderViewItem* selection)  	getRoot()->extendSelection(selection, NULL, selected_items);  } -EInventorySortGroup LLFolderViewItem::getSortGroup()  +EInventorySortGroup LLFolderViewItem::getSortGroup()  const  {   	return SG_ITEM;   } @@ -442,7 +442,7 @@ void LLFolderViewItem::dirtyFilter()  // means 'deselect' for a leaf item. Do this optimization after  // multiple selection is implemented to make sure it all plays nice  // together. -BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL open, BOOL take_keyboard_focus) +BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus)  {  	if( selection == this )  	{ @@ -548,7 +548,7 @@ void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)  	}  } -void LLFolderViewItem::open( void )		/* Flawfinder: ignore */ +void LLFolderViewItem::openItem( void )  {  	if( mListener )  	{ @@ -989,9 +989,6 @@ LLFolderViewFolder::LLFolderViewFolder( const LLString& name, LLUIImagePtr icon,  	mMostFilteredDescendantGeneration(-1)  {  	mType = "(folder)"; - -	//mItems.setInsertBefore( &sort_item_name ); -	//mFolders.setInsertBefore( &folder_insert_before );  }  // Destroys the object @@ -1000,10 +997,6 @@ LLFolderViewFolder::~LLFolderViewFolder( void )  	// The LLView base class takes care of object destruction. make sure that we  	// don't have mouse or keyboard focus  	gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit() - -	//mItems.reset(); -	//mItems.removeAllNodes(); -	//mFolders.removeAllNodes();  }  // addToFolder() returns TRUE if it succeeds. FALSE otherwise @@ -1048,9 +1041,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)  			// Add sizes of children  			S32 parent_item_height = getRect().getHeight(); -			folders_t::iterator fit = mFolders.begin(); -			folders_t::iterator fend = mFolders.end(); -			for(; fit < fend; ++fit) +			for(folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)  			{  				LLFolderViewFolder* folderp = (*fit);  				if (getRoot()->getDebugFilters()) @@ -1076,9 +1067,8 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)  					folderp->setOrigin( 0, child_top - folderp->getRect().getHeight() );  				}  			} -			items_t::iterator iit = mItems.begin(); -			items_t::iterator iend = mItems.end(); -			for(;iit < iend; ++iit) +			for(items_t::iterator iit = mItems.begin(); +				iit != mItems.end(); ++iit)  			{  				LLFolderViewItem* itemp = (*iit);  				if (getRoot()->getDebugFilters()) @@ -1354,7 +1344,7 @@ BOOL LLFolderViewFolder::hasFilteredDescendants()  // Passes selection information on to children and record selection  // information if necessary. -BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL open,		/* Flawfinder: ignore */ +BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem,  									  BOOL take_keyboard_focus)  {  	BOOL rv = FALSE; @@ -1378,7 +1368,7 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL open,		/  		 iter != mFolders.end();)  	{  		folders_t::iterator fit = iter++; -		if((*fit)->setSelection(selection, open, take_keyboard_focus))		/* Flawfinder: ignore */ +		if((*fit)->setSelection(selection, openitem, take_keyboard_focus))  		{  			rv = TRUE;  			child_selected = TRUE; @@ -1389,14 +1379,14 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL open,		/  		 iter != mItems.end();)  	{  		items_t::iterator iit = iter++; -		if((*iit)->setSelection(selection, open, take_keyboard_focus))		/* Flawfinder: ignore */ +		if((*iit)->setSelection(selection, openitem, take_keyboard_focus))  		{  			rv = TRUE;  			child_selected = TRUE;  			mNumDescendantsSelected++;  		}  	} -	if(open && child_selected)		/* Flawfinder: ignore */ +	if(openitem && child_selected)  	{  		setOpenArrangeRecursively(TRUE);  	} @@ -1636,11 +1626,9 @@ void LLFolderViewFolder::destroyView()  	while (!mFolders.empty())  	{  		LLFolderViewFolder *folderp = mFolders.back(); -		folderp->destroyView(); +		folderp->destroyView(); // removes entry from mFolders  	} -	mFolders.clear(); -  	deleteAllChildren();  	if (mParentFolder) @@ -1711,11 +1699,11 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )  // This is only called for renaming an object because it won't work for date  void LLFolderViewFolder::resort(LLFolderViewItem* item)  { -	std::sort(mItems.begin(), mItems.end(), mSortFunction); -	std::sort(mFolders.begin(), mFolders.end(), mSortFunction); +	mItems.sort(mSortFunction); +	mFolders.sort(mSortFunction);  } -bool LLFolderViewFolder::isTrash() +bool LLFolderViewFolder::isTrash() const  {  	if (mAmTrash == LLFolderViewFolder::UNKNOWN)  	{ @@ -1740,8 +1728,8 @@ void LLFolderViewFolder::sortBy(U32 order)  		(*fit)->sortBy(order);  	} -	std::sort(mFolders.begin(), mFolders.end(), mSortFunction); -	std::sort(mItems.begin(), mItems.end(), mSortFunction); +	mFolders.sort(mSortFunction); +	mItems.sort(mSortFunction);  	if (order & LLInventoryFilter::SO_DATE)  	{ @@ -1776,12 +1764,12 @@ void LLFolderViewFolder::setItemSortOrder(U32 ordering)  			(*fit)->setItemSortOrder(ordering);  		} -		std::sort(mFolders.begin(), mFolders.end(), mSortFunction); -		std::sort(mItems.begin(), mItems.end(), mSortFunction); +		mFolders.sort(mSortFunction); +		mItems.sort(mSortFunction);  	}  } -EInventorySortGroup LLFolderViewFolder::getSortGroup() +EInventorySortGroup LLFolderViewFolder::getSortGroup() const  {  	if (isTrash())  	{ @@ -1928,16 +1916,16 @@ void LLFolderViewFolder::toggleOpen()  }  // Force a folder open or closed -void LLFolderViewFolder::setOpen(BOOL open)		/* Flawfinder: ignore */ +void LLFolderViewFolder::setOpen(BOOL openitem)  { -	setOpenArrangeRecursively(open);		/* Flawfinder: ignore */ +	setOpenArrangeRecursively(openitem);  } -void LLFolderViewFolder::setOpenArrangeRecursively(BOOL open, ERecurseType recurse)		/* Flawfinder: ignore */ +void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse)  {  	BOOL was_open = mIsOpen; -	mIsOpen = open;		/* Flawfinder: ignore */ -	if(!was_open && open)		/* Flawfinder: ignore */ +	mIsOpen = openitem; +	if(!was_open && openitem)  	{  		if(mListener)  		{ @@ -1951,12 +1939,12 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL open, ERecurseType recur  			 iter != mFolders.end();)  		{  			folders_t::iterator fit = iter++; -			(*fit)->setOpenArrangeRecursively(open, RECURSE_DOWN);		/* Flawfinder: ignore */ +			(*fit)->setOpenArrangeRecursively(openitem, RECURSE_DOWN);		/* Flawfinder: ignore */  		}  	}  	if (mParentFolder && (recurse == RECURSE_UP || recurse == RECURSE_UP_DOWN))  	{ -		mParentFolder->setOpenArrangeRecursively(open, RECURSE_UP);		/* Flawfinder: ignore */ +		mParentFolder->setOpenArrangeRecursively(openitem, RECURSE_UP);  	}  	if (was_open != mIsOpen) @@ -1989,7 +1977,7 @@ BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask,  	return TRUE;  } -void LLFolderViewFolder::open( void )		/* Flawfinder: ignore */ +void LLFolderViewFolder::openItem( void )  {  	toggleOpen();  } @@ -2687,10 +2675,10 @@ void LLFolderView::openFolder(const LLString& foldername)  	}  } -void LLFolderView::setOpenArrangeRecursively(BOOL open, ERecurseType recurse)		/* Flawfinder: ignore */ +void LLFolderView::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse)  {  	// call base class to do proper recursion -	LLFolderViewFolder::setOpenArrangeRecursively(open, recurse);		/* Flawfinder: ignore */ +	LLFolderViewFolder::setOpenArrangeRecursively(openitem, recurse);  	// make sure root folder is always open  	mIsOpen = TRUE;  } @@ -2866,7 +2854,7 @@ LLFolderViewItem* LLFolderView::getCurSelectedItem( void )  // Record the selected item and pass it down the hierachy. -BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL open,		/* Flawfinder: ignore */ +BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL openitem,  								BOOL take_keyboard_focus)  {  	if( selection == this ) @@ -2888,8 +2876,8 @@ BOOL LLFolderView::setSelection(LLFolderViewItem* selection, BOOL open,		/* Flaw  		addToSelectionList(selection);  	} -	BOOL rv = LLFolderViewFolder::setSelection(selection, open, take_keyboard_focus); -	if(open && selection) +	BOOL rv = LLFolderViewFolder::setSelection(selection, openitem, take_keyboard_focus); +	if(openitem && selection)  	{  		selection->getParentFolder()->requestArrange();  	} @@ -3349,7 +3337,7 @@ void LLFolderView::openSelectedItems( void )  	{  		if (mSelectedItems.size() == 1)  		{ -			mSelectedItems.front()->open();		/* Flawfinder: ignore */ +			mSelectedItems.front()->openItem();  		}  		else  		{ @@ -3371,7 +3359,7 @@ void LLFolderView::openSelectedItems( void )  					LLFloater::setFloaterHost(multi_propertiesp);  				else  					LLFloater::setFloaterHost(multi_previewp); -				(*item_it)->open(); +				(*item_it)->openItem();  			}  			LLFloater::setFloaterHost(NULL); @@ -4358,7 +4346,7 @@ bool LLInventorySort::updateSort(U32 order)  	return false;  } -bool LLInventorySort::operator()(LLFolderViewItem* a, LLFolderViewItem* b) +bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b)  {  	// We sort by name if we aren't sorting by date  	// OR if these are folders and we are sorting folders by name. diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 8a04cc9b9c..c6b1e52157 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -295,7 +295,7 @@ public:  	bool updateSort(U32 order);  	U32 getSort() { return mSortOrder; } -	bool operator()(LLFolderViewItem* a, LLFolderViewItem* b); +	bool operator()(const LLFolderViewItem* const& a, const LLFolderViewItem* const& b);  private:  	U32  mSortOrder;  	bool mByDate; @@ -361,7 +361,7 @@ protected:  	// the specified selected item appropriately for display and use  	// in the UI. If open is TRUE, then folders are opened up along  	// the way to the selection. -	void setSelectionFromRoot(LLFolderViewItem* selection, BOOL open,		/* Flawfinder: ignore */ +	void setSelectionFromRoot(LLFolderViewItem* selection, BOOL openitem,  		BOOL take_keyboard_focus = TRUE);  	// helper function to change the selection from the root. @@ -390,7 +390,7 @@ public:  	enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE };  	virtual BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root); -	virtual EInventorySortGroup getSortGroup(); +	virtual EInventorySortGroup getSortGroup() const;  	// Finds width and height of this object and it's children.  Also  	// makes sure that this view and it's children are the right size. @@ -409,7 +409,7 @@ public:  	// ignore. Returns TRUE if this object was affected. If open is  	// TRUE, then folders are opened up along the way to the  	// selection. -	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL open,		/* Flawfinder: ignore */ +	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,  		BOOL take_keyboard_focus);  	// This method is used to toggle the selection of an item. If @@ -479,7 +479,7 @@ public:  	void rename(const LLString& new_name);  	// open -	virtual void open( void );		/* Flawfinder: ignore */ +	virtual void openItem( void );  	virtual void preview(void);  	// Show children (unfortunate that this is called "open") @@ -544,8 +544,8 @@ public:  	} ETrash;  protected: -	typedef std::vector<LLFolderViewItem*> items_t; -	typedef std::vector<LLFolderViewFolder*> folders_t; +	typedef std::list<LLFolderViewItem*> items_t; +	typedef std::list<LLFolderViewFolder*> folders_t;  	items_t mItems;  	folders_t mFolders;  	LLInventorySort	mSortFunction; @@ -556,7 +556,7 @@ protected:  	F32			mTargetHeight;  	F32			mAutoOpenCountdown;  	time_t		mSubtreeCreationDate; -	ETrash		mAmTrash; +	mutable ETrash mAmTrash;  	S32			mLastArrangeGeneration;  	S32			mLastCalculatedWidth;  	S32			mCompletedFilterGeneration; @@ -590,7 +590,7 @@ public:  	BOOL needsArrange();  	// Returns the sort group (system, trash, folder) for this folder. -	virtual EInventorySortGroup getSortGroup(); +	virtual EInventorySortGroup getSortGroup() const;  	virtual void	setCompletedFilterGeneration(S32 generation, BOOL recurse_up);  	virtual S32		getCompletedFilterGeneration() { return mCompletedFilterGeneration; } @@ -606,8 +606,8 @@ public:  	// Passes selection information on to children and record  	// selection information if necessary. Returns TRUE if this object  	// (or a child) was affected. -	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL open,		/* Flawfinder: ignore */ -		BOOL take_keyboard_focus); +	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, +							  BOOL take_keyboard_focus);  	// This method is used to change the selection of an item. If  	// selection is 'this', then note selection as true. Returns TRUE @@ -660,7 +660,7 @@ public:  	virtual void toggleOpen();  	// Force a folder open or closed -	virtual void setOpen(BOOL open = TRUE);		/* Flawfinder: ignore */ +	virtual void setOpen(BOOL openitem = TRUE);  	// Called when a child is refreshed.  	// don't rearrange child folder contents unless explicitly requested @@ -670,7 +670,7 @@ public:  	// method was written because the list iterators destroy the state  	// of other iterations, thus, we can't arrange while iterating  	// through the children (such as when setting which is selected. -	virtual void setOpenArrangeRecursively(BOOL open, ERecurseType recurse = RECURSE_NO);		/* Flawfinder: ignore */ +	virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse = RECURSE_NO);  	// Get the current state of the folder.  	virtual BOOL isOpen() { return mIsOpen; } @@ -686,7 +686,7 @@ public:  	void applyFunctorRecursively(LLFolderViewFunctor& functor);  	virtual void applyListenerFunctorRecursively(LLFolderViewListenerFunctor& functor); -	virtual void open( void );		/* Flawfinder: ignore */ +	virtual void openItem( void );  	virtual BOOL addItem(LLFolderViewItem* item);   	virtual BOOL addFolder( LLFolderViewFolder* folder); @@ -703,7 +703,7 @@ public:  	virtual void draw();  	time_t getCreationDate() const; -	bool isTrash(); +	bool isTrash() const;  }; @@ -752,7 +752,7 @@ public:  	void openFolder(const LLString& foldername);  	virtual void toggleOpen() {}; -	virtual void setOpenArrangeRecursively(BOOL open, ERecurseType recurse);		/* Flawfinder: ignore */ +	virtual void setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse);  	virtual BOOL addFolder( LLFolderViewFolder* folder);  	// Finds width and height of this object and it's children.  Also @@ -769,7 +769,7 @@ public:  	virtual LLFolderViewItem* getCurSelectedItem( void );  	// Record the selected item and pass it down the hierachy. -	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL open,		/* Flawfinder: ignore */ +	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,  		BOOL take_keyboard_focus);  	// This method is used to toggle the selection of an item. Walks diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 21b98d6038..f4ef00d310 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -39,7 +39,7 @@  #include "llviewercontrol.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llglheaders.h"  #include "llparcel.h"  #include "llui.h" diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index f48a404a61..432096e781 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -33,7 +33,7 @@  #include "llhudeffectlookat.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "message.h"  #include "llagent.h" diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp index 72fe1b2e08..93344db622 100644 --- a/indra/newview/llhudeffectpointat.cpp +++ b/indra/newview/llhudeffectpointat.cpp @@ -34,7 +34,7 @@  #include "llhudeffectpointat.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "lldrawable.h" diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp index cbb9fb8619..4cfd556ead 100644 --- a/indra/newview/llhudicon.cpp +++ b/indra/newview/llhudicon.cpp @@ -34,7 +34,7 @@  #include "llhudicon.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llviewerobject.h"  #include "lldrawable.h" diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 2529010857..df03f8d45e 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -33,7 +33,7 @@  #include "llhudtext.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "llviewercontrol.h" @@ -308,7 +308,6 @@ void LLHUDText::renderText(BOOL for_select)  				}  				LLUI::popMatrix(); -				  				LLImageGL::unbindTexture(0);  				LLGLDepthTest gls_depth(mZCompare ? GL_TRUE : GL_FALSE, GL_FALSE); @@ -375,7 +374,7 @@ void LLHUDText::renderText(BOOL for_select)  	// Render label  	{ -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  		for(std::vector<LLHUDTextSegment>::iterator segment_iter = mLabelSegments.begin();  			segment_iter != mLabelSegments.end(); ++segment_iter ) diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index e58db2988f..ebcbc20270 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -1488,14 +1488,15 @@ void LLFloaterIMPanel::addHistoryLine(const std::string &utf8msg, const LLColor4  		// Don't hotlink any messages from the system (e.g. "Second Life:"), so just add those in plain text.  		if (!strcmp(name,SYSTEM_FROM))  		{ -			mHistoryEditor->appendColoredText(name,false,false,color); +			mHistoryEditor->appendColoredText(name,false,prepend_newline,color);  		}  		else  		{  			// Convert the name to a hotlink and add to message.  			const LLStyleSP &source_style = LLStyleMap::instance().lookup(source); -			mHistoryEditor->appendStyledText(name, false, false, &source_style); +			mHistoryEditor->appendStyledText(name,false,prepend_newline,&source_style);  		} +		prepend_newline = false;  	}  	mHistoryEditor->appendColoredText(utf8msg, false, prepend_newline, color); diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp index e9d5bfddd2..8a685d5479 100644 --- a/indra/newview/lljoystickbutton.cpp +++ b/indra/newview/lljoystickbutton.cpp @@ -36,7 +36,7 @@  // Library includes  #include "llcoord.h"  #include "indra_constants.h" -#include "llglimmediate.h" +#include "llrender.h"  // Project includes  #include "llui.h" diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index c6c417d8f2..b6980d0382 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -36,7 +36,7 @@  #include "llmath.h"  #include "v3math.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llprimitive.h"  #include "llview.h"  #include "llviewerimagelist.h" diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index 8bb5b18e8f..77e6112e95 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -36,7 +36,7 @@  // library includes  #include "llmath.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "v4color.h"  #include "llprimitive.h"  #include "llview.h" diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index d857ca7510..3a3a22081a 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -38,7 +38,7 @@  #include "v3math.h"  #include "llquaternion.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "v4color.h"  #include "llprimitive.h" diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 1659cc71ce..e179e01030 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -38,7 +38,7 @@  #include "llmaniptranslate.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "llbbox.h" @@ -1535,10 +1535,10 @@ void LLManipTranslate::renderSnapGuides()  					LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GREATER);  					glBindTexture(GL_TEXTURE_2D, sGridTex);  					gGL.flush(); -					gGL.blendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); +					gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE_MINUS_SOURCE_ALPHA);  					renderGrid(u,v,tiles,0.9f, 0.9f, 0.9f,a*0.15f);  					gGL.flush(); -					gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +					gGL.setSceneBlendType(LLRender::BT_ALPHA);  				}  				{ @@ -1649,7 +1649,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,  		LLGLEnable stencil(GL_STENCIL_TEST);  		LLGLDepthTest depth (GL_TRUE, GL_FALSE, GL_ALWAYS);  		glStencilFunc(GL_ALWAYS, 0, stencil_mask); -		glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); +		gGL.setColorMask(false, false);  		LLImageGL::unbindTexture(0);  		glColor4f(1,1,1,1); @@ -1700,7 +1700,7 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,  			LLPipeline::toggleRenderType(LLPipeline::RENDER_TYPE_CLOUDS);  		} -		glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +		gGL.setColorMask(true, false);  	}  	gGL.color4f(1,1,1,1); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 6e10bfef58..ee184e74b4 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -38,7 +38,7 @@  #include "llui.h"  #include "llmath.h"		// clampf()  #include "llfocusmgr.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "llcallingcard.h" @@ -299,7 +299,7 @@ void LLNetMap::draw()  			gGL.end();  			// Draw water -			glAlphaFunc(GL_GREATER, ABOVE_WATERLINE_ALPHA / 255.f ); +			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, ABOVE_WATERLINE_ALPHA / 255.f);  			{  				if (regionp->getLand().getWaterTexture())  				{ @@ -316,7 +316,7 @@ void LLNetMap::draw()  					gGL.end();  				}  			} -			glAlphaFunc(GL_GREATER,0.01f); +			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  		} diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp index 993125ce0a..23ba7163c2 100644 --- a/indra/newview/lloverlaybar.cpp +++ b/indra/newview/lloverlaybar.cpp @@ -37,7 +37,7 @@  #include "lloverlaybar.h"  #include "audioengine.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "llbutton.h"  #include "llchatbar.h" diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index a94fcf7bc2..a3526dff21 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -133,83 +133,77 @@ void LLLoginHandler::parse(const LLSD& queryMap)  	mFirstName = queryMap["first_name"].asString();  	mLastName = queryMap["last_name"].asString(); +	EGridInfo grid_choice = GRID_INFO_NONE;  	if (queryMap["grid"].asString() == "aditi")  	{ -		gGridChoice = GRID_INFO_ADITI; +		grid_choice = GRID_INFO_ADITI;  	}  	else if (queryMap["grid"].asString() == "agni")  	{ -		gGridChoice = GRID_INFO_AGNI; +		grid_choice = GRID_INFO_AGNI;  	}  	else if (queryMap["grid"].asString() == "siva")  	{ -		gGridChoice = GRID_INFO_SIVA; +		grid_choice = GRID_INFO_SIVA;  	}  	else if (queryMap["grid"].asString() == "durga")  	{ -		gGridChoice = GRID_INFO_DURGA; +		grid_choice = GRID_INFO_DURGA;  	}  	else if (queryMap["grid"].asString() == "shakti")  	{ -		gGridChoice = GRID_INFO_SHAKTI; +		grid_choice = GRID_INFO_SHAKTI;  	}  	else if (queryMap["grid"].asString() == "soma")  	{ -		gGridChoice = GRID_INFO_SOMA; +		grid_choice = GRID_INFO_SOMA;  	}  	else if (queryMap["grid"].asString() == "ganga")  	{ -		gGridChoice = GRID_INFO_GANGA; +		grid_choice = GRID_INFO_GANGA;  	}  	else if (queryMap["grid"].asString() == "vaak")  	{ -		gGridChoice = GRID_INFO_VAAK; +		grid_choice = GRID_INFO_VAAK;  	}  	else if (queryMap["grid"].asString() == "uma")  	{ -		gGridChoice = GRID_INFO_UMA; +		grid_choice = GRID_INFO_UMA;  	}  	else if (queryMap["grid"].asString() == "mohini")  	{ -		gGridChoice = GRID_INFO_MOHINI; +		grid_choice = GRID_INFO_MOHINI;  	}  	else if (queryMap["grid"].asString() == "yami")  	{ -		gGridChoice = GRID_INFO_YAMI; +		grid_choice = GRID_INFO_YAMI;  	}  	else if (queryMap["grid"].asString() == "nandi")  	{ -		gGridChoice = GRID_INFO_NANDI; +		grid_choice = GRID_INFO_NANDI;  	}  	else if (queryMap["grid"].asString() == "mitra")  	{ -		gGridChoice = GRID_INFO_MITRA; +		grid_choice = GRID_INFO_MITRA;  	}  	else if (queryMap["grid"].asString() == "radha")  	{ -		gGridChoice = GRID_INFO_RADHA; +		grid_choice = GRID_INFO_RADHA;  	}  	else if (queryMap["grid"].asString() == "ravi")  	{ -		gGridChoice = GRID_INFO_RAVI; +		grid_choice = GRID_INFO_RAVI;  	}  	else if (queryMap["grid"].asString() == "aruna")  	{ -		gGridChoice = GRID_INFO_ARUNA; +		grid_choice = GRID_INFO_ARUNA;  	} -#if !LL_RELEASE_FOR_DOWNLOAD -	if (gGridChoice > GRID_INFO_NONE && gGridChoice < GRID_INFO_LOCAL) + +	if(grid_choice != GRID_INFO_NONE)  	{ -		gSavedSettings.setS32("ServerChoice", gGridChoice); +		LLViewerLogin::getInstance()->setGridChoice(grid_choice);  	} -#endif -	 - 	if (LLAppViewer::instance()->getLoginURIs().size() == 0) - 	{ -		gGridName = gGridInfo[gGridChoice].mName;		/* Flawfinder: ignore */ - 	    LLAppViewer::instance()->resetURIs(); - 	}	     -	 +  	LLString startLocation = queryMap["location"].asString();  	if (startLocation == "specify") @@ -296,7 +290,15 @@ class LLIamHereLogin : public LLHTTPClient::Responder  		{  			mParent = parentIn;  		}; -		 + +		// We don't actually expect LLSD back, so need to override completedRaw +		virtual void completedRaw(U32 status, const std::string& reason, +								  const LLChannelDescriptors& channels, +								  const LLIOPipe::buffer_ptr_t& buffer) +		{ +			completed(status, reason, LLSD()); // will call result() or error() +		} +	  		virtual void result( const LLSD& content )  		{  			if ( mParent ) @@ -794,7 +796,7 @@ BOOL LLPanelLogin::getServer(LLString &server, S32 &domain_name)  			if ((S32)GRID_INFO_OTHER == domain_name)  			{ -				server = gGridName; +				server = LLViewerLogin::getInstance()->getGridLabel();  			}  		}  		else @@ -942,24 +944,16 @@ void LLPanelLogin::loadLoginPage()  	LLString grid;  	S32 grid_index;  	getServer( grid, grid_index ); -	if( grid_index != (S32)GRID_INFO_OTHER ) -	{ -		grid = gGridInfo[grid_index].mLabel; -	} -	if(gGridChoice != (EGridInfo)grid_index) +	gViewerWindow->setMenuBackgroundColor(false, !LLViewerLogin::getInstance()->isInProductionGrid()); +	gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); + +	if (!grid.empty())  	{ -		LLAppViewer::instance()->resetURIs(); -		gGridChoice = (EGridInfo)grid_index; -		gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mLabel); -		gViewerWindow->setMenuBackgroundColor(false,  -			!LLAppViewer::instance()->isInProductionGrid()); -		gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor()); +		char* curl_grid = curl_escape(grid.c_str(), 0); +		oStr << "&grid=" << curl_grid; +		curl_free(curl_grid);  	} -     -	char* curl_grid = curl_escape(grid.c_str(), 0); -	oStr << "&grid=" << curl_grid; -	curl_free(curl_grid);  #if USE_VIEWER_AUTH  	LLURLSimString::sInstance.parse(); @@ -1087,15 +1081,6 @@ void LLPanelLogin::onClickConnect(void *)  		if (!first.empty() && !last.empty())  		{  			// has both first and last name typed - -			// store off custom server entry, if currently selected -			LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo"); -			S32 selected_server = combo->getValue(); -			if (selected_server == GRID_INFO_NONE) -			{ -				LLString custom_server = combo->getValue().asString(); -				gSavedSettings.setString("CustomServer", custom_server); -			}  			sInstance->mCallback(0, sInstance->mCallbackData);  		}  		else @@ -1180,6 +1165,26 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)  // static  void LLPanelLogin::onSelectServer(LLUICtrl*, void*)  { +	// The user twiddled with the grid choice ui. +	// apply the selection to the grid setting. +	LLString grid; +	S32 grid_index; +	getServer( grid, grid_index ); + +	// This new seelction will override preset uris +	// from the command line. +	LLViewerLogin* vl = LLViewerLogin::getInstance(); +	vl->resetURIs(); +	if(grid_index != GRID_INFO_OTHER) +	{ +		vl->setGridChoice((EGridInfo)grid_index); +		grid = vl->getGridLabel(); +	} +	else +	{ +		vl->setGridChoice(grid); +	} +  	// grid changed so show new splash screen (possibly)  	loadLoginPage();  } diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index d27b587a09..e5b063e6d7 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -36,7 +36,7 @@  #include "indra_constants.h"  #include "llmath.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llui.h"  #include "llfontgl.h"  #include "llimagegl.h" diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 103f350b0a..a889388e85 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -39,7 +39,7 @@  #include "lldbstrings.h"  #include "lleconomy.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llpermissions.h"  #include "llpermissionsflags.h"  #include "llundo.h" @@ -1038,19 +1038,21 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &  	if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount())  	{ -		LLViewerObject* root = getSelectedParentObject(mSelectedObjects->getFirstObject()); +		//LLViewerObject* root = getSelectedParentObject(mSelectedObjects->getFirstObject());  		LLBBox bbox = mSavedSelectionBBox;  		mGridOrigin = mSavedSelectionBBox.getCenterAgent();  		mGridScale = mSavedSelectionBBox.getExtentLocal() * 0.5f; -		if(mSelectedObjects->getObjectCount() < 2 || !root || root->mDrawable.isNull()) +		// DEV-12570 Just taking the saved selection box rotation prevents +		// wild rotations of linked sets while in local grid mode +		//if(mSelectedObjects->getObjectCount() < 2 || !root || root->mDrawable.isNull())  		{  			mGridRotation = mSavedSelectionBBox.getRotation();  		} -		else //set to the root object +		/*else //set to the root object  		{  			mGridRotation = root->getRenderRotation();			 -		} +		}*/  	}  	else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull())  	{ @@ -4806,7 +4808,7 @@ void LLSelectMgr::updateSilhouettes()  		objectp->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE);  	} -	//glAlphaFunc(GL_GREATER, 0.01f); +	//gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  }  void LLSelectMgr::renderSilhouettes(BOOL for_hud) @@ -4818,7 +4820,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  	LLViewerImage::bindTexture(mSilhouetteImagep);  	LLGLSPipelineSelection gls_select; -	glAlphaFunc(GL_GREATER, 0.0f); +	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);  	LLGLEnable blend(GL_BLEND);  	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); @@ -4846,11 +4848,21 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  	if (mSelectedObjects->getNumNodes())  	{  		LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID(); +		  		for (S32 pass = 0; pass < 2; pass++)  		{ +			LLObjectSelection::iterator end_ = mSelectedObjects->end();		 +			S32 num_nodes = mSelectedObjects->getNumNodes() ; +			LLObjectSelection::iterator prev_iter = mSelectedObjects->end();		  			for (LLObjectSelection::iterator iter = mSelectedObjects->begin();  				 iter != mSelectedObjects->end(); iter++)  			{ +				llassert_always(end_ == mSelectedObjects->end()) ;//mSelectedObjects should not grow +				llassert_always(prev_iter != iter) ; //iter should move +				llassert_always(num_nodes > 0) ; //iter should not circle inside mSelectedObjects. +				num_nodes-- ; +				prev_iter = iter ; +  				LLSelectNode* node = *iter;  				LLViewerObject* objectp = node->getObject();  				if (!objectp) @@ -4924,7 +4936,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  	}  	mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D); -	glAlphaFunc(GL_GREATER, 0.01f); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  }  void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point) @@ -5289,7 +5301,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)  		if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible())  		{  			gGL.flush(); -			gGL.blendFunc(GL_SRC_COLOR, GL_ONE); +			gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE);  			LLGLEnable fog(GL_FOG);  			glFogi(GL_FOG_MODE, GL_LINEAR);  			float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec(); @@ -5299,7 +5311,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)  			glFogfv(GL_FOG_COLOR, fogCol.mV);  			LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL); -			glAlphaFunc(GL_GREATER, 0.01f); +			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  			gGL.begin(LLVertexBuffer::LINES);  			{  				S32 i = 0; @@ -5320,7 +5332,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)  		}  		gGL.flush(); -		gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +		gGL.setSceneBlendType(LLRender::BT_ALPHA);  		gGL.begin(LLVertexBuffer::TRIANGLES);  		{  			S32 i = 0; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index ff53dfea2f..b6ef833709 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -43,7 +43,7 @@  #include "llviewerregion.h"  #include "llcamera.h"  #include "pipeline.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "lloctree.h"  const F32 SG_OCCLUSION_FUDGE = 1.01f; @@ -60,6 +60,7 @@ const F32 SG_OCCLUSION_FUDGE = 1.01f;  static U32 sZombieGroups = 0;  U32 LLSpatialGroup::sNodeCount = 0; +BOOL LLSpatialGroup::sNoDelete = FALSE;  static F32 sLastMaxTexPriority = 1.f;  static F32 sCurMaxTexPriority = 1.f; @@ -295,6 +296,11 @@ S32 LLSphereAABB(const LLVector3& center, const LLVector3& size, const LLVector3  LLSpatialGroup::~LLSpatialGroup()  { +	if (sNoDelete) +	{ +		llerrs << "Illegal deletion of LLSpatialGroup!" << llendl; +	} +  	if (isState(DEAD))  	{  		sZombieGroups--; @@ -2006,7 +2012,7 @@ void renderOctree(LLSpatialGroup* group)  	//render solid object bounding box, color  	//coded by buffer usage and activity  	LLGLDepthTest depth(GL_TRUE, GL_FALSE); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE); +	gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);  	LLVector4 col;  	if (group->mBuilt > 0.f)  	{ @@ -2094,7 +2100,7 @@ void renderOctree(LLSpatialGroup* group)  	drawBox(group->mObjectBounds[0], group->mObjectBounds[1]*1.01f+LLVector3(0.001f, 0.001f, 0.001f));  	glDepthMask(GL_TRUE); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	if (group->mBuilt <= 0.f)  	{ @@ -2122,7 +2128,7 @@ void renderOctree(LLSpatialGroup* group)  void renderVisibility(LLSpatialGroup* group, LLCamera* camera)  {  	LLGLEnable blend(GL_BLEND); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	LLGLEnable cull(GL_CULL_FACE);  	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); @@ -2498,7 +2504,7 @@ void LLSpatialPartition::renderDebug()  	LLGLDisable cullface(GL_CULL_FACE);  	LLGLEnable blend(GL_BLEND); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	LLImageGL::unbindTexture(0);  	gPipeline.disableLights(); @@ -2619,7 +2625,10 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,  LLDrawInfo::~LLDrawInfo()	  { - +	if (LLSpatialGroup::sNoDelete) +	{ +		llerrs << "LLDrawInfo deleted illegally!" << llendl; +	}  }  LLVertexBuffer* LLGeometryManager::createVertexBuffer(U32 type_mask, U32 usage) @@ -2813,7 +2822,16 @@ void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)  } - +void LLCullResult::assertDrawMapsEmpty() +{ +	for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++) +	{ +		if (mRenderMapSize[i] != 0) +		{ +			llerrs << "Stale LLDrawInfo's in LLCullResult!" << llendl; +		} +	} +} diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 7e1175a000..6ea22c2f66 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -127,6 +127,7 @@ class LLSpatialGroup : public LLOctreeListener<LLDrawable>  	friend class LLSpatialPartition;  public:  	static U32 sNodeCount; +	static BOOL sNoDelete; //deletion of spatial groups and draw info not allowed if TRUE  	typedef std::vector<LLPointer<LLSpatialGroup> > sg_vector_t;  	typedef std::set<LLPointer<LLSpatialGroup> > sg_set_t; @@ -421,7 +422,7 @@ public:  	void pushDrawable(LLDrawable* drawable);  	void pushBridge(LLSpatialBridge* bridge);  	void pushDrawInfo(U32 type, LLDrawInfo* draw_info); - +	  	U32 getVisibleGroupsSize()		{ return mVisibleGroupsSize; }  	U32	getAlphaGroupsSize()		{ return mAlphaGroupsSize; }  	U32	getDrawableGroupsSize()		{ return mDrawableGroupsSize; } @@ -429,6 +430,8 @@ public:  	U32	getVisibleBridgeSize()		{ return mVisibleBridgeSize; }  	U32	getRenderMapSize(U32 type)	{ return mRenderMapSize[type]; } +	void assertDrawMapsEmpty(); +  private:  	U32					mVisibleGroupsSize;  	U32					mAlphaGroupsSize; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 724b61481b..7480d4dd73 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -820,22 +820,28 @@ BOOL idle_startup()  			LLString server_label;  			S32 domain_name_index;  			BOOL user_picked_server = LLPanelLogin::getServer( server_label, domain_name_index ); -			gGridChoice = (EGridInfo) domain_name_index; -			gSavedSettings.setS32("ServerChoice", gGridChoice); -			if (gGridChoice == GRID_INFO_OTHER) +			if((EGridInfo)domain_name_index == GRID_INFO_OTHER)  			{ -				gGridName = server_label;/* Flawfinder: ignore */ +				// Since the grid chosen was an 'other', set the choice by string.  +				LLViewerLogin::getInstance()->setGridChoice(server_label); +			} +			else +			{ +				// Set the choice according to index. +				LLViewerLogin::getInstance()->setGridChoice((EGridInfo)domain_name_index);  			}  			if ( user_picked_server ) -			{   // User picked a grid from the popup, so clear the stored urls and they will be re-generated from gGridChoice +			{   // User picked a grid from the popup, so clear the  +				// stored uris and they will be re-generated from the GridChoice  				sAuthUris.clear(); -				LLAppViewer::instance()->resetURIs(); +				LLViewerLogin::getInstance()->resetURIs();  			}  			LLString location;  			LLPanelLogin::getLocation( location );  			LLURLSimString::setString( location ); +  			// END TODO  			LLPanelLogin::close();  		} @@ -915,7 +921,7 @@ BOOL idle_startup()  	if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState())  	{  //#define LL_MINIMIAL_REQUESTED_OPTIONS -		gDebugInfo["GridName"] = gGridInfo[gGridChoice].mLabel; +		gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel();  		// *Note: this is where gUserAuth used to be created.  		requested_options.clear(); @@ -949,7 +955,8 @@ BOOL idle_startup()  			gSavedSettings.setBOOL("UseDebugMenus", TRUE);  			requested_options.push_back("god-connect");  		} -		const std::vector<std::string>& uris = LLAppViewer::instance()->getLoginURIs(); +		std::vector<std::string> uris; +		LLViewerLogin::getInstance()->getLoginURIs(uris);  		std::vector<std::string>::const_iterator iter, end;  		for (iter = uris.begin(), end = uris.end(); iter != end; ++iter)  		{ @@ -1222,7 +1229,7 @@ BOOL idle_startup()  				sAuthUriNum++;  				std::ostringstream s;  				LLString::format_map_t args; -				args["[NUMBER]"] = sAuthUriNum + 1; +				args["[NUMBER]"] = llformat("%d", sAuthUriNum + 1);  				auth_desc = LLTrans::getString("LoginAttempt", args).c_str();  				LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE );  				return do_normal_idle; @@ -1276,7 +1283,6 @@ BOOL idle_startup()  				   save_password_to_disk(NULL);  			}  			gSavedSettings.setBOOL("RememberPassword", remember_password); -			gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation"));  			text = LLUserAuth::getInstance()->getResponse("agent_access");  			if(text && (text[0] == 'M')) @@ -2331,7 +2337,7 @@ BOOL idle_startup()  		gDebugView->mFastTimerView->setVisible(TRUE);  #endif -		LLAppViewer::instance()->startMainloopTimeout(); +		LLAppViewer::instance()->initMainloopTimeout("Mainloop Init");  		return do_normal_idle;  	} @@ -2362,33 +2368,13 @@ void login_show()  	LL_DEBUGS("AppInit") << "Setting Servers" << LL_ENDL; -	if( GRID_INFO_OTHER == gGridChoice ) -	{ -		   LLPanelLogin::addServer( gGridName.c_str(), GRID_INFO_OTHER ); -	} -	else +	LLPanelLogin::addServer(LLViewerLogin::getInstance()->getGridLabel().c_str(), LLViewerLogin::getInstance()->getGridChoice()); + +	LLViewerLogin* vl = LLViewerLogin::getInstance(); +	for(int grid_index = GRID_INFO_ADITI; grid_index < GRID_INFO_OTHER; ++grid_index)  	{ -		   LLPanelLogin::addServer( gGridInfo[gGridChoice].mLabel, gGridChoice ); +		LLPanelLogin::addServer(vl->getKnownGridLabel((EGridInfo)grid_index).c_str(), grid_index);  	} - -	// Arg!  We hate loops! -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_ADITI].mLabel,        GRID_INFO_ADITI ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_AGNI].mLabel, GRID_INFO_AGNI ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_ARUNA].mLabel,        GRID_INFO_ARUNA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_DURGA].mLabel,        GRID_INFO_DURGA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_GANGA].mLabel,        GRID_INFO_GANGA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_MITRA].mLabel,       GRID_INFO_MITRA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_MOHINI].mLabel,       GRID_INFO_MOHINI ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_NANDI].mLabel,       GRID_INFO_NANDI ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_RADHA].mLabel,       GRID_INFO_RADHA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_RAVI].mLabel,       GRID_INFO_RAVI ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_SIVA].mLabel, GRID_INFO_SIVA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_SHAKTI].mLabel,       GRID_INFO_SHAKTI ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_SOMA].mLabel, GRID_INFO_SOMA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_UMA].mLabel,  GRID_INFO_UMA ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_VAAK].mLabel, GRID_INFO_VAAK ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_YAMI].mLabel, GRID_INFO_YAMI ); -	LLPanelLogin::addServer( gGridInfo[GRID_INFO_LOCAL].mLabel,        GRID_INFO_LOCAL );  }  // Callback for when login screen is closed.  Option 0 = connect, option 1 = quit. @@ -2705,7 +2691,7 @@ void update_dialog_callback(S32 option, void *userdata)  #endif  	// *TODO change userserver to be grid on both viewer and sim, since  	// userserver no longer exists. -	query_map["userserver"] = gGridName; +	query_map["userserver"] = LLViewerLogin::getInstance()->getGridLabel();  	query_map["channel"] = gSavedSettings.getString("VersionChannelName");  	// *TODO constantize this guy  	LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); @@ -2798,9 +2784,6 @@ void update_dialog_callback(S32 option, void *userdata)  	LL_DEBUGS("AppInit") << "Calling updater: " << update_exe_path << LL_ENDL; -	// *REMOVE:Mani The following call is handled through ~LLAppViewer. - 	// remove_marker_file(); // In case updater fails -  	// Run the auto-updater.  	system(update_exe_path.c_str());		/* Flawfinder: ignore */ @@ -2808,10 +2791,6 @@ void update_dialog_callback(S32 option, void *userdata)  	OSMessageBox("Automatic updating is not yet implemented for Linux.\n"  		"Please download the latest version from www.secondlife.com.",  		NULL, OSMB_OK); - -	// *REMOVE:Mani The following call is handled through ~LLAppViewer. -	// remove_marker_file(); -	  #endif  	LLAppViewer::instance()->forceQuit();  } diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index 351d4b1a21..6c832492c0 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -15,7 +15,7 @@   * online at http://secondlife.com/developers/opensource/gplv2   *    * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception + * it is applied to this Source Code. View the full textof the exception   * in the file doc/FLOSS-exception.txt in this software distribution, or   * online at http://secondlife.com/developers/opensource/flossexception   *  diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index 2877fc66e3..6f952ea57d 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -207,10 +207,11 @@ LLVector2 LLSurfacePatch::getTexCoords(const U32 x, const U32 y) const  void LLSurfacePatch::eval(const U32 x, const U32 y, const U32 stride, LLVector3 *vertex, LLVector3 *normal,  						  LLVector2 *tex0, LLVector2 *tex1)  { -	if (!mSurfacep || !mSurfacep->getRegion()) +	if (!mSurfacep || !mSurfacep->getRegion() || !mSurfacep->getGridsPerEdge())  	{  		return; // failsafe  	} +	llassert_always(vertex && normal && tex0 && tex1);  	U32 surface_stride = mSurfacep->getGridsPerEdge();  	U32 point_offset = x + y*surface_stride; diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index 7a2d232de6..6286289d6b 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -52,7 +52,7 @@  #include "llxmltree.h"  #include "pipeline.h"  #include "v4coloru.h" -#include "llglimmediate.h" +#include "llrender.h"  //#include "../tools/imdebug/imdebug.h" @@ -239,6 +239,9 @@ BOOL LLTexLayerSetBuffer::render()  {  	U8* baked_bump_data = NULL; +	// Default color mask for tex layer render +	gGL.setColorMask(true, true); +  	// do we need to upload, and do we have sufficient data to create an uploadable composite?  	// When do we upload the texture if gAgent.mNumPendingQueries is non-zero?  	BOOL upload_now = (gAgent.mNumPendingQueries == 0 && mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal()); @@ -292,8 +295,8 @@ BOOL LLTexLayerSetBuffer::render()  	}  	// reset GL state -	glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); -	gGL.blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );   +	gGL.setColorMask(true, true); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	// we have valid texture data now  	mInitialized = TRUE; @@ -756,6 +759,7 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )  	LLGLSUIDefault gls_ui;  	LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); +	gGL.setColorMask(true, true);  	// composite color layers  	for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ ) @@ -774,8 +778,8 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )  	{  		LLGLSNoAlphaTest gls_no_alpha_test;  		gGL.flush(); -		glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE ); -		gGL.blendFunc( GL_ONE, GL_ZERO ); +		gGL.setColorMask(false, true); +		gGL.setSceneBlendType(LLRender::BT_REPLACE);  		{  			LLImageGL* image_gl = gTexStaticImageList.getImageGL( getInfo()->mStaticAlphaFileName, TRUE ); @@ -793,8 +797,8 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )  		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);  		gGL.flush(); -		glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); -		gGL.blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); +		gGL.setColorMask(true, true); +		gGL.setSceneBlendType(LLRender::BT_ALPHA);  	}  	else   	if( getInfo()->mClearAlpha ) @@ -803,12 +807,12 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )  		LLGLSNoTextureNoAlphaTest gls_no_alpha;  		gGL.color4f( 0.f, 0.f, 0.f, 1.f );  		gGL.flush(); -		glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE ); +		gGL.setColorMask(false, true);  		gl_rect_2d_simple( width, height );  		gGL.flush(); -		glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); +		gGL.setColorMask(true, true);  	}  	stop_glerror(); @@ -836,11 +840,11 @@ BOOL LLTexLayerSet::renderBump( S32 x, S32 y, S32 width, S32 height )  	// Set the alpha channel to one (clean up after previous blending)  	LLGLSNoTextureNoAlphaTest gls_no_texture_no_alpha;  	gGL.color4f( 0.f, 0.f, 0.f, 1.f ); -	glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE ); +	gGL.setColorMask(false, true);  	gl_rect_2d_simple( width, height ); -	glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); +	gGL.setColorMask(true, true);  	stop_glerror();  	return success; @@ -1330,7 +1334,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )  		renderAlphaMasks( x, y, width, height, &net_color );  		alpha_mask_specified = TRUE;  		gGL.flush(); -		gGL.blendFunc( GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA ); +		gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ONE_MINUS_DEST_ALPHA);  	}  	gGL.color4fv( net_color.mV); @@ -1338,7 +1342,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )  	if( getInfo()->mWriteAllChannels )  	{  		gGL.flush(); -		gGL.blendFunc( GL_ONE, GL_ZERO ); +		gGL.setSceneBlendType(LLRender::BT_REPLACE);  	}  	if( (getInfo()->mLocalTexture != -1) && !getInfo()->mUseLocalTextureAlphaOnly ) @@ -1401,7 +1405,7 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )  	{  		// Restore standard blend func value  		gGL.flush(); -		gGL.blendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); +		gGL.setSceneBlendType(LLRender::BT_ALPHA);  		stop_glerror();  	} @@ -1506,7 +1510,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4  	llassert( !mParamAlphaList.empty() ); -	glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE ); +	gGL.setColorMask(false, true);  	alpha_list_t::iterator iter = mParamAlphaList.begin();  	LLTexLayerParamAlpha* first_param = *iter; @@ -1518,7 +1522,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4  		// Clear the alpha  		gGL.flush(); -		gGL.blendFunc( GL_ONE, GL_ZERO ); +		gGL.setSceneBlendType(LLRender::BT_REPLACE);  		gGL.color4f( 0.f, 0.f, 0.f, 0.f );  		gl_rect_2d_simple( width, height ); @@ -1536,7 +1540,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4  	// Approximates a min() function  	gGL.flush(); -	gGL.blendFunc( GL_DST_ALPHA, GL_ZERO ); +	gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);  	// Accumulate the alpha component of the texture  	if( getInfo()->mLocalTexture != -1 ) @@ -1601,7 +1605,7 @@ BOOL LLTexLayer::renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4  	LLGLSUIDefault gls_ui; -	glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); +	gGL.setColorMask(true, true);  	if (!mMorphMasksValid && !mMaskedMorphs.empty())  	{ @@ -1963,11 +1967,11 @@ BOOL LLTexLayerParamAlpha::render( S32 x, S32 y, S32 width, S32 height )  	gGL.flush();  	if( getInfo()->mMultiplyBlend )  	{ -		gGL.blendFunc( GL_DST_ALPHA, GL_ZERO ); // Multiplication: approximates a min() function +		gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); // Multiplication: approximates a min() function  	}  	else  	{ -		gGL.blendFunc( GL_ONE, GL_ONE );  // Addition: approximates a max() function +		gGL.setSceneBlendType(LLRender::BT_ADD);  // Addition: approximates a max() function  	}  	if( !getInfo()->mStaticImageFileName.empty() && !mStaticImageInvalid) diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 86ef9e95cf..10801cfd4f 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -39,6 +39,9 @@  #include "lllfsthread.h"  #include "llviewercontrol.h" +// Included to allow LLTextureCache::purgeTextures() to pause watchdog timeout +#include "llappviewer.h"  +  #define USE_LFS_READ 0  #define USE_LFS_WRITE 0 @@ -1153,6 +1156,9 @@ void LLTextureCache::purgeTextures(bool validate)  		return;  	} +	// *FIX:Mani - watchdog off. +	LLAppViewer::instance()->pauseMainloopTimeout(); +  	LLMutexLock lock(&mHeaderMutex);  	S32 filesize = ll_apr_file_size(mTexturesDirEntriesFileName, NULL); @@ -1273,6 +1279,9 @@ void LLTextureCache::purgeTextures(bool validate)  	llassert(mTexturesSizeTotal == total_size);  	delete[] entries; + +	// *FIX:Mani - watchdog back on. +	LLAppViewer::instance()->resumeMainloopTimeout();  	LL_INFOS("TextureCache") << "TEXTURE CACHE:"  			<< " PURGED: " << purge_count diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 22c0e08612..b89e93b9a4 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -34,7 +34,7 @@  #include "lltexturectrl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "llviewerimagelist.h"  #include "llcheckboxctrl.h" diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index bcb2185687..c5ae50c050 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1341,13 +1341,13 @@ bool LLTextureFetch::createRequest(const LLString& filename, const LLUUID& id, c  	}  	S32 desired_size; -	if ((desired_discard == 0) && worker && worker->mFileSize) +	if (desired_discard == 0)  	{  		// if we want the entire image, and we know its size, then get it all  		// (calcDataSizeJ2C() below makes assumptions about how the image  		// was compressed - this code ensures that when we request the entire image,  		// we really do get it.) -		desired_size = worker->mFileSize; +		desired_size = MAX_IMAGE_DATA_SIZE;  	}  	else if (w*h*c > 0)  	{ @@ -1358,17 +1358,11 @@ bool LLTextureFetch::createRequest(const LLString& filename, const LLUUID& id, c  	}  	else  	{ -		if (desired_discard == 0) -		{ -			// If we want all of the image, request the maximum possible data -			desired_size = MAX_IMAGE_DATA_SIZE; -		} -		else -		{ -			desired_size = FIRST_PACKET_SIZE; -			desired_discard = MAX_DISCARD_LEVEL; -		} +		desired_size = FIRST_PACKET_SIZE; +		desired_discard = MAX_DISCARD_LEVEL;  	} + +	  	if (worker)  	{  		if (worker->wasAborted()) diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 7f571a1205..a9005ef71b 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -40,7 +40,7 @@  #include "lllfsthread.h"  #include "llui.h"  #include "llimageworker.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llhoverview.h"  #include "llselectmgr.h" diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index 0224e1c925..32b27fb876 100644 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -35,7 +35,7 @@  #include "lltoolselectland.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "message.h" @@ -94,7 +94,6 @@ LLToolBrushLand::LLToolBrushLand()  	mMouseX( 0 ),  	mMouseY(0),  	mGotHover(FALSE), -	mLastShowParcelOwners(FALSE),  	mBrushSelected(FALSE)  {  	mBrushIndex = gSavedSettings.getS32("RadioLandBrushSize"); @@ -104,7 +103,8 @@ void LLToolBrushLand::modifyLandAtPointGlobal(const LLVector3d &pos_global,  											  MASK mask)  {  	S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction"); - +	 +	mLastAffectedRegions.clear();  	determineAffectedRegions(mLastAffectedRegions, pos_global);  	for(region_list_t::iterator iter = mLastAffectedRegions.begin();  		iter != mLastAffectedRegions.end(); ++iter) @@ -418,8 +418,6 @@ void LLToolBrushLand::handleSelect()  	gFloaterTools->setStatusText("modifyland");  //	if (!mBrushSelected)  	{ -		mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); -		gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);  		mBrushSelected = TRUE;  	}  } @@ -431,8 +429,6 @@ void LLToolBrushLand::handleDeselect()  	{  		gEditMenuHandler = NULL;  	} -	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); -	gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);  	LLViewerParcelMgr::getInstance()->setSelectionVisible(TRUE);  	mBrushSelected = FALSE;  } diff --git a/indra/newview/lltoolbrush.h b/indra/newview/lltoolbrush.h index 70e34725af..3940f3ac89 100644 --- a/indra/newview/lltoolbrush.h +++ b/indra/newview/lltoolbrush.h @@ -97,7 +97,6 @@ protected:  	S32 mMouseY;  	S32 mBrushIndex;  	BOOL mGotHover; -	BOOL mLastShowParcelOwners;  	BOOL mBrushSelected;  	// Order doesn't matter and we do check for existance of regions, so use a set  	region_list_t mLastAffectedRegions; diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp index ad11f5ad43..d8d271bfda 100644 --- a/indra/newview/lltoolmorph.cpp +++ b/indra/newview/lltoolmorph.cpp @@ -33,7 +33,7 @@  // File includes  #include "lltoolmorph.h"  -#include "llglimmediate.h" +#include "llrender.h"  // Library includes  #include "audioengine.h" diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 315136ed36..310b677bff 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -309,6 +309,7 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)  	}  	else if (mHitObjectID == gAgent.getID() )  	{ +		llassert_always(gPieSelf) ;  		gPieSelf->show(x, y, mPieMouseButtonDown);  	}  	else if (object) diff --git a/indra/newview/lltoolselectland.cpp b/indra/newview/lltoolselectland.cpp index 28e4227db4..38e9811b73 100644 --- a/indra/newview/lltoolselectland.cpp +++ b/indra/newview/lltoolselectland.cpp @@ -61,8 +61,7 @@ LLToolSelectLand::LLToolSelectLand( )  	mDragEndY(0),  	mMouseOutsideSlop(FALSE),  	mWestSouthBottom(), -	mEastNorthTop(), -	mLastShowParcelOwners(FALSE) +	mEastNorthTop()  { }  LLToolSelectLand::~LLToolSelectLand() @@ -216,17 +215,12 @@ void LLToolSelectLand::render()  void LLToolSelectLand::handleSelect()  {  	gFloaterTools->setStatusText("selectland"); -	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); -	gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);  }  void LLToolSelectLand::handleDeselect()  {  	mSelection = NULL; -	mLastShowParcelOwners = gSavedSettings.getBOOL("ShowParcelOwners"); -	//LLViewerParcelMgr::getInstance()->deselectLand(); -	gSavedSettings.setBOOL("ShowParcelOwners", mLastShowParcelOwners);  } diff --git a/indra/newview/lltoolselectland.h b/indra/newview/lltoolselectland.h index 37d656289b..bca0e13384 100644 --- a/indra/newview/lltoolselectland.h +++ b/indra/newview/lltoolselectland.h @@ -74,7 +74,6 @@ protected:  	LLVector3d		mWestSouthBottom;		// global coords, from drag  	LLVector3d		mEastNorthTop;			// global coords, from drag -	BOOL			mLastShowParcelOwners;	// store last Show Parcel Owners setting  	LLSafeHandle<LLParcelSelection> mSelection;		// hold on to a parcel selection  }; diff --git a/indra/newview/lltoolselectrect.cpp b/indra/newview/lltoolselectrect.cpp index 5f54d1f3ba..67d9e2da65 100644 --- a/indra/newview/lltoolselectrect.cpp +++ b/indra/newview/lltoolselectrect.cpp @@ -36,7 +36,7 @@  // Library includes  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "lldarray.h"  // Viewer includes diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 5647b6be5a..d1b87281f0 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -36,7 +36,7 @@  #include "lldarray.h"  #include "llfontgl.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llinventory.h"  #include "llmemory.h"  #include "llstring.h" diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 9ba25902af..cbba73b692 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -69,7 +69,7 @@  #include "llappviewer.h"  #include "llvosurfacepatch.h"  #include "llvowlsky.h" -#include "llglimmediate.h" +#include "llrender.h"  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER  BOOL 				gHackGodmode = FALSE; @@ -433,7 +433,7 @@ bool handleVoiceClientPrefsChanged(const LLSD& newvalue)  		gVoiceClient->setCaptureDevice(inputDevice);  		std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");  		gVoiceClient->setRenderDevice(outputDevice); -		gVoiceClient->setLipSyncEnabled(gSavedSettings.getU32("LipSyncEnabled")); +		gVoiceClient->setLipSyncEnabled(gSavedSettings.getBOOL("LipSyncEnabled"));  	}  	return true;  } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index a24f4b36de..c75bcdc9e8 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -34,7 +34,7 @@  #include "llviewerdisplay.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llglheaders.h"  #include "llagent.h"  #include "llviewercontrol.h" @@ -81,8 +81,6 @@  #include "llpostprocess.h"  extern LLPointer<LLImageGL> gStartImageGL; -extern BOOL gDisplaySwapBuffers; -  LLPointer<LLImageGL> gDisconnectedImagep = NULL; @@ -96,14 +94,18 @@ const F32		RESTORE_GL_TIME = 5.f;	// Wait this long while reloading textures bef  BOOL gForceRenderLandFence = FALSE;  BOOL gDisplaySwapBuffers = FALSE; +BOOL gDepthDirty = FALSE;  BOOL gResizeScreenTexture = FALSE;  BOOL gSnapshot = FALSE; +U32 gRecentFrameCount = 0; // number of 'recent' frames +LLFrameTimer gRecentFPSTime; +LLFrameTimer gRecentMemoryTime; +  // Rendering stuff  void pre_show_depth_buffer();  void post_show_depth_buffer();  void render_ui_and_swap(); -void render_ui_and_swap_if_needed();  void render_hud_attachments();  void render_ui_3d();  void render_ui_2d(); @@ -142,7 +144,7 @@ void display_startup()  	gPipeline.disableLights();  	gViewerWindow->setup2DRender(); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	gGL.color4f(1,1,1,1);  	gViewerWindow->draw(); @@ -181,6 +183,26 @@ void display_update_camera()  	LLWorld::getInstance()->setLandFarClip(final_far);  } +// Write some stats to llinfos +void display_stats() +{ +	F32 fps_log_freq = gSavedSettings.getF32("FPSLogFrequency"); +	if (fps_log_freq > 0.f && gRecentFPSTime.getElapsedTimeF32() >= fps_log_freq) +	{ +		F32 fps = gRecentFrameCount / fps_log_freq; +		llinfos << llformat("FPS: %.02f", fps) << llendl; +		gRecentFrameCount = 0; +		gRecentFPSTime.reset(); +	} +	F32 mem_log_freq = gSavedSettings.getF32("MemoryLogFrequency"); +	if (mem_log_freq > 0.f && gRecentMemoryTime.getElapsedTimeF32() >= mem_log_freq) +	{ +		gMemoryAllocated = getCurrentRSS(); +		U32 memory = (U32)(gMemoryAllocated / (1024*1024)); +		llinfos << llformat("MEMORY: %d MB", memory) << llendl; +		gRecentMemoryTime.reset(); +	} +}  // Paint the display!  void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) @@ -222,9 +244,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	gViewerWindow->checkSettings(); +	LLAppViewer::instance()->pingMainloopTimeout("Display:Pick");  	gViewerWindow->performPick(); +	LLAppViewer::instance()->pingMainloopTimeout("Display:CheckStates");  	LLGLState::checkStates();  	LLGLState::checkTextureChannels(); @@ -256,6 +280,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	//  	if (LLStartUp::getStartupState() < STATE_STARTED)  	{ +		LLAppViewer::instance()->pingMainloopTimeout("Display:Startup");  		display_startup();  		return;  	} @@ -267,6 +292,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	// Update GL Texture statistics (used for discard logic?)  	// +	LLAppViewer::instance()->pingMainloopTimeout("Display:TextureStats");  	gFrameStats.start(LLFrameStats::UPDATE_TEX_STATS);  	stop_glerror(); @@ -277,6 +303,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	gPipeline.mBackfaceCull = TRUE;  	gFrameCount++; +	gRecentFrameCount++;  	if (gFocusMgr.getAppHasFocus())  	{  		gForegroundFrameCount++; @@ -289,6 +316,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	if (gTeleportDisplay)  	{ +		LLAppViewer::instance()->pingMainloopTimeout("Display:Teleport");  		const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived.  		S32 attach_count = 0; @@ -367,6 +395,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	}      else if(LLAppViewer::instance()->logoutRequestSent())  	{ +		LLAppViewer::instance()->pingMainloopTimeout("Display:Logout");  		F32 percent_done = gLogoutTimer.getElapsedTimeF32() * 100.f / gLogoutMaxTime;  		if (percent_done > 100.f)  		{ @@ -383,6 +412,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	else  	if (gRestoreGL)  	{ +		LLAppViewer::instance()->pingMainloopTimeout("Display:RestoreGL");  		F32 percent_done = gRestoreGLTimer.getElapsedTimeF32() * 100.f / RESTORE_GL_TIME;  		if( percent_done > 100.f )  		{ @@ -412,6 +442,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	//  	// +	LLAppViewer::instance()->pingMainloopTimeout("Display:Camera");  	LLViewerCamera::getInstance()->setZoomParameters(zoom_factor, subfield);  	LLViewerCamera::getInstance()->setNear(MIN_NEAR_PLANE); @@ -423,9 +454,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	if (gDisconnected)  	{ -		render_ui_and_swap_if_needed(); -		gDisplaySwapBuffers = TRUE; -		 +		LLAppViewer::instance()->pingMainloopTimeout("Display:Disconnected"); +		render_ui_and_swap();  		render_disconnected_background();  	} @@ -434,6 +464,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	// Set rendering options  	//  	// +	LLAppViewer::instance()->pingMainloopTimeout("Display:RenderSetup");  	stop_glerror();  	if (gSavedSettings.getBOOL("ShowDepthBuffer"))  	{ @@ -462,10 +493,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	// do render-to-texture stuff here  	if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES))  	{ +		LLAppViewer::instance()->pingMainloopTimeout("Display:DynamicTextures");  		LLFastTimer t(LLFastTimer::FTM_UPDATE_TEXTURES);  		if (LLDynamicTexture::updateAllInstances())  		{ -			glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); +			gGL.setColorMask(true, true);  			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  		}  	} @@ -474,6 +506,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	if (!gDisconnected)  	{ +		LLAppViewer::instance()->pingMainloopTimeout("Display:Update");  		if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))  		{ //don't draw hud objects in this frame  			gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); @@ -511,9 +544,12 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			}  		} +		LLAppViewer::instance()->pingMainloopTimeout("Display:Cull"); +		  		//Increment drawable frame counter  		LLDrawable::incrementVisible(); +		LLSpatialGroup::sNoDelete = TRUE;  		LLPipeline::sUseOcclusion =   				(!gUseWireframe  				&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")  @@ -524,10 +560,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible");  		S32 occlusion = LLPipeline::sUseOcclusion; -		if (!gDisplaySwapBuffers) +		if (gDepthDirty)  		{ //depth buffer is invalid, don't overwrite occlusion state  			LLPipeline::sUseOcclusion = llmin(occlusion, 1);  		} +		gDepthDirty = FALSE;  		static LLCullResult result;  		gPipeline.updateCull(*LLViewerCamera::getInstance(), result, water_clip); @@ -537,6 +574,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  						gPipeline.canUseVertexShaders() &&  						LLPipeline::sRenderGlow; +		LLAppViewer::instance()->pingMainloopTimeout("Display:Swap"); +		  		// now do the swap buffer (just before rendering to framebuffer)  		{ //swap and flush state from previous frame  			{ @@ -550,14 +589,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  				gPipeline.resizeScreenTexture();  			} -			glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); +			gGL.setColorMask(true, true);  			glClearColor(0,0,0,0);  			if (!for_snapshot)  			{ -				render_ui_and_swap_if_needed(); -				gDisplaySwapBuffers = TRUE; -				  				glh::matrix4f proj = glh_get_current_projection();  				glh::matrix4f mod = glh_get_current_modelview();  				glViewport(0,0,512,512); @@ -576,6 +612,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		if (!for_snapshot)  		{ +			LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");  			gPipeline.processImagery(*LLViewerCamera::getInstance());  			gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());  		} @@ -587,6 +624,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		// Can put objects onto the retextured list.  		//  		// Doing this here gives hardware occlusion queries extra time to complete +		LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages");  		gFrameStats.start(LLFrameStats::IMAGE_UPDATE);  		{ @@ -610,6 +648,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		// In the case of alpha objects, z-sorts them first.  		// Also creates special lists for outlines and selected face rendering.  		// +		LLAppViewer::instance()->pingMainloopTimeout("Display:StateSort");  		{  			gFrameStats.start(LLFrameStats::STATE_SORT);  			gPipeline.stateSort(*LLViewerCamera::getInstance(), result); @@ -631,6 +670,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLPipeline::sUseOcclusion = occlusion;  		{ +			LLAppViewer::instance()->pingMainloopTimeout("Display:Sky");  			LLFastTimer t(LLFastTimer::FTM_UPDATE_SKY);	  			gSky.updateSky();  		} @@ -642,6 +682,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);  		} +		LLAppViewer::instance()->pingMainloopTimeout("Display:Render"); +		  		//// render frontmost floater opaque for occlusion culling purposes  		//LLFloater* frontmost_floaterp = gFloaterView->getFrontmost();  		//// assumes frontmost floater with focus is opaque @@ -681,20 +723,20 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		if (to_texture)  		{ -			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +			gGL.setColorMask(true, true);  			gPipeline.mScreen.bindTarget();  			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); -			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +			gGL.setColorMask(true, false);  		}  		if (!(LLAppViewer::instance()->logoutRequestSent() && LLAppViewer::instance()->hasSavedFinalSnapshot())  				&& !gRestoreGL)  		{ -			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +			gGL.setColorMask(true, false);  			LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;  			gPipeline.renderGeom(*LLViewerCamera::getInstance(), TRUE);  			LLPipeline::sUnderWaterRender = FALSE; -			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +			gGL.setColorMask(true, true);  			//store this frame's modelview matrix for use  			//when rendering next frame's occlusion queries @@ -715,11 +757,19 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		/// Using render to texture would be faster/better, but I don't have a   		/// grasp of their full display stack just yet.  		// gPostProcess->apply(gViewerWindow->getWindowDisplayWidth(), gViewerWindow->getWindowDisplayHeight()); + +		if (!for_snapshot) +		{ +			render_ui_and_swap(); +		} + +		LLSpatialGroup::sNoDelete = FALSE;  	}  	gFrameStats.start(LLFrameStats::RENDER_UI);  	if (gHandleKeysAsync)  	{ +		LLAppViewer::instance()->pingMainloopTimeout("Display:Keystrokes");  		process_keystrokes_async();  		stop_glerror();  	} @@ -732,6 +782,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		send_agent_resume();  		LLPipeline::sRenderFrameTest = FALSE;  	} + +	display_stats(); +				 +	LLAppViewer::instance()->pingMainloopTimeout("Display:Done");  }  void render_hud_attachments() @@ -926,19 +980,13 @@ void render_ui_and_swap()  	glh_set_current_modelview(saved_view);  	glPopMatrix(); -} -void render_ui_and_swap_if_needed() -{  	if (gDisplaySwapBuffers)  	{ -		render_ui_and_swap(); -		 -		{ -			LLFastTimer t(LLFastTimer::FTM_SWAP); -			gViewerWindow->mWindow->swapBuffers(); -		} +		LLFastTimer t(LLFastTimer::FTM_SWAP); +		gViewerWindow->mWindow->swapBuffers();  	} +	gDisplaySwapBuffers = TRUE;  }  void renderCoordinateAxes() @@ -1073,7 +1121,7 @@ void render_ui_2d()  	}  	stop_glerror(); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	// render outline for HUD  	if (gAgent.getAvatarObject() && gAgent.getAvatarObject()->mHUDCurZoom < 0.98f) @@ -1100,7 +1148,6 @@ void render_ui_2d()  	LLFontGL::sCurOrigin.set(0, 0);  } -  void render_disconnected_background()  {  	gGL.color4f(1,1,1,1); diff --git a/indra/newview/llviewerdisplay.h b/indra/newview/llviewerdisplay.h index 2190021fe4..b97f75b233 100644 --- a/indra/newview/llviewerdisplay.h +++ b/indra/newview/llviewerdisplay.h @@ -40,6 +40,7 @@ void display_cleanup();  void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE);  extern BOOL gDisplaySwapBuffers; +extern BOOL gDepthDirty;  extern BOOL	gTeleportDisplay;  extern LLFrameTimer	gTeleportDisplayTimer;  extern BOOL			gForceRenderLandFence; diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp index 9bf392249e..176bf9273a 100644 --- a/indra/newview/llviewerjoint.cpp +++ b/indra/newview/llviewerjoint.cpp @@ -37,7 +37,7 @@  #include "llviewerjoint.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llmath.h"  #include "llglheaders.h"  #include "llrendersphere.h" @@ -272,12 +272,12 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )  					triangle_count += drawShape( pixelArea, first_pass);  				}  				// second pass writes to z buffer only -				glColorMask(FALSE, FALSE, FALSE, FALSE); +				gGL.setColorMask(false, false);  				{  					triangle_count += drawShape( pixelArea, FALSE );  				}  				// third past respects z buffer and writes color -				glColorMask(TRUE, TRUE, TRUE, FALSE); +				gGL.setColorMask(true, false);  				{  					LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);  					triangle_count += drawShape( pixelArea, FALSE ); diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp index 9e5c207f7d..ce61c3a2cd 100644 --- a/indra/newview/llviewerjointattachment.cpp +++ b/indra/newview/llviewerjointattachment.cpp @@ -38,7 +38,7 @@  #include "llviewercontrol.h"  #include "lldrawable.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llvoavatar.h"  #include "llvolume.h"  #include "pipeline.h" diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 19035e8fc8..d6032118c9 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -36,6 +36,7 @@  #include "imageids.h"  #include "llfasttimer.h" +#include "llrender.h"  #include "llagent.h"  #include "llapr.h" @@ -545,17 +546,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)  		else  		{  			glColor4f(0.7f, 0.6f, 0.3f, 1.f); -			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -			glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_INTERPOLATE_ARB); - -			glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS_ARB); -			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); - -			glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,		GL_TEXTURE); -			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,		GL_SRC_COLOR); -			 -			glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB,		GL_TEXTURE); -			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB,		GL_ONE_MINUS_SRC_ALPHA); +			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);  		}  	}  	else if( mLayerSet ) @@ -573,12 +564,10 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)  	else  	if ( mTexture.notNull() )  	{ -		mTexture->bind(); -		if (!mTexture->getClampS()) { -			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -		} -		if (!mTexture->getClampT()) { -			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +		if (!mTexture->getClampS() || !mTexture->getClampT()) +		{ +			mTexture->bind(); +			mTexture->overrideClamp (TRUE, TRUE);  		}  	}  	else @@ -590,15 +579,8 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)  	{  		if (isTransparent())  		{ -			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -			glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -			glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_MODULATE); - -			glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PREVIOUS_ARB); -			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); - -			glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE);  // GL_TEXTURE_ENV_COLOR is set in renderPass1 -			glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); +			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); +			gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_CONST_ALPHA);  		}  		else  		{ @@ -639,16 +621,13 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)  	if (mTestImageName)  	{ -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	} -	if (mTexture.notNull()) { -		if (!mTexture->getClampS()) { -			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); -		} -		if (!mTexture->getClampT()) { -			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); -		} +	if (mTexture.notNull()) +	{ +		mTexture->bind(); +		mTexture->restoreClamp();  	}  	return triangle_count; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 060b69db74..645499d943 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -700,7 +700,7 @@ void init_menus()  	gPopupMenuView->setBackgroundColor( color );  	// If we are not in production, use a different color to make it apparent. -	if (LLAppViewer::instance()->isInProductionGrid()) +	if (LLViewerLogin::getInstance()->isInProductionGrid())  	{  		color = gColors.getColor( "MenuBarBgColor" );  	} @@ -722,7 +722,7 @@ void init_menus()  	gViewerWindow->getRootView()->addChild(gMenuHolder);      gViewerWindow->setMenuBackgroundColor(false,  -        LLAppViewer::instance()->isInProductionGrid()); +        LLViewerLogin::getInstance()->isInProductionGrid());  	// *TODO:Get the cost info from the server  	const LLString upload_cost("10"); @@ -969,7 +969,7 @@ void init_client_menu(LLMenuGL* menu)  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER -	if (!LLAppViewer::instance()->isInProductionGrid()) +	if (!LLViewerLogin::getInstance()->isInProductionGrid())  	{  		menu->append(new LLMenuItemCheckGL("Hacked Godmode",  										   &handle_toggle_hacked_godmode, @@ -1191,7 +1191,7 @@ void init_debug_ui_menu(LLMenuGL* menu)  	menu->append(new LLMenuItemCallGL( "Dump Focus Holder", &handle_dump_focus, NULL, NULL, 'F', MASK_ALT | MASK_CONTROL));  	menu->append(new LLMenuItemCallGL( "Print Selected Object Info",	&print_object_info, NULL, NULL, 'P', MASK_CONTROL|MASK_SHIFT ));  	menu->append(new LLMenuItemCallGL( "Print Agent Info",			&print_agent_nvpairs, NULL, NULL, 'P', MASK_SHIFT )); -	menu->append(new LLMenuItemCallGL( "Texture Memory Stats",  &output_statistics, NULL, NULL, 'M', MASK_SHIFT | MASK_ALT | MASK_CONTROL)); +	menu->append(new LLMenuItemCallGL( "Memory Stats",  &output_statistics, NULL, NULL, 'M', MASK_SHIFT | MASK_ALT | MASK_CONTROL));  	menu->append(new LLMenuItemCheckGL("Double-Click Auto-Pilot",   		menu_toggle_control, NULL, menu_check_control,   		(void*)"DoubleClickAutoPilot")); @@ -1498,6 +1498,7 @@ void init_debug_avatar_menu(LLMenuGL* menu)  	menu->appendMenu(sub_menu); +	menu->append(new LLMenuItemCheckGL("Enable Lip Sync (Beta)", menu_toggle_control, NULL, menu_check_control, (void*)"LipSyncEnabled"));  	menu->append(new LLMenuItemToggleGL("Tap-Tap-Hold To Run", &gAllowTapTapHoldRun));  	menu->append(new LLMenuItemCallGL("Force Params to Default", &LLAgent::clearVisualParams, NULL));  	menu->append(new LLMenuItemCallGL("Reload Vertex Shader", &reload_vertex_shader, NULL)); @@ -2762,7 +2763,7 @@ void set_god_level(U8 god_level)      if(gViewerWindow)      {          gViewerWindow->setMenuBackgroundColor(god_level > GOD_NOT, -            LLAppViewer::instance()->isInProductionGrid()); +            LLViewerLogin::getInstance()->isInProductionGrid());      }      LLString::format_map_t args; @@ -4099,7 +4100,7 @@ BOOL enable_take()  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLAppViewer::instance()->isInProductionGrid()  +		if (!LLViewerLogin::getInstance()->isInProductionGrid()               && gAgent.isGodlike())  		{  			return TRUE; @@ -4656,7 +4657,7 @@ class LLObjectEnableDelete : public view_listener_t  			TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -			(!LLAppViewer::instance()->isInProductionGrid() +			(!LLViewerLogin::getInstance()->isInProductionGrid()               && gAgent.isGodlike()) ||  # endif  			LLSelectMgr::getInstance()->canDoDelete(); @@ -6514,7 +6515,7 @@ class LLToolsEnableTakeCopy : public view_listener_t  			all_valid = true;  #ifndef HACKED_GODLIKE_VIEWER  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -			if (LLAppViewer::instance()->isInProductionGrid() +			if (LLViewerLogin::getInstance()->isInProductionGrid()                  || !gAgent.isGodlike())  # endif  			{ @@ -6618,7 +6619,7 @@ BOOL enable_save_into_inventory(void*)  	return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -	if (!LLAppViewer::instance()->isInProductionGrid() +	if (!LLViewerLogin::getInstance()->isInProductionGrid()          && gAgent.isGodlike())  	{  		return TRUE; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 477f6c35c1..4c8e75016c 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5194,10 +5194,12 @@ void process_script_teleport_request(LLMessageSystem* msg, void**)  	msg->getVector3("Data", "SimPosition", pos);  	msg->getVector3("Data", "LookAt", look_at); -	// gFloaterWorldMap->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); -	// LLFloaterWorldMap::show(NULL, TRUE); +	gFloaterWorldMap->trackURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]); +	LLFloaterWorldMap::show(NULL, TRUE); -	LLURLDispatcher::dispatch(LLURLDispatcher::buildSLURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]), FALSE); +	// remove above two lines and replace with below line +	// to re-enable parcel browser for llMapDestination() +	// LLURLDispatcher::dispatch(LLURLDispatcher::buildSLURL(sim_name, (S32)pos.mV[VX], (S32)pos.mV[VY], (S32)pos.mV[VZ]), FALSE);  } diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index b0ebc64b7a..fed98d5daa 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -33,8 +33,17 @@  #include "llviewerprecompiledheaders.h"  #include "llviewernetwork.h" +#include "llviewercontrol.h" -LLGridData gGridInfo[GRID_INFO_COUNT] =  +struct LLGridData +{ +	const char* mLabel; +	const char* mName; +	const char* mLoginURI; +	const char* mHelperURI; +}; + +static LLGridData gGridInfo[GRID_INFO_COUNT] =   {  	{ "None", "", "", ""},  	{ "Aditi",  @@ -111,8 +120,192 @@ LLGridData gGridInfo[GRID_INFO_COUNT] =  	  "" }  }; -// Use this to figure out which domain name and login URI to use. +#if LL_RELEASE_FOR_DOWNLOAD +	// Default userserver for production builds is agni +	const EGridInfo DEFAULT_GRID_CHOICE = GRID_INFO_AGNI; +#else +	// Default userserver for development builds is none +	const EGridInfo DEFAULT_GRID_CHOICE = GRID_INFO_NONE; +#endif -EGridInfo gGridChoice = GRID_INFO_NONE; -LLString gGridName;		/* Flawfinder: ignore */  unsigned char gMACAddress[MAC_ADDRESS_BYTES];		/* Flawfinder: ignore */ + +LLViewerLogin::LLViewerLogin() : +	mGridChoice(DEFAULT_GRID_CHOICE) +{ +} + +void LLViewerLogin::setGridChoice(EGridInfo grid) +{	 +	if(grid < 0 || grid >= GRID_INFO_COUNT) +	{ +		llerrs << "Invalid grid index specified." << llendl; +	} + +	if(mGridChoice != grid) +	{ +		mGridChoice = grid; +		if(GRID_INFO_LOCAL == mGridChoice) +		{ +			mGridName = LOOPBACK_ADDRESS_STRING; +		} +		else if(GRID_INFO_OTHER == mGridChoice) +		{ +			// *FIX:Mani - could this possibly be valid? +			mGridName = "other";  +		} +		else +		{ +			mGridName = gGridInfo[mGridChoice].mLabel; +		} + +		gSavedSettings.setS32("ServerChoice", mGridChoice); +		gSavedSettings.setString("CustomServer", ""); +	} +} + +void LLViewerLogin::setGridChoice(const std::string& grid_name) +{ +	// Set the grid choice based on a string. +	// The string can be: +	// - a grid label from the gGridInfo table  +	// - an ip address +    if(!grid_name.empty()) +    { +        // find the grid choice from the user setting. +        int grid_index = GRID_INFO_NONE;  +        for(;grid_index < GRID_INFO_OTHER; ++grid_index) +        { +            if(0 == LLString::compareInsensitive(gGridInfo[grid_index].mLabel, grid_name.c_str())) +            { +				// Founding a matching label in the list... +				setGridChoice((EGridInfo)grid_index); +				break; +            } +        } + +        if(GRID_INFO_OTHER == grid_index) +        { +            // *FIX:MEP Can and should we validate that this is an IP address? +            mGridChoice = GRID_INFO_OTHER; +            mGridName = grid_name; +			gSavedSettings.setS32("ServerChoice", mGridChoice); +			gSavedSettings.setString("CustomServer", mGridName); +        } +    } +} + +void LLViewerLogin::resetURIs() +{ +    // Clear URIs when picking a new server +	gSavedSettings.setValue("CmdLineLoginURI", LLSD::emptyArray()); +	gSavedSettings.setString("CmdLineHelperURI", ""); +} + +EGridInfo LLViewerLogin::getGridChoice() const +{ +	return mGridChoice; +} + +std::string LLViewerLogin::getGridLabel() const +{ +	if(mGridChoice == GRID_INFO_NONE) +	{ +		return "None"; +	} +	else if(mGridChoice < GRID_INFO_OTHER) +	{ +		return gGridInfo[mGridChoice].mLabel; +	} + +	return mGridName; +} + +std::string LLViewerLogin::getKnownGridLabel(EGridInfo grid_index) const +{ +	if(grid_index > GRID_INFO_NONE && grid_index < GRID_INFO_OTHER) +	{ +		return gGridInfo[grid_index].mLabel; +	} +	return gGridInfo[GRID_INFO_NONE].mLabel; +} + +void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const +{ +	// return the login uri set on the command line. +	LLControlVariable* c = gSavedSettings.getControl("CmdLineLoginURI"); +	if(c) +	{ +		LLSD v = c->getValue(); +		if(v.isArray()) +		{ +			for(LLSD::array_const_iterator itr = v.beginArray(); +				itr != v.endArray(); ++itr) +			{ +				std::string uri = itr->asString(); +				if(!uri.empty()) +				{ +					uris.push_back(uri); +				} +			} +		} +		else +		{ +			std::string uri = v.asString(); +			if(!uri.empty()) +			{ +				uris.push_back(uri); +			} +		} +	} + +	// If there was no command line uri... +	if(uris.empty()) +	{ +		// If its a known grid choice, get the uri from the table, +		// else try the grid name. +		if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER) +		{ +			uris.push_back(gGridInfo[mGridChoice].mLoginURI); +		} +		else +		{ +			uris.push_back(mGridName); +		} +	} +} + +std::string LLViewerLogin::getHelperURI() const +{ +	std::string helper_uri = gSavedSettings.getString("CmdLineHelperURI"); +	if (helper_uri.empty()) +	{ +		// grab URI from selected grid +		if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER) +		{ +			helper_uri = gGridInfo[mGridChoice].mHelperURI; +		} + +		if (helper_uri.empty()) +		{ +			// what do we do with unnamed/miscellaneous grids? +			// for now, operations that rely on the helper URI (currency/land purchasing) will fail +		} +	} +	return helper_uri; +} + +bool LLViewerLogin::isInProductionGrid() +{ +	// *NOTE:Mani This used to compare GRID_INFO_AGNI to gGridChoice, +	// but it seems that loginURI trumps that. +	std::vector<std::string> uris; +	getLoginURIs(uris); +	LLString::toLower(uris[0]); +	if((uris[0].find("agni") != std::string::npos)) +	{ +		return true; +	} + +	return false; +} diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 4e6c874921..05bb703bbb 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -59,18 +59,44 @@ enum EGridInfo  	GRID_INFO_COUNT  }; - -struct LLGridData +/** + * @brief A class to manage the viewer's login state. + *  + **/ +class LLViewerLogin : public LLSingleton<LLViewerLogin>  { -	const char* mLabel; -	const char* mName; -	const char* mLoginURI; -	const char* mHelperURI; -}; +public: +	LLViewerLogin(); + +	void setGridChoice(EGridInfo grid); +	void setGridChoice(const std::string& grid_name); +	void resetURIs(); + +	/** +	* @brief Get the enumeration of the grid choice. +	* Should only return values > 0 && < GRID_INFO_COUNT +	**/ +	EGridInfo getGridChoice() const; -extern EGridInfo gGridChoice; -extern LLGridData gGridInfo[]; -extern LLString gGridName;		/* Flawfinder: ignore */ +	/** +	* @brief Get a readable label for the grid choice. +	* Returns the readable name for the grid choice.  +	* If the grid is 'other', returns something +	* the string used to specifiy the grid. +	**/ +	std::string getGridLabel() const;  + +	std::string getKnownGridLabel(EGridInfo grid_index) const;  + +	void getLoginURIs(std::vector<std::string>& uris) const; +	std::string getHelperURI() const; + +	bool isInProductionGrid(); + +private: +	EGridInfo mGridChoice; +	std::string mGridName; +};  const S32 MAC_ADDRESS_BYTES = 6;  extern unsigned char gMACAddress[MAC_ADDRESS_BYTES];		/* Flawfinder: ignore */ diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index af662d92aa..3a501a9045 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -94,7 +94,7 @@  #include "llworld.h"  #include "llui.h"  #include "pipeline.h" -#include "llappviewer.h" +#include "llviewernetwork.h"  #include "llvowlsky.h"  //#define DEBUG_UPDATE_TYPE @@ -292,7 +292,7 @@ void LLViewerObject::markDead()  		LLViewerObject *childp;  		while (mChildList.size() > 0)  		{ -			childp = mChildList[0]; +			childp = mChildList.back();  			if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR)  			{  				//llinfos << "Marking child " << childp->getLocalID() << " as dead." << llendl; @@ -307,7 +307,7 @@ void LLViewerObject::markDead()  				((LLVOAvatar*)childp)->getOffObject();  				childp->setParent(NULL); // LLViewerObject::markDead 2  			} -			mChildList.erase(mChildList.begin()); +			mChildList.pop_back();  		}  		if (mDrawable.notNull()) @@ -4217,13 +4217,15 @@ void LLViewerObject::updateDrawable(BOOL force_damped)  	{  		BOOL damped_motion =   			!isChanged(SHIFTED) &&										// not shifted between regions this frame and... -				(force_damped ||										// ...forced into damped motion by application logic or... -					(!isSelected() &&									// ...not selected and... -					(mDrawable->isRoot() ||								// ... is root or ... -					!((LLViewerObject*)getParent())->isSelected()) &&	// ... parent is not selected and ... +			(	force_damped ||										// ...forced into damped motion by application logic or... +				(	!isSelected() &&									// ...not selected and... +					(	mDrawable->isRoot() ||								// ... is root or ... +						(getParent() && !((LLViewerObject*)getParent())->isSelected())// ... parent is not selected and ... +					) &&	  					getPCode() == LL_PCODE_VOLUME &&					// ...is a volume object and...  					getVelocity().isExactlyZero() &&					// ...is not moving physically and... -					mDrawable->getGeneration() != -1)					// ...was not created this frame. +					mDrawable->getGeneration() != -1                    // ...was not created this frame. +				)					  			);  		gPipeline.markMoved(mDrawable, damped_motion);  	} @@ -4570,7 +4572,7 @@ BOOL LLViewerObject::permYouOwner() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLAppViewer::instance()->isInProductionGrid() +		if (!LLViewerLogin::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; @@ -4607,7 +4609,7 @@ BOOL LLViewerObject::permOwnerModify() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLAppViewer::instance()->isInProductionGrid() +		if (!LLViewerLogin::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  	{  			return TRUE; @@ -4631,7 +4633,7 @@ BOOL LLViewerObject::permModify() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLAppViewer::instance()->isInProductionGrid() +		if (!LLViewerLogin::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  	{  			return TRUE; @@ -4655,7 +4657,7 @@ BOOL LLViewerObject::permCopy() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLAppViewer::instance()->isInProductionGrid() +		if (!LLViewerLogin::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; @@ -4679,7 +4681,7 @@ BOOL LLViewerObject::permMove() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLAppViewer::instance()->isInProductionGrid() +		if (!LLViewerLogin::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; @@ -4703,7 +4705,7 @@ BOOL LLViewerObject::permTransfer() const  		return TRUE;  #else  # ifdef TOGGLE_HACKED_GODLIKE_VIEWER -		if (!LLAppViewer::instance()->isInProductionGrid() +		if (!LLViewerLogin::getInstance()->isInProductionGrid()              && (gAgent.getGodLevel() >= GOD_MAINTENANCE))  		{  			return TRUE; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 7a6f87e019..2345b4ea06 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -36,7 +36,7 @@  #include "message.h"  #include "timing.h"  #include "llfasttimer.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llviewercontrol.h"  #include "llface.h" @@ -685,6 +685,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  			idle_iter != idle_list.end(); idle_iter++)  		{  			objectp = *idle_iter; +			llassert_always(objectp) ;  			if (!objectp->idleUpdate(agent, world, frame_time))  			{  				//  If Idle Update returns false, kill object! diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 0259d4896c..ba6a6005bf 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -100,15 +100,17 @@ void LLViewerParcelMedia::update(LLParcel* parcel)  		// we have a player  		if (parcel)  		{ -			// we're in a parcel -			bool new_parcel = false; -			S32 parcelid = parcel->getLocalID(); -			  			if(!gAgent.getRegion())  			{ -				llerrs << "gAgent's region is NULL." << llendl ;				 +				sMediaRegionID = LLUUID() ; +				stop() ; +				return ;				  			} +			// we're in a parcel +			bool new_parcel = false; +			S32 parcelid = parcel->getLocalID();						 +  			LLUUID regionid = gAgent.getRegion()->getRegionID();  			if (parcelid != sMediaParcelLocalID || regionid != sMediaRegionID)  			{ diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 342d8c7222..2b056a2583 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -36,7 +36,7 @@  // indra includes  #include "llparcel.h"  #include "llgl.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "v4color.h"  #include "v2math.h" @@ -71,7 +71,7 @@ LLViewerParcelOverlay::LLViewerParcelOverlay(LLViewerRegion* region, F32 region_  	mTexture = new LLImageGL(FALSE);  	mImageRaw = new LLImageRaw(mParcelGridsPerEdge, mParcelGridsPerEdge, OVERLAY_IMG_COMPONENTS);  	mTexture->createGLTexture(0, mImageRaw); -	glActiveTextureARB(GL_TEXTURE0_ARB); +	gGL.getTexUnit(0)->activate();  	mTexture->bind(0);  	mTexture->setClamp(TRUE, TRUE);  	mTexture->setMipFilterNearest(TRUE); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index f5ea73f1fc..b847f4d04c 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -76,7 +76,74 @@ extern BOOL gNoRender;  const F32 WATER_TEXTURE_SCALE = 8.f;			//  Number of times to repeat the water texture across a region  const S16 MAX_MAP_DIST = 10; +class BaseCapabilitiesComplete : public LLHTTPClient::Responder +{ +	LOG_CLASS(BaseCapabilitiesComplete); +public: +    BaseCapabilitiesComplete(LLViewerRegion* region) +		: mRegion(region) +    { } +	virtual ~BaseCapabilitiesComplete() +	{ +		if(mRegion) +		{ +			mRegion->setHttpResponderPtrNULL() ; +		} +	} +	void setRegion(LLViewerRegion* region) +	{ +		mRegion = region ; +	} + +    void error(U32 statusNum, const std::string& reason) +    { +		LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL; +		 +		if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) +		{ +			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); +		} +    } + +    void result(const LLSD& content) +    { +		if(!mRegion || this != mRegion->getHttpResponderPtr())//region is removed or responder is not created. +		{ +			return ; +		} + +		LLSD::map_const_iterator iter; +		for(iter = content.beginMap(); iter != content.endMap(); ++iter) +		{ +			mRegion->setCapability(iter->first, iter->second); +			LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "  +				<< iter->first << LL_ENDL; + +			/* HACK we're waiting for the ServerReleaseNotes */ +			if ((iter->first == "ServerReleaseNotes") && (LLFloaterReleaseMsg::sDisplayMessage)) +			{ +				LLFloaterReleaseMsg::show(); +				LLFloaterReleaseMsg::sDisplayMessage = false; +			} +		} +		 +		if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) +		{ +			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); +		} +	} + +    static boost::intrusive_ptr<BaseCapabilitiesComplete> build( +								LLViewerRegion* region) +    { +		return boost::intrusive_ptr<BaseCapabilitiesComplete>( +							 new BaseCapabilitiesComplete(region)); +    } + +private: +	LLViewerRegion* mRegion; +};  LLViewerRegion::LLViewerRegion(const U64 &handle, @@ -103,7 +170,6 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,  	mEventPoll(NULL)  {  	mWidth = region_width_meters; -  	mOriginGlobal = from_region_handle(handle);   	updateRenderMatrix(); @@ -170,10 +236,13 @@ void LLViewerRegion::initStats()  	mAlive = FALSE;					// can become false if circuit disconnects  } - -  LLViewerRegion::~LLViewerRegion()   { +	if(mHttpResponderPtr) +	{ +		(static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ; +	} +  	gVLManager.cleanupData(this);  	// Can't do this on destruction, because the neighbor pointers might be invalid.  	// This should be reference counted... @@ -1303,87 +1372,6 @@ void LLViewerRegion::unpackRegionHandshake()  	msg->sendReliable(host);  } - - -class BaseCapabilitiesComplete : public LLHTTPClient::Responder -{ -	LOG_CLASS(BaseCapabilitiesComplete); -public: -    BaseCapabilitiesComplete(LLViewerRegion* region, LLSD requestedCaps) -		: mRegion(region), -		  mRequestedCaps(requestedCaps) -    { } - -    void error(U32 statusNum, const std::string& reason) -    { -		LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL; -		 -		if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) -		{ -			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); -		} -    } - -    void result(const LLSD& content) -    { -		LLSD::map_const_iterator iter; -		 -		for(iter = content.beginMap(); iter != content.endMap(); ++iter) -		{ -			if (iter->second.asString().empty()) -			{ -				llwarns << "BaseCapabilitiesComplete::result EMPTY capability " -						<< iter->first << llendl; -				continue; -			} - -			mRegion->setCapability(iter->first, iter->second); -			LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "  -				<< iter->first << LL_ENDL; - -			/* HACK we're waiting for the ServerReleaseNotes */ -			if ((iter->first == "ServerReleaseNotes") && (LLFloaterReleaseMsg::sDisplayMessage)) -			{ -				LLFloaterReleaseMsg::show(); -				LLFloaterReleaseMsg::sDisplayMessage = false; -			} -		} -		 -		LLSD::array_const_iterator fail; -		for (fail = mRequestedCaps.beginArray(); -			 fail != mRequestedCaps.endArray(); -			 ++fail) -		{ -			std::string cap = fail->asString(); -			 -			if (mRegion->getCapability(cap).empty() && -				!LLViewerRegion::isSpecialCapabilityName(cap)) -			{ -				llwarns << "BaseCapabilitiesComplete::result FAILED to get " -						<< "capability " << cap << llendl; -			} -		} -		 -		if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) -		{ -			LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); -		} -	} - -    static boost::intrusive_ptr<BaseCapabilitiesComplete> build( -		LLViewerRegion* region, -		LLSD requestedCaps) -    { -		return boost::intrusive_ptr<BaseCapabilitiesComplete>( -			new BaseCapabilitiesComplete(region, requestedCaps)); -    } - -private: -	LLViewerRegion* mRegion; -	LLSD mRequestedCaps; -}; - -  void LLViewerRegion::setSeedCapability(const std::string& url)  {    if (getCapability("Seed") == url) @@ -1435,8 +1423,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url)  	llinfos << "posting to seed " << url << llendl; -	LLHTTPClient::post(url, capabilityNames, -					   BaseCapabilitiesComplete::build(this, capabilityNames)); +	mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ; +	LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr);  }  void LLViewerRegion::setCapability(const std::string& name, const std::string& url) diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index dedeb43523..d6e5e8320f 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -208,6 +208,9 @@ public:  	U32	getPacketsLost() const; +	void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;} +	const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;} +  	// Get/set named capability URLs for this region.  	void setSeedCapability(const std::string& url);  	void setCapability(const std::string& name, const std::string& url); @@ -374,6 +377,8 @@ protected:  private:  	//spatial partitions for objects in this region  	std::vector<LLSpatialPartition*> mObjectPartition; + +	LLHTTPClient::ResponderPtr  mHttpResponderPtr ;  };  inline BOOL LLViewerRegion::getAllowDamage() const diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8f675e66e7..8f79253cf3 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -43,7 +43,7 @@  #include "llviewquery.h"  #include "llxmltree.h"  //#include "llviewercamera.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llvoiceclient.h"	// for push-to-talk button handling @@ -182,6 +182,7 @@  #include "llviewerdisplay.h"  #include "llspatialpartition.h"  #include "llviewerjoystick.h" +#include "llviewernetwork.h"  #if LL_WINDOWS  #include "llwindebug.h" @@ -191,12 +192,12 @@  //  // Globals  // -void render_ui_and_swap_if_needed();  void render_ui_and_swap();  LLBottomPanel* gBottomPanel = NULL;  extern BOOL gDebugClicks;  extern BOOL gDisplaySwapBuffers; +extern BOOL gDepthDirty;  extern BOOL gResizeScreenTexture;  extern S32 gJamesInt; @@ -1638,7 +1639,7 @@ LLViewerWindow::LLViewerWindow(  void LLViewerWindow::initGLDefaults()  { -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );  	F32 ambient[4] = {0.f,0.f,0.f,0.f }; @@ -1656,7 +1657,7 @@ void LLViewerWindow::initGLDefaults()  	glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	glCullFace(GL_BACK); @@ -2198,7 +2199,7 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible )  		// ...and set the menu color appropriately.  		setMenuBackgroundColor(gAgent.getGodLevel() > GOD_NOT,  -			LLAppViewer::instance()->isInProductionGrid()); +			LLViewerLogin::getInstance()->isInProductionGrid());  	}  	if ( gStatusBar ) @@ -2213,15 +2214,15 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)     	LLString::format_map_t args;      LLColor4 new_bg_color; -    if(god_mode && LLAppViewer::instance()->isInProductionGrid()) +    if(god_mode && LLViewerLogin::getInstance()->isInProductionGrid())      {          new_bg_color = gColors.getColor( "MenuBarGodBgColor" );      } -    else if(god_mode && !LLAppViewer::instance()->isInProductionGrid()) +    else if(god_mode && !LLViewerLogin::getInstance()->isInProductionGrid())      {          new_bg_color = gColors.getColor( "MenuNonProductionGodBgColor" );      } -    else if(!god_mode && !LLAppViewer::instance()->isInProductionGrid()) +    else if(!god_mode && !LLViewerLogin::getInstance()->isInProductionGrid())      {          new_bg_color = gColors.getColor( "MenuNonProductionBgColor" );      } @@ -3386,9 +3387,8 @@ void LLViewerWindow::hitObjectOrLandGlobalAsync(S32 x, S32 y_from_bot, MASK mask  		return;  	} -	render_ui_and_swap_if_needed();  	glClear(GL_DEPTH_BUFFER_BIT); -	gDisplaySwapBuffers = FALSE; +	gDepthDirty = TRUE;  	S32 scaled_x = llround((F32)x * mDisplayScale.mV[VX]);  	S32 scaled_y = llround((F32)y_from_bot * mDisplayScale.mV[VY]); @@ -3538,7 +3538,7 @@ void LLViewerWindow::hitUIElementAsync(S32 x, S32 y_from_bot, MASK mask, void (*  	const LLVector2& display_scale = getDisplayScale();  	glScalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	// make viewport big enough to handle antialiased frame buffers  	glViewport(x - (PICK_HALF_WIDTH + 2), y_from_bot - (PICK_HALF_WIDTH + 2), PICK_DIAMETER + 4, PICK_DIAMETER + 4); @@ -4281,7 +4281,8 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p  	LLRect window_rect = mWindowRect;  	mWindowRect.set(0, h, w, 0); -	gDisplaySwapBuffers = FALSE;	 +	gDisplaySwapBuffers = FALSE; +	gDepthDirty = TRUE;  	glClearColor(0.f, 0.f, 0.f, 0.f);  	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);  	setup3DRender(); @@ -4349,6 +4350,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p  	setup3DRender();  	setupViewport();  	gDisplaySwapBuffers = FALSE; +	gDepthDirty = TRUE;  	// POST SNAPSHOT  	if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) @@ -4388,7 +4390,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  	}  	// PRE SNAPSHOT -	render_ui_and_swap_if_needed();  	gDisplaySwapBuffers = FALSE;  	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); @@ -4419,6 +4420,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  	LLRect window_rect = mWindowRect;  	BOOL use_fbo = FALSE; +	LLRenderTarget target;  	F32 scale_factor = 1.0f ;  	if(!keep_window_aspect) //image cropping  	{		 @@ -4427,37 +4429,39 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  		snapshot_height = (S32)(ratio * image_height) ;  		scale_factor = llmax(1.0f, 1.0f / ratio) ;	  	} - -	LLRenderTarget target; -	if (gGLManager.mHasFramebufferObject &&  -		(image_width > window_width || -		image_height > window_height) && -		 !show_ui && -		 keep_window_aspect) -	{ -		GLint max_size = 0; -		glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size); -		 -		if (image_width <= max_size && image_height <= max_size) -		{ -			use_fbo = TRUE; -			 -			snapshot_width = image_width; -			snapshot_height = image_height; -			target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB, TRUE); -			window_width = snapshot_width; -			window_height = snapshot_height; -			scale_factor = 1.f; -			mWindowRect.set(0, 0, snapshot_width, snapshot_height); -			target.bindTarget();			 -		} -		else //tiling +	else //the scene(window) proportion needs to be maintained. +	{ +		if(image_width > window_width || image_height > window_height) //need to enlarge the scene  		{ -			F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; -			snapshot_width = (S32)(ratio * image_width) ; -			snapshot_height = (S32)(ratio * image_height) ; -			scale_factor = llmax(1.0f, 1.0f / ratio) ;	 +			if (gGLManager.mHasFramebufferObject && !show_ui) +			{ +				GLint max_size = 0; +				glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size); +		 +				if (image_width <= max_size && image_height <= max_size) //re-project the scene +				{ +					use_fbo = TRUE; +					 +					snapshot_width = image_width; +					snapshot_height = image_height; +					target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, GL_TEXTURE_RECTANGLE_ARB, TRUE); +					window_width = snapshot_width; +					window_height = snapshot_height; +					scale_factor = 1.f; +					mWindowRect.set(0, 0, snapshot_width, snapshot_height); +					target.bindTarget();			 +				} +			} + +			if(!use_fbo) //no re-projection, so tiling the scene +			{ +				F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ; +				snapshot_width = (S32)(ratio * image_width) ; +				snapshot_height = (S32)(ratio * image_height) ; +				scale_factor = llmax(1.0f, 1.0f / ratio) ;	 +			}  		} +		//else: keep the current scene scale, re-scale it if necessary after reading out.  	}  	S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f); @@ -4502,6 +4506,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  		for (int subimage_x = 0; subimage_x < scale_factor; ++subimage_x)  		{  			gDisplaySwapBuffers = FALSE; +			gDepthDirty = TRUE;  			if (type == SNAPSHOT_TYPE_OBJECT_ID)  			{  				glClearColor(0.f, 0.f, 0.f, 0.f); @@ -4585,6 +4590,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei  		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);  	}  	gDisplaySwapBuffers = FALSE; +	gDepthDirty = TRUE;  	// POST SNAPSHOT  	if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 91c70bd315..2e001a50c7 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -37,7 +37,7 @@  #include "llvoavatar.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "audioengine.h"  #include "imageids.h"  #include "indra_constants.h" @@ -2750,7 +2750,7 @@ void LLVOAvatar::idleUpdateAppearanceAnimation()  void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)  {  	// Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync -	if ( voice_enabled && (gVoiceClient->lipSyncEnabled() > 0) && gVoiceClient->getIsSpeaking( mID ) ) +	if ( voice_enabled && (gVoiceClient->lipSyncEnabled()) && gVoiceClient->getIsSpeaking( mID ) )  	{  		F32 ooh_morph_amount = 0.0f;  		F32 aah_morph_amount = 0.0f; @@ -4158,23 +4158,23 @@ U32 LLVOAvatar::renderTransparent()  	BOOL first_pass = FALSE;  	if( isWearingWearableType( WT_SKIRT ) )  	{ -		glAlphaFunc(GL_GREATER,0.25f); +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);  		num_indices += mSkirtLOD.render(mAdjustedPixelArea, FALSE);  		first_pass = FALSE; -		glAlphaFunc(GL_GREATER,0.01f); +		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	}  	if (!mIsSelf || gAgent.needsRenderHead())  	{  		if (LLPipeline::sImpostorRender)  		{ -			glAlphaFunc(GL_GREATER, 0.5f); +			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  		}  		num_indices += mEyeLashLOD.render(mAdjustedPixelArea, first_pass);  		num_indices += mHairLOD.render(mAdjustedPixelArea, FALSE);  		if (LLPipeline::sImpostorRender)  		{ -			glAlphaFunc(GL_GREATER, 0.01f); +			gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  		}  	} @@ -4267,7 +4267,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color)  	up *= mImpostorDim.mV[1];  	LLGLEnable test(GL_ALPHA_TEST); -	glAlphaFunc(GL_GREATER, 0.f); +	gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);  	gGL.color4f(1,1,1,1);  	gGL.color4ubv(color.mV); diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 4d4808cdff..b3b82d9c79 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -850,7 +850,7 @@ LLVoiceClient::LLVoiceClient()  	setCaptureDevice(captureDevice);  	std::string renderDevice = gSavedSettings.getString("VoiceOutputAudioDevice");  	setRenderDevice(renderDevice); -	mLipSyncEnabled = gSavedSettings.getU32("LipSyncEnabled"); +	mLipSyncEnabled = gSavedSettings.getBOOL("LipSyncEnabled");  	mTuningMode = false;  	mTuningEnergy = 0.0f; @@ -1033,13 +1033,7 @@ void LLVoiceClient::userAuthorized(const std::string& firstName, const std::stri  	LL_INFOS("Voice") << "name \"" << mAccountDisplayName << "\" , ID " << agentID << LL_ENDL; -	std::string gridname = gGridName; -	LLString::toLower(gridname); -	if((gGridChoice == GRID_INFO_AGNI) ||  -		((gGridChoice == GRID_INFO_OTHER) && (gridname.find("agni") != std::string::npos))) -	{ -		sConnectingToAgni = true; -	} +	sConnectingToAgni = LLViewerLogin::getInstance()->isInProductionGrid();  	// MBW -- XXX -- Enable this when the bhd.vivox.com server gets a real ssl cert.	  	if(sConnectingToAgni) @@ -3632,12 +3626,12 @@ bool LLVoiceClient::voiceEnabled()  	return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice");  } -void LLVoiceClient::setLipSyncEnabled(U32 enabled) +void LLVoiceClient::setLipSyncEnabled(BOOL enabled)  {  	mLipSyncEnabled = enabled;  } -U32 LLVoiceClient::lipSyncEnabled() +BOOL LLVoiceClient::lipSyncEnabled()  {  	if ( mVoiceEnabled && stateDisabled != getState() ) @@ -3646,7 +3640,7 @@ U32 LLVoiceClient::lipSyncEnabled()  	}  	else  	{ -		return 0; +		return FALSE;  	}  } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 3ac5f0cdbf..8c3637830d 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -210,8 +210,8 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>  		void setMicGain(F32 volume);  		void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal)  		void setVivoxDebugServerName(std::string &serverName); -		void setLipSyncEnabled(U32 enabled); -		U32 lipSyncEnabled(); +		void setLipSyncEnabled(BOOL enabled); +		BOOL lipSyncEnabled();  		// PTT key triggering  		void keyDown(KEY key, MASK mask); @@ -518,7 +518,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>  		LLTimer		mUpdateTimer; -		U32			mLipSyncEnabled; +		BOOL		mLipSyncEnabled;  		typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;  		observer_set_t mObservers; diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index a0286d3e4b..40e405a313 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -45,7 +45,7 @@  #include "llviewerimage.h"  #include "llviewerimagelist.h"  #include "llvoiceclient.h" -#include "llglimmediate.h" +#include "llrender.h"  //brent's wave image  //29de489d-0491-fb00-7dab-f9e686d31e83 @@ -94,7 +94,7 @@ static bool handleVoiceVisualizerPrefsChanged(const LLSD& newvalue)  // Initialize the statics  //------------------------------------------------------------------  bool LLVoiceVisualizer::sPrefsInitialized	= false; -U32	 LLVoiceVisualizer::sLipSyncEnabled		= 0; +BOOL LLVoiceVisualizer::sLipSyncEnabled		= FALSE;  F32* LLVoiceVisualizer::sOoh				= NULL;  F32* LLVoiceVisualizer::sAah				= NULL;  U32	 LLVoiceVisualizer::sOohs				= 0; @@ -225,7 +225,7 @@ void LLVoiceVisualizer::setSpeakingAmplitude( F32 a )  //---------------------------------------------------  void LLVoiceVisualizer::setPreferences( )  { -	sLipSyncEnabled = gSavedSettings.getU32("LipSyncEnabled"); +	sLipSyncEnabled = gSavedSettings.getBOOL("LipSyncEnabled");  	sOohAahRate		= gSavedSettings.getF32("LipSyncOohAahRate");  	std::string oohString = gSavedSettings.getString("LipSyncOoh"); @@ -290,7 +290,7 @@ void LLVoiceVisualizer::lipStringToF32s ( std::string& in_string, F32*& out_F32s  //--------------------------------------------------------------------------  void LLVoiceVisualizer::lipSyncOohAah( F32& ooh, F32& aah )  { -	if( ( sLipSyncEnabled == 1 ) && mCurrentlySpeaking ) +	if( ( sLipSyncEnabled == TRUE ) && mCurrentlySpeaking )  	{  		U32 transfer_index = (U32) (sOohPowerTransfersf * mSpeakingAmplitude);  		if (transfer_index < 0) diff --git a/indra/newview/llvoicevisualizer.h b/indra/newview/llvoicevisualizer.h index bb2ce55d4a..72612d68c6 100644 --- a/indra/newview/llvoicevisualizer.h +++ b/indra/newview/llvoicevisualizer.h @@ -141,7 +141,7 @@ class LLVoiceVisualizer : public LLHUDEffect  	// private static members   	//--------------------------------------------------- -		static U32	  sLipSyncEnabled;		 // 0 disabled, 1 babble loop +		static BOOL	  sLipSyncEnabled;		 // 0 disabled, 1 babble loop  		static bool	  sPrefsInitialized;	 // the first instance will initialize the static members  		static F32*	  sOoh;					 // the babble loop of amplitudes for the ooh morph  		static F32*	  sAah;					 // the babble loop of amplitudes for the ooh morph diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 8915ae799d..968cc69d3a 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -960,12 +960,12 @@ void LLTerrainPartition::getGeometry(LLSpatialGroup* group)  	LLStrider<LLColor4U> colors;  	LLStrider<U16> indices; -	buffer->getVertexStrider(vertices); -	buffer->getNormalStrider(normals); -	buffer->getTexCoordStrider(texcoords); -	buffer->getTexCoord2Strider(texcoords2); -	buffer->getColorStrider(colors); -	buffer->getIndexStrider(indices); +	llassert_always(buffer->getVertexStrider(vertices)); +	llassert_always(buffer->getNormalStrider(normals)); +	llassert_always(buffer->getTexCoordStrider(texcoords)); +	llassert_always(buffer->getTexCoord2Strider(texcoords2)); +	llassert_always(buffer->getColorStrider(colors)); +	llassert_always(buffer->getIndexStrider(indices));  	U32 indices_index = 0;  	U32 index_offset = 0; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index a440ae2957..0117737225 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1841,7 +1841,7 @@ F32 LLVOVolume::getBinRadius()  		}  		else  		{ -			radius = 32.f; +			radius = llmax(mDrawable->getRadius(), 32.f);  		}  	}  	else diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp index ff34fd27be..27a0155b14 100644 --- a/indra/newview/llwatchdog.cpp +++ b/indra/newview/llwatchdog.cpp @@ -33,6 +33,8 @@  #include "llviewerprecompiledheaders.h"  #include "llwatchdog.h" +const U32 WATCHDOG_SLEEP_TIME_USEC = 1000000; +  // This class runs the watchdog timing thread.  class LLWatchdogTimerThread : public LLThread  { @@ -74,6 +76,7 @@ LLWatchdogEntry::LLWatchdogEntry()  LLWatchdogEntry::~LLWatchdogEntry()  { +	stop();  }  void LLWatchdogEntry::start() @@ -87,8 +90,11 @@ void LLWatchdogEntry::stop()  }  // LLWatchdogTimeout +const std::string UNINIT_STRING = "uninitialized"; +  LLWatchdogTimeout::LLWatchdogTimeout() :  -	mTimeout(0.0f)  +	mTimeout(0.0f), +	mPingState(UNINIT_STRING)  {  } @@ -101,35 +107,46 @@ bool LLWatchdogTimeout::isAlive() const  	return (mTimer.getStarted() && !mTimer.hasExpired());   } +void LLWatchdogTimeout::reset() +{ +	mTimer.setTimerExpirySec(mTimeout);  +} +  void LLWatchdogTimeout::setTimeout(F32 d)   {  	mTimeout = d;  } -void LLWatchdogTimeout::start()  +void LLWatchdogTimeout::start(const std::string& state)   {  	// Order of operation is very impmortant here.  	// After LLWatchdogEntry::start() is called  	// LLWatchdogTimeout::isAlive() will be called asynchronously.   	mTimer.start();  -	mTimer.setTimerExpirySec(mTimeout);  +	ping(state);  	LLWatchdogEntry::start();  } +  void LLWatchdogTimeout::stop()   {  	LLWatchdogEntry::stop();  	mTimer.stop();  } -void LLWatchdogTimeout::ping()  +void LLWatchdogTimeout::ping(const std::string& state)   {  -	mTimer.setTimerExpirySec(mTimeout);  +	if(!state.empty()) +	{ +		mPingState = state; +	} +	reset();  } -// LlWatchdog +// LLWatchdog  LLWatchdog::LLWatchdog() :  	mSuspectsAccessMutex(NULL), -	mTimer(NULL) +	mTimer(NULL), +	mLastClockCount(0)  {  } @@ -139,55 +156,112 @@ LLWatchdog::~LLWatchdog()  void LLWatchdog::add(LLWatchdogEntry* e)  { -	mSuspectsAccessMutex->lock(); +	lockThread();  	mSuspects.insert(e); -	mSuspectsAccessMutex->unlock(); +	unlockThread();  }  void LLWatchdog::remove(LLWatchdogEntry* e)  { -	mSuspectsAccessMutex->lock(); +	lockThread();      mSuspects.erase(e); -	mSuspectsAccessMutex->unlock(); +	unlockThread();  }  void LLWatchdog::init()  { -	mSuspectsAccessMutex = new LLMutex(NULL); -	mTimer = new LLWatchdogTimerThread(); -	mTimer->setSleepTime(1000); -	mTimer->start(); +	if(!mSuspectsAccessMutex && !mTimer) +	{ +		mSuspectsAccessMutex = new LLMutex(NULL); +		mTimer = new LLWatchdogTimerThread(); +		mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000); +		mLastClockCount = LLTimer::getTotalTime(); + +		// mTimer->start() kicks off the thread, any code after +		// start needs to use the mSuspectsAccessMutex +		mTimer->start(); +	}  }  void LLWatchdog::cleanup()  { -	mTimer->stop(); -	delete mTimer; -	delete mSuspectsAccessMutex; +	if(mTimer) +	{ +		mTimer->stop(); +		delete mTimer; +		mTimer = NULL; +	} + +	if(mSuspectsAccessMutex) +	{ +		delete mSuspectsAccessMutex; +		mSuspectsAccessMutex = NULL; +	} + +	mLastClockCount = 0;  }  void LLWatchdog::run()  { -	mSuspectsAccessMutex->lock(); +	lockThread(); + +	// Check the time since the last call to run... +	// If the time elapsed is two times greater than the regualr sleep time +	// reset the active timeouts. +	const U32 TIME_ELAPSED_MULTIPLIER = 2; +	U64 current_time = LLTimer::getTotalTime(); +	U64 current_run_delta = current_time - mLastClockCount; +	mLastClockCount = current_time; -	SuspectsRegistry::iterator result =  -		std::find_if(mSuspects.begin(),  +	if(current_run_delta > (WATCHDOG_SLEEP_TIME_USEC * TIME_ELAPSED_MULTIPLIER)) +	{ +		llinfos << "Watchdog thread delayed: resetting entries." << llendl; +		std::for_each(mSuspects.begin(),   			mSuspects.end(),  -			std::not1(std::mem_fun(&LLWatchdogEntry::isAlive)) +			std::mem_fun(&LLWatchdogEntry::reset)  			); - -	if(result != mSuspects.end()) +	} +	else  	{ -		// error!!! -		mTimer->stop(); +		SuspectsRegistry::iterator result =  +			std::find_if(mSuspects.begin(),  +				mSuspects.end(),  +				std::not1(std::mem_fun(&LLWatchdogEntry::isAlive)) +				); + +		if(result != mSuspects.end()) +		{ +			// error!!! +			if(mTimer) +			{ +				mTimer->stop(); +			} -		llinfos << "Watchdog detected error:" << llendl; +			llinfos << "Watchdog detected error:" << llendl;  #ifdef LL_WINDOWS -		RaiseException(0,0,0,0); +			RaiseException(0,0,0,0);  #else -		raise(SIGQUIT); +			raise(SIGQUIT);  #endif +		} +	} + + +	unlockThread(); +} + +void LLWatchdog::lockThread() +{ +	if(mSuspectsAccessMutex != NULL) +	{ +		mSuspectsAccessMutex->lock();  	} +} -	mSuspectsAccessMutex->unlock(); +void LLWatchdog::unlockThread() +{ +	if(mSuspectsAccessMutex != NULL) +	{ +		mSuspectsAccessMutex->unlock(); +	}  } diff --git a/indra/newview/llwatchdog.h b/indra/newview/llwatchdog.h index 0d897ca4c9..0bcf11c3a3 100644 --- a/indra/newview/llwatchdog.h +++ b/indra/newview/llwatchdog.h @@ -48,6 +48,7 @@ public:  	// This may mean that resources used by   	// isAlive and other method may need synchronization.  	virtual bool isAlive() const = 0; +	virtual void reset() = 0;  	virtual void start();  	virtual void stop();  }; @@ -59,15 +60,18 @@ public:  	virtual ~LLWatchdogTimeout();  	/* virtual */ bool isAlive() const; -	/* virtual */ void start();  +	/* virtual */ void reset(); +	/* virtual */ void start(const std::string& state);   	/* virtual */ void stop();  	void setTimeout(F32 d); -	void ping(); +	void ping(const std::string& state); +	const std::string& getState() {return mPingState; }  private:  	LLTimer mTimer;  	F32 mTimeout; +	std::string mPingState;  };  class LLWatchdogTimerThread; // Defined in the cpp @@ -86,10 +90,14 @@ public:  	void cleanup();  private: +	void lockThread(); +	void unlockThread(); +  	typedef std::set<LLWatchdogEntry*> SuspectsRegistry;  	SuspectsRegistry mSuspects;  	LLMutex* mSuspectsAccessMutex;  	LLWatchdogTimerThread* mTimer; +	U64 mLastClockCount;  };  #endif // LL_LLTHREADWATCHDOG_H diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index a6fbe71d67..2853860802 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -407,7 +407,7 @@ F32 LLWaterParamManager::getFogDensity(void)  	F32 fogDensity = mCurParams.getFloat("waterFogDensity", err);  	// modify if we're underwater -	const F32 water_height = gAgent.getRegion()->getWaterHeight(); +	const F32 water_height = gAgent.getRegion() ? gAgent.getRegion()->getWaterHeight() : 0.f;  	F32 camera_height = gAgent.getCameraPositionAgent().mV[2];  	if(camera_height <= water_height)  	{ diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index af554e5160..f084088478 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -846,7 +846,7 @@ struct LLWearableSaveData  void LLWearable::saveNewAsset()  {  //	llinfos << "LLWearable::saveNewAsset() type: " << getTypeName() << llendl; -	//dump(); +	//llinfos << *this << llendl;  	char new_asset_id_string[UUID_STR_LENGTH];		/* Flawfinder: ignore */  	mAssetID.toString(new_asset_id_string); @@ -949,31 +949,32 @@ BOOL LLWearable::isMatchedToInventoryItem( LLViewerInventoryItem* item )  		( mSaleInfo == item->getSaleInfo() );  } -void LLWearable::dump() +std::ostream& operator<<(std::ostream &s, const LLWearable &w)  { -	llinfos << "wearable " << LLWearable::typeToTypeName( mType ) << llendl; -	llinfos << "    Name: " << mName << llendl; -	llinfos << "    Desc: " << mDescription << llendl; -	//mPermissions -	//mSaleInfo +	s << "wearable " << LLWearable::typeToTypeName( w.mType ) << "\n"; +	s << "    Name: " << w.mName << "\n"; +	s << "    Desc: " << w.mDescription << "\n"; +	//w.mPermissions +	//w.mSaleInfo -	llinfos << "    Params:" << llendl; -	for (param_map_t::iterator iter = mVisualParamMap.begin(); -		 iter != mVisualParamMap.end(); ++iter) +	s << "    Params:" << "\n"; +	for (LLWearable::param_map_t::const_iterator iter = w.mVisualParamMap.begin(); +		 iter != w.mVisualParamMap.end(); ++iter)  	{  		S32 param_id = iter->first;  		F32 param_weight = iter->second; -		llinfos << "        " << param_id << " " << param_weight << llendl; +		s << "        " << param_id << " " << param_weight << "\n";  	} -	llinfos << "    Textures:" << llendl; -	for (te_map_t::iterator iter = mTEMap.begin(); -		 iter != mTEMap.end(); ++iter) +	s << "    Textures:" << "\n"; +	for (LLWearable::te_map_t::const_iterator iter = w.mTEMap.begin(); +		 iter != w.mTEMap.end(); ++iter)  	{  		S32 te = iter->first; -		LLUUID& image_id = iter->second; -		llinfos << "        " << te << " " << image_id << llendl; +		const LLUUID& image_id = iter->second; +		s << "        " << te << " " << image_id << "\n";  	} +	return s;  } diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index fb66663fc2..059444d941 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -118,7 +118,7 @@ public:  	static void			setCurrentDefinitionVersion( S32 version ) { LLWearable::sCurrentDefinitionVersion = version; } -	void				dump(); +	friend std::ostream& operator<<(std::ostream &s, const LLWearable &w);  private:  	static S32			sCurrentDefinitionVersion;	// Depends on the current state of the avatar_lad.xml. diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 3ec5737acf..7fca271d3d 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -57,13 +57,15 @@ struct LLWearableArrivedData  		mAssetType( asset_type ),  		mCallback( asset_arrived_callback ),   		mUserdata( userdata ), -		mName( wearable_name ) +		mName( wearable_name ), +		mRetries(0)  		{}  	LLAssetType::EType mAssetType;  	void	(*mCallback)(LLWearable*, void* userdata);  	void*	mUserdata;  	LLString mName; +	S32	mRetries;  }; @@ -99,12 +101,12 @@ void LLWearableList::getAsset( const LLAssetID& assetID, const LLString& wearabl  // static  void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID& uuid, void* userdata, S32 status, LLExtStat ext_status )  { -	BOOL success = FALSE;  	LLWearableArrivedData* data = (LLWearableArrivedData*) userdata; - +	LLWearable* wearable = NULL; // NULL indicates failure +	  	if( !filename )  	{ -		llinfos << "Bad Wearable Asset: missing file." << llendl; +		LL_WARNS("Wearable") << "Bad Wearable Asset: missing file." << LL_ENDL;  	}  	else  	if( status >= 0 ) @@ -113,38 +115,16 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  		LLFILE* fp = LLFile::fopen(filename, "rb");		/*Flawfinder: ignore*/  		if( !fp )  		{ -			llinfos << "Bad Wearable Asset: unable to open file: '" << filename << "'" << llendl; +			LL_WARNS("Wearable") << "Bad Wearable Asset: unable to open file: '" << filename << "'" << LL_ENDL;  		}  		else  		{ -			LLWearable *wearable = new LLWearable(uuid); -			if( wearable->importFile( fp ) ) -			{ -//				llinfos << "processGetAssetReply()" << llendl; -//				wearable->dump(); - -				gWearableList.mList[ uuid ] = wearable; -				if( data->mCallback ) -				{ -					data->mCallback( wearable, data->mUserdata ); -				} -				success = TRUE; -			} -			else +			wearable = new LLWearable(uuid); +			bool res = wearable->importFile( fp ); +			if (!res)  			{ -				LLString::format_map_t args; -				// *TODO:translate -				args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType); -				if (data->mName.empty()) -				{ -					LLNotifyBox::showXml("FailedToLoadWearableUnnamed", args); -				} -				else -				{ -					args["[DESC]"] = data->mName; -					LLNotifyBox::showXml("FailedToLoadWearable", args); -				}  				delete wearable; +				wearable = NULL;  			}  			fclose( fp ); @@ -162,44 +142,64 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID  		}  		LLViewerStats::getInstance()->incStat( LLViewerStats::ST_DOWNLOAD_FAILED ); -		llwarns << "Wearable download failed: " << LLAssetStorage::getErrorString( status ) << " " << uuid << llendl; +		LL_WARNS("Wearable") << "Wearable download failed: " << LLAssetStorage::getErrorString( status ) << " " << uuid << LL_ENDL;  		switch( status )  		{  		  case LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE:  		  { -			  LLString::format_map_t args; -			  // *TODO:translate -			  args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType); -			  if (data->mName.empty()) +			  // Fail +			  break; +		  } +		  default: +		  { +			  static const S32 MAX_RETRIES = 3; +			  if (data->mRetries < MAX_RETRIES)  			  { -				  LLNotifyBox::showXml("FailedToFindWearableUnnamed", args); +				  // Try again +				  data->mRetries++; +				  gAssetStorage->getAssetData(uuid, +											  data->mAssetType, +											  LLWearableList::processGetAssetReply, +											  userdata);  // re-use instead of deleting. +				  return;  			  }  			  else  			  { -				  args["[DESC]"] = data->mName; -				  LLNotifyBox::showXml("FailedToFindWearable", args); +				  // Fail +				  break;  			  } - -			  // Asset does not exist in the database. -			  // Can't load asset, so return NULL -			  if( data->mCallback ) -			  { -				  data->mCallback( NULL, data->mUserdata ); -			  } -			  break; -		  } -		  default: -		  { -			  // Try again -			  gAssetStorage->getAssetData(uuid, -										  data->mAssetType, -										  LLWearableList::processGetAssetReply, -										  userdata);  // re-use instead of deleting. -			  return;  		  }  		}  	} +	if (wearable) // success +	{ +		gWearableList.mList[ uuid ] = wearable; +		LL_DEBUGS("Wearable") << "processGetAssetReply()" << LL_ENDL; +		LL_DEBUGS("Wearable") << wearable << LL_ENDL; +	} +	else +	{ +		LLString::format_map_t args; +		// *TODO:translate +		args["[TYPE]"] = LLAssetType::lookupHumanReadable(data->mAssetType); +		if (data->mName.empty()) +		{ +			LLNotifyBox::showXml("FailedToFindWearableUnnamed", args); +		} +		else +		{ +			args["[DESC]"] = data->mName; +			LLNotifyBox::showXml("FailedToFindWearable", args); +		} +	} +	// Always call callback; wearable will be NULL if we failed +	{ +		if( data->mCallback ) +		{ +			data->mCallback( wearable, data->mUserdata ); +		} +	}  	delete data;  } diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 3068f2cbb1..7a2acbb094 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1113,7 +1113,7 @@ void send_agent_pause()  {  	// *NOTE:Mani Pausing the mainloop timeout. Otherwise a long modal event may cause  	// the thread monitor to timeout. -	LLAppViewer::instance()->stopMainloopTimeout(); +	LLAppViewer::instance()->pauseMainloopTimeout();  	// Note: used to check for LLWorld initialization before it became a singleton.  	// Rather than just remove this check I'm changing it to assure that the message  @@ -1171,7 +1171,7 @@ void send_agent_resume()  	// Reset the FPS counter to avoid an invalid fps  	LLViewerStats::getInstance()->mFPSStat.start(); -	LLAppViewer::instance()->startMainloopTimeout(); +	LLAppViewer::instance()->resumeMainloopTimeout();  } diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 16b277f6a6..1dd08604cd 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -161,6 +161,11 @@ void LLWorldMap::reset()  	mNeighborMapWidth = 0;  	mNeighborMapHeight = 0; + +	for (S32 i=0; i<MAP_SIM_IMAGE_TYPES; i++) +	{ +		mMapLayers[i].clear(); +	}  }  void LLWorldMap::eraseItems() diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 1db9e5db30..04a09490ea 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -38,7 +38,7 @@  #include "llmath.h"		// clampf()  #include "llregionhandle.h"  #include "lleventflags.h" -#include "llglimmediate.h" +#include "llrender.h"  #include "llagent.h"  #include "llcallingcard.h" @@ -307,17 +307,17 @@ void LLWorldMapView::draw()  		// Clear the background alpha to 0  		gGL.flush(); -		glColorMask(FALSE, FALSE, FALSE, TRUE); -		glAlphaFunc(GL_GEQUAL, 0.00f); -		gGL.blendFunc(GL_ONE, GL_ZERO); +		gGL.setColorMask(false, true); +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.f); +		gGL.setSceneBlendType(LLRender::BT_REPLACE);  		gGL.color4f(0.0f, 0.0f, 0.0f, 0.0f);  		gl_rect_2d(0, height, width, 0);  	}  	gGL.flush(); -	glAlphaFunc(GL_GEQUAL, 0.01f); -	glColorMask(TRUE, TRUE, TRUE, TRUE); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	gGL.setColorMask(true, true); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	F32 layer_alpha = 1.f; @@ -382,7 +382,7 @@ void LLWorldMapView::draw()  		// Draw map image into RGB  		//gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  		gGL.flush(); -		glColorMask(TRUE, TRUE, TRUE, FALSE); +		gGL.setColorMask(true, false);  		gGL.color4f(1.f, 1.f, 1.f, layer_alpha);  		gGL.begin(LLVertexBuffer::QUADS); @@ -398,7 +398,7 @@ void LLWorldMapView::draw()  		// draw an alpha of 1 where the sims are visible  		gGL.flush(); -		glColorMask(FALSE, FALSE, FALSE, TRUE); +		gGL.setColorMask(false, true);  		gGL.color4f(1.f, 1.f, 1.f, 1.f);  		gGL.begin(LLVertexBuffer::QUADS); @@ -414,8 +414,8 @@ void LLWorldMapView::draw()  	}  	gGL.flush(); -	glAlphaFunc(GL_GEQUAL, 0.01f); -	glColorMask(TRUE, TRUE, TRUE, TRUE); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	gGL.setColorMask(true, true);  #if 1  	F32 sim_alpha = 1.f; @@ -538,7 +538,7 @@ void LLWorldMapView::draw()  			LLGLSUIDefault gls_ui;  			LLViewerImage::bindTexture(simimage); -			gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +			gGL.setSceneBlendType(LLRender::BT_ALPHA);  			F32 alpha = sim_alpha * info->mAlpha;  			gGL.color4f(1.f, 1.0f, 1.0f, alpha); @@ -573,8 +573,8 @@ void LLWorldMapView::draw()  			{  				// draw an alpha of 1 where the sims are visible (except NULL sims)  				gGL.flush(); -				gGL.blendFunc(GL_ONE, GL_ZERO); -				glColorMask(FALSE, FALSE, FALSE, TRUE); +				gGL.setSceneBlendType(LLRender::BT_REPLACE); +				gGL.setColorMask(false, true);  				gGL.color4f(1.f, 1.f, 1.f, 1.f);  				LLGLSNoTexture gls_no_texture; @@ -586,14 +586,14 @@ void LLWorldMapView::draw()  				gGL.end();  				gGL.flush(); -				glColorMask(TRUE, TRUE, TRUE, TRUE); +				gGL.setColorMask(true, true);  			}  		}  		if (info->mAccess == SIM_ACCESS_DOWN)  		{  			// Draw a transparent red square over down sims -			gGL.blendFunc(GL_DST_ALPHA, GL_SRC_ALPHA); +			gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_SOURCE_ALPHA);  			gGL.color4f(0.2f, 0.0f, 0.0f, 0.4f);  			LLGLSNoTexture gls_no_texture; @@ -610,7 +610,7 @@ void LLWorldMapView::draw()  			&& info->mAccess > SIM_ACCESS_PG  			&& gAgent.isTeen())  		{ -			gGL.blendFunc(GL_DST_ALPHA, GL_ZERO); +			gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO);  			LLGLSNoTexture gls_no_texture;  			gGL.color3f(1.f, 0.f, 0.f); @@ -686,14 +686,14 @@ void LLWorldMapView::draw()  	LLGLSUIDefault gls_ui;  	{  		LLGLSNoTexture gls_no_texture; -		glAlphaFunc(GL_GEQUAL, 0.0f); -		gGL.blendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA); +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.f); +		gGL.blendFunc(LLRender::BF_ONE_MINUS_DEST_ALPHA, LLRender::BF_DEST_ALPHA);  		gGL.color4fv( mBackgroundColor.mV );  		gl_rect_2d(0, height, width, 0);  	} -	glAlphaFunc(GL_GEQUAL, 0.01f); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	// Infohubs  	if (gSavedSettings.getBOOL("MapShowInfohubs"))   //(gMapScale >= sThresholdB) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 18b99d8b74..643c1ec055 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -50,7 +50,7 @@  #include "v3color.h"  #include "llui.h"   #include "llglheaders.h" -#include "llglimmediate.h" +#include "llrender.h"  // newview includes  #include "llagent.h" @@ -108,8 +108,6 @@  //#define DEBUG_INDICES  #endif -void render_ui_and_swap_if_needed(); -  const F32 BACKLIGHT_DAY_MAGNITUDE_AVATAR = 0.2f;  const F32 BACKLIGHT_NIGHT_MAGNITUDE_AVATAR = 0.1f;  const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f; @@ -506,11 +504,7 @@ void LLPipeline::createGLBuffers()  				res = 128;  				mCubeBuffer = new LLCubeMap();  				mCubeBuffer->initGL(); -				glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, mCubeBuffer->getGLName()); -				glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -				glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -				glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -				glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +				mCubeBuffer->setReflection();  				for (U32 i = 0; i < 6; i++)  				{ @@ -1180,7 +1174,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	LLGLDisable test(GL_ALPHA_TEST);  	LLViewerImage::unbindTexture(0, GL_TEXTURE_2D); -	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); +	gGL.setColorMask(false, false);  	LLGLDepthTest depth(GL_TRUE, GL_FALSE);  	for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin();  @@ -1238,7 +1232,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  		sCull->pushDrawable(gSky.mVOGroundp->mDrawable);  	} -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +	gGL.setColorMask(true, false);  	glPopMatrix();  	if (to_texture) @@ -1315,11 +1309,11 @@ void LLPipeline::doOcclusion(LLCamera& camera)  	LLVertexBuffer::unbind();  	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_OCCLUSION))  	{ -		glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); +		gGL.setColorMask(true, false, false, false);  	}  	else  	{ -		glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); +		gGL.setColorMask(false, false);  	}  	LLGLDisable blend(GL_BLEND);  	LLGLDisable test(GL_ALPHA_TEST); @@ -1336,7 +1330,7 @@ void LLPipeline::doOcclusion(LLCamera& camera)  		}  	} -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +	gGL.setColorMask(true, false);  	glFlush();  } @@ -1550,10 +1544,8 @@ void LLPipeline::shiftObjects(const LLVector3 &offset)  	assertInitialized(); -	//do a swap to indicate an invalid previous frame camera -	render_ui_and_swap_if_needed();  	glClear(GL_DEPTH_BUFFER_BIT); -	gDisplaySwapBuffers = FALSE; +	gDepthDirty = FALSE;  	for (LLDrawable::drawable_vector_t::iterator iter = mShiftList.begin();  		 iter != mShiftList.end(); iter++) @@ -1978,7 +1970,10 @@ void LLPipeline::postSort(LLCamera& camera)  		}  	} -	//build render map +	//rebuild groups +	sCull->assertDrawMapsEmpty(); + +	LLSpatialGroup::sNoDelete = FALSE;  	for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)  	{  		LLSpatialGroup* group = *i; @@ -1989,6 +1984,18 @@ void LLPipeline::postSort(LLCamera& camera)  		}  		group->rebuildGeom(); +	} +	LLSpatialGroup::sNoDelete = TRUE; + +	//build render map +	for (LLCullResult::sg_list_t::iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i) +	{ +		LLSpatialGroup* group = *i; +		if (sUseOcclusion &&  +			group->isState(LLSpatialGroup::OCCLUDED)) +		{ +			continue; +		}  		for (LLSpatialGroup::draw_map_t::iterator j = group->mDrawMap.begin(); j != group->mDrawMap.end(); ++j)  		{ @@ -2117,6 +2124,8 @@ void LLPipeline::postSort(LLCamera& camera)  		} func;  		LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func);  	} + +	LLSpatialGroup::sNoDelete = FALSE;  } @@ -2507,7 +2516,7 @@ void LLPipeline::renderDebug()  	gGLLastMatrix = NULL;  	glLoadMatrixd(gGLModelView); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +	gGL.setColorMask(true, false);  	// Debug stuff.  	for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin();  @@ -2578,7 +2587,7 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects)  {  	assertInitialized(); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); +	gGL.setColorMask(true, false);  	gPipeline.resetDrawOrders();  	for (std::set<LLViewerObject*>::iterator iter = objects.begin(); iter != objects.end(); ++iter) @@ -2629,25 +2638,15 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects)  	LLGLEnable alpha_test(GL_ALPHA_TEST);  	if (gPickTransparent)  	{ -		glAlphaFunc(GL_GEQUAL, 0.0f); +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.f);  	}  	else  	{ -		glAlphaFunc(GL_GREATER, 0.2f); +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.2f);  	} -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_COMBINE_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,		GL_REPLACE); -	glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,		GL_MODULATE); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,		GL_PRIMARY_COLOR); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,		GL_SRC_COLOR); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,		GL_TEXTURE); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,	GL_SRC_ALPHA); - -	glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB,		GL_PRIMARY_COLOR_ARB); -	glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB,	GL_SRC_ALPHA); +	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_COLOR); +	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);  	U32 prim_mask = LLVertexBuffer::MAP_VERTEX |   					LLVertexBuffer::MAP_TEXCOORD; @@ -2748,11 +2747,11 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects)  		glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);  	} -	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	LLVertexBuffer::unbind(); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +	gGL.setColorMask(true, true);  }  void LLPipeline::renderFaceForUVSelect(LLFace* facep) @@ -4127,10 +4126,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)  	glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width);  	if (width != res)  	{ -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +		cube_map->setReflection();  		for (U32 i = 0; i < 6; i++)  		{ @@ -4211,9 +4207,9 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam)  		gPipeline.stateSort(cube_cam, result);  		glClearColor(0,0,0,0); -		glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); +		gGL.setColorMask(true, true);  		glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); -		glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); +		gGL.setColorMask(true, false);  		stop_glerror();  		gPipeline.renderGeom(cube_cam);  	} @@ -4329,7 +4325,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)  	U32 res = (U32) gSavedSettings.getS32("RenderReflectionRes");  	enableLightsFullbright(LLColor4::white);  	LLGLDepthTest depth(GL_FALSE); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +	gGL.setColorMask(true, true);  	glMatrixMode(GL_PROJECTION);  	glPushMatrix();  	glLoadIdentity(); @@ -4343,10 +4339,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)  	glGetTexLevelParameteriv(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, 0, GL_TEXTURE_WIDTH, &width);  	if (width != res)  	{ -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -		glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +		cube_out->setReflection();  		for (U32 i = 0; i < 6; i++)  		{ @@ -4373,7 +4366,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)  	stop_glerror();  	glViewport(0,0,res, res); -	gGL.blendFunc(GL_ONE, GL_ONE); +	gGL.setSceneBlendType(LLRender::BT_ADD);  	cube_in->enableTexture(0);  	//3-axis blur  	for (U32 j = 0; j < 3; j++) @@ -4403,7 +4396,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)  								gl_cube_face[i],   								j < 2 ? mBlurCubeTexture[j] : cube_out->getGLName(), 0);  			validate_framebuffer_object(); -			glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); +			gGL.setColorMask(true, true);  			glClear(GL_COLOR_BUFFER_BIT);  			glLoadIdentity();  			apply_cube_face_rotation(i); @@ -4423,7 +4416,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)  	glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, 0);  	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); -	glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); +	gGL.setColorMask(true, false);  	glMatrixMode(GL_PROJECTION);  	glPopMatrix();  	glMatrixMode(GL_MODELVIEW); @@ -4431,7 +4424,7 @@ void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out)  	cube_in->disableTexture();  	gViewerWindow->setupViewport(); -	gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	LLGLState::checkStates();  	LLGLState::checkTextureChannels(); @@ -4472,7 +4465,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)  		tc2 /= (F32) res_mod;  	} -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +	gGL.setColorMask(true, true);  	LLFastTimer ftm(LLFastTimer::FTM_RENDER_BLOOM);  	gGL.color4f(1,1,1,1); @@ -4491,7 +4484,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)  	LLGLDisable test(GL_ALPHA_TEST); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +	gGL.setColorMask(true, true);  	glClearColor(0,0,0,0);  	if (for_snapshot) @@ -4503,7 +4496,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)  			//glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);  			//LLGLDisable blend(GL_BLEND);  			LLGLEnable blend(GL_BLEND); -			gGL.blendFunc(GL_ONE, GL_ONE); +			gGL.setSceneBlendType(LLRender::BT_ADD);  			tc2.setVec(1,1);				  			gGL.begin(LLVertexBuffer::TRIANGLE_STRIP);  			gGL.color4f(1,1,1,1); @@ -4521,7 +4514,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot)  			gGL.end();  			gGL.flush(); -			gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +			gGL.setSceneBlendType(LLRender::BT_ALPHA);  		}  		gGL.flush(); @@ -4553,8 +4546,8 @@ void LLPipeline::renderBloom(BOOL for_snapshot)  		gGlowExtractProgram.uniform1f("warmthAmount", warmthAmount);  		LLGLEnable blend_on(GL_BLEND);  		LLGLEnable test(GL_ALPHA_TEST); -		glAlphaFunc(GL_GREATER, 0.f); -		gGL.blendFunc(GL_SRC_ALPHA, GL_ONE); +		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +		gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);  		LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);  		glDisable(GL_TEXTURE_2D); @@ -4764,24 +4757,16 @@ void LLPipeline::renderBloom(BOOL for_snapshot)  		LLGLDisable blend(GL_BLEND);  		//tex unit 0 -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); -		glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); +		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);  		mGlow[1].bindTexture();  		glEnableClientState(GL_TEXTURE_COORD_ARRAY);  		glTexCoordPointer(2, GL_FLOAT, 0, uv0); -		glActiveTextureARB(GL_TEXTURE1_ARB); +		gGL.getTexUnit(1)->activate();  		glEnable(GL_TEXTURE_RECTANGLE_ARB);  		//tex unit 1 -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); -		glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); -		glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); -		glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); +		gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);  		glClientActiveTextureARB(GL_TEXTURE1_ARB);  		glEnableClientState(GL_TEXTURE_COORD_ARRAY); @@ -4796,14 +4781,14 @@ void LLPipeline::renderBloom(BOOL for_snapshot)  		glDisable(GL_TEXTURE_RECTANGLE_ARB);  		glDisableClientState(GL_TEXTURE_COORD_ARRAY); -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT);  		glClientActiveTextureARB(GL_TEXTURE0_ARB); -		glActiveTextureARB(GL_TEXTURE0_ARB); +		gGL.getTexUnit(0)->activate();  		glDisableClientState(GL_TEXTURE_COORD_ARRAY); -		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	} -	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +	gGL.setSceneBlendType(LLRender::BT_ALPHA);  	glMatrixMode(GL_PROJECTION);  	glPopMatrix();  	glMatrixMode(GL_MODELVIEW); @@ -4891,11 +4876,11 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		{	//generate planar reflection map  			LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);  			glClearColor(0,0,0,0); -			glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); +			gGL.setColorMask(true, true);  			mWaterRef.bindTarget();  			mWaterRef.getViewport(gGLViewport);  			mWaterRef.clear(); -			glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); +			gGL.setColorMask(true, false);  			stop_glerror(); @@ -4997,11 +4982,11 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			LLViewerImage::unbindTexture(0, GL_TEXTURE_2D);  			LLColor4& col = LLDrawPoolWater::sWaterFogColor;  			glClearColor(col.mV[0], col.mV[1], col.mV[2], 0.f); -			glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); +			gGL.setColorMask(true, true);  			mWaterDis.bindTarget();  			mWaterDis.getViewport(gGLViewport);  			mWaterDis.clear(); -			glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE); +			gGL.setColorMask(true, false);  			if (!LLPipeline::sUnderWaterRender || LLDrawPoolWater::sNeedsReflectionUpdate)  			{ @@ -5176,7 +5161,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)  	glh_set_current_modelview(mat);  	glClearColor(0.0f,0.0f,0.0f,0.0f); -	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +	gGL.setColorMask(true, true);  	glStencilMask(0xFFFFFFFF);  	glClearStencil(0); @@ -5223,14 +5208,14 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)  		if (muted)  		{ -			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); +			gGL.setColorMask(true, true);  		}  		else  		{ -			glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); +			gGL.setColorMask(false, true);  		} -		gGL.blendFunc(GL_ONE, GL_ONE); +		gGL.setSceneBlendType(LLRender::BT_ADD);  		LLImageGL::unbindTexture(0, GL_TEXTURE_2D);  		LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -5246,7 +5231,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)  		gGL.flush(); -		gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +		gGL.setSceneBlendType(LLRender::BT_ALPHA);  	}  | 
