diff options
| author | Oz Linden <oz@lindenlab.com> | 2013-01-09 15:18:20 -0500 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2013-01-09 15:18:20 -0500 | 
| commit | cdd45b9abb35b40f2a31e7433fb99e588df8b40b (patch) | |
| tree | f59f5e404f8417c8fea632592b7256c2f677b399 /indra | |
| parent | bf55755262244c7c36df781d2e093b4109f6ecbf (diff) | |
| parent | 42a33b6c6250aca7e459f95cd13b0d0600cd6262 (diff) | |
merge changes for DRTVWR-276
Diffstat (limited to 'indra')
39 files changed, 2540 insertions, 294 deletions
| diff --git a/indra/cmake/NVAPI.cmake b/indra/cmake/NVAPI.cmake new file mode 100644 index 0000000000..105f442a30 --- /dev/null +++ b/indra/cmake/NVAPI.cmake @@ -0,0 +1,16 @@ +# -*- cmake -*- +include(Prebuilt) + +set(NVAPI ON CACHE BOOL "Use NVAPI.") + +if (NVAPI) +  if (WINDOWS) +    use_prebuilt_binary(nvapi) +    set(NVAPI_LIBRARY nvapi) +  else (WINDOWS) +    set(NVAPI_LIBRARY "") +  endif (WINDOWS) +else (NVAPI) +  set(NVAPI_LIBRARY "") +endif (NVAPI) + diff --git a/indra/llcharacter/llbvhconsts.h b/indra/llcharacter/llbvhconsts.h index d363a6e595..b06c279b8f 100644 --- a/indra/llcharacter/llbvhconsts.h +++ b/indra/llcharacter/llbvhconsts.h @@ -27,7 +27,7 @@  #ifndef LL_LLBVHCONSTS_H  #define LL_LLBVHCONSTS_H -const F32 MAX_ANIM_DURATION = 30.f; +const F32 MAX_ANIM_DURATION = 60.f;  typedef enum e_constraint_type  	{ diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp index 829dda9993..e9fb91ad73 100644 --- a/indra/llcharacter/llmotioncontroller.cpp +++ b/indra/llcharacter/llmotioncontroller.cpp @@ -42,6 +42,7 @@ const U32 MAX_MOTION_INSTANCES = 32;  //-----------------------------------------------------------------------------  // Constants and statics  //----------------------------------------------------------------------------- +F32 LLMotionController::sCurrentTimeFactor = 1.f;  LLMotionRegistry LLMotionController::sRegistry;  //----------------------------------------------------------------------------- @@ -125,7 +126,7 @@ LLMotion *LLMotionRegistry::createMotion( const LLUUID &id )  // Class Constructor  //-----------------------------------------------------------------------------  LLMotionController::LLMotionController() -	: mTimeFactor(1.f), +	: mTimeFactor(sCurrentTimeFactor),  	  mCharacter(NULL),  	  mAnimTime(0.f),  	  mPrevTimerElapsed(0.f), diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h index b996f708d2..52eaf557b1 100644 --- a/indra/llcharacter/llmotioncontroller.h +++ b/indra/llcharacter/llmotioncontroller.h @@ -168,6 +168,9 @@ public:  	const LLFrameTimer& getFrameTimer() { return mTimer; } +	static F32	getCurrentTimeFactor()				{ return sCurrentTimeFactor;	}; +	static void setCurrentTimeFactor(F32 factor)	{ sCurrentTimeFactor = factor;	}; +  protected:  	// internal operations act on motion instances directly  	// as there can be duplicate motions per id during blending overlap @@ -187,7 +190,8 @@ protected:  	void deactivateStoppedMotions();  protected: -	F32					mTimeFactor; +	F32					mTimeFactor;			// 1.f for normal speed +	static F32			sCurrentTimeFactor;		// Value to use for initialization  	static LLMotionRegistry	sRegistry;  	LLPoseBlender		mPoseBlender; diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index 5831c3c1c1..227efdb07a 100644 --- a/indra/llmessage/llurlrequest.cpp +++ b/indra/llmessage/llurlrequest.cpp @@ -356,7 +356,8 @@ LLIOPipe::EStatus LLURLRequest::process_impl(  			}  		} -		while(1) +		bool keep_looping = true; +		while(keep_looping)  		{  			CURLcode result; @@ -408,8 +409,9 @@ LLIOPipe::EStatus LLURLRequest::process_impl(  				case CURLE_FAILED_INIT:  				case CURLE_COULDNT_CONNECT:  					status = STATUS_NO_CONNECTION; +					keep_looping = false;  					break; -				default: +				default:			// CURLE_URL_MALFORMAT  					llwarns << "URLRequest Error: " << result  							<< ", "  							<< LLCurl::strerror(result) @@ -417,6 +419,7 @@ LLIOPipe::EStatus LLURLRequest::process_impl(  							<< (mDetail->mURL.empty() ? "<EMPTY URL>" : mDetail->mURL)  							<< llendl;  					status = STATUS_ERROR; +					keep_looping = false;  					break;  			}  		} diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp index 5b7424acbb..93b9d36939 100644 --- a/indra/llwindow/llwindow.cpp +++ b/indra/llwindow/llwindow.cpp @@ -50,14 +50,15 @@ LLSplashScreen *gSplashScreenp = NULL;  BOOL gDebugClicks = FALSE;  BOOL gDebugWindowProc = FALSE; -const S32 gURLProtocolWhitelistCount = 3; -const std::string gURLProtocolWhitelist[] = { "file:", "http:", "https:" }; +const S32 gURLProtocolWhitelistCount = 4; +const std::string gURLProtocolWhitelist[] = { "secondlife:", "http:", "https:", "data:" };  // CP: added a handler list - this is what's used to open the protocol and is based on registry entry  //	   only meaningful difference currently is that file: protocols are opened using http:  //	   since no protocol handler exists in registry for file:  //     Important - these lists should match - protocol to handler -const std::string gURLProtocolWhitelistHandler[] = { "http", "http", "https" };	 +// Maestro: This list isn't referenced anywhere that I could find +//const std::string gURLProtocolWhitelistHandler[] = { "http", "http", "https" };	  S32 OSMessageBox(const std::string& text, const std::string& caption, U32 type) diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 4da87f4e06..e9147d552e 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -280,7 +280,7 @@ extern BOOL gDebugWindowProc;  // Protocols, like "http" and "https" we support in URLs  extern const S32 gURLProtocolWhitelistCount;  extern const std::string gURLProtocolWhitelist[]; -extern const std::string gURLProtocolWhitelistHandler[]; +//extern const std::string gURLProtocolWhitelistHandler[];  void simpleEscapeString ( std::string& stringIn  ); diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 39f8a36a6e..a15114cb9b 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -2516,6 +2516,23 @@ void exec_cmd(const std::string& cmd, const std::string& arg)  // Must begin with protocol identifier.  void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async)  { +	bool found = false; +	S32 i; +	for (i = 0; i < gURLProtocolWhitelistCount; i++) +	{ +		if (escaped_url.find(gURLProtocolWhitelist[i]) != std::string::npos) +		{ +			found = true; +			break; +		} +	} + +	if (!found) +	{ +		llwarns << "spawn_web_browser called for url with protocol not on whitelist: " << escaped_url << llendl; +		return; +	} +  	llinfos << "spawn_web_browser: " << escaped_url << llendl;  #if LL_LINUX || LL_SOLARIS diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 0197ac794f..b569808a06 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -35,6 +35,7 @@ include(LLXML)  include(LScript)  include(Linking)  include(NDOF) +include(NVAPI)  include(GooglePerfTools)  include(TemplateCheck)  include(UI) @@ -1817,6 +1818,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}      ${LLCOREHTTP_LIBRARIES}      ${LLCOMMON_LIBRARIES}      ${NDOF_LIBRARY} +    ${NVAPI_LIBRARY}      ${HUNSPELL_LIBRARY}      ${viewer_LIBRARIES}      ${BOOST_PROGRAM_OPTIONS_LIBRARY} diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 557a698d6d..2e91d10cd3 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -14070,6 +14070,18 @@          <real>1.0</real>        </array>      </map> +     +    <key>HideUIControls</key> +    <map> +      <key>Comment</key> +      <string>Hide all menu items and buttons</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>    <key>SimulateFBOFailure</key>    <map> diff --git a/indra/newview/app_settings/shaders/class1/objects/previewF.glsl b/indra/newview/app_settings/shaders/class1/objects/previewF.glsl new file mode 100644 index 0000000000..284da3d0ac --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/objects/previewF.glsl @@ -0,0 +1,41 @@ +/**  + * @file previewF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +void main() +{ +	vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color; +	frag_color = color; +} diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl index 5dcfa87066..da3387e7a5 100644 --- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl @@ -23,6 +23,9 @@   * $/LicenseInfo$   */ +float calcDirectionalLight(vec3 n, vec3 l); +float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); +  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix; @@ -32,12 +35,15 @@ ATTRIBUTE vec3 position;  ATTRIBUTE vec3 normal;  ATTRIBUTE vec2 texcoord0; +uniform vec4 color; +  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; - -vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); -void calcAtmospherics(vec3 inPositionEye); +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec3 light_attenuation[8];  +uniform vec3 light_diffuse[8];  void main()  { @@ -45,13 +51,15 @@ void main()  	vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0));  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -		 +	  	vec3 norm = normalize(normal_matrix * normal); -	calcAtmospherics(pos.xyz); - -	vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.)); -	vertex_color = color; +	vec4 col = vec4(0,0,0,1); -	 +	// Collect normal lights (need to be divided by two, as we later multiply by 2) +	col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz); +	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].z); +	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z); +		 +	vertex_color = col*color;  } diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 751b73e1eb..9025c7af8b 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -35,6 +35,7 @@  #include "llfloaterreg.h"  #include "llhudmanager.h"  #include "lljoystickbutton.h" +#include "llmoveview.h"  #include "llselectmgr.h"  #include "llsmoothstep.h"  #include "lltoolmgr.h" @@ -2113,6 +2114,11 @@ void LLAgentCamera::changeCameraToDefault()  	{  		changeCameraToThirdPerson();  	} +	if (gSavedSettings.getBOOL("HideUIControls")) +	{ +		gViewerWindow->setUIVisibility(false); +		LLPanelStandStopFlying::getInstance()->setVisible(false); +	}  } diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f203ac224b..1000c0e1e8 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1030,11 +1030,20 @@ bool LLAppViewer::init()  	}  #if LL_WINDOWS -	if (gGLManager.mIsIntel &&  -		LLFeatureManager::getInstance()->getGPUClass() > 0 && -		gGLManager.mGLVersion <= 3.f) +	if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())  	{ -		LLNotificationsUtil::add("IntelOldDriver"); +		if (gGLManager.mIsIntel) +		{ +			LLNotificationsUtil::add("IntelOldDriver"); +		} +		else if (gGLManager.mIsNVIDIA) +		{ +			LLNotificationsUtil::add("NVIDIAOldDriver"); +		} +		else if (gGLManager.mIsATI) +		{ +			LLNotificationsUtil::add("AMDOldDriver"); +		}  	}  #endif diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index b70c81e84d..8326be433e 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -46,6 +46,11 @@  #include "llviewercontrol.h"  #include "lldxhardware.h" +#include "nvapi/nvapi.h" +#include "nvapi/NvApiDriverSettings.h" + +#include <stdlib.h> +  #include "llweb.h"  #include "llsecondlifeurls.h" @@ -60,6 +65,7 @@  #include "llwindebug.h"  #endif +  // *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib  // The lib was compiled under VS2005 - in VS2003 we need to remap assert  #ifdef LL_DEBUG @@ -75,6 +81,20 @@ extern "C" {  const std::string LLAppViewerWin32::sWindowClass = "Second Life"; +/* +    This function is used to print to the command line a text message  +    describing the nvapi error and quits +*/ +void nvapi_error(NvAPI_Status status) +{ +    NvAPI_ShortString szDesc = {0}; +	NvAPI_GetErrorMessage(status, szDesc); +	llwarns << szDesc << llendl; + +	//should always trigger when asserts are enabled +	llassert(status == NVAPI_OK); +} +  // Create app mutex creates a unique global windows object.   // If the object can be created it returns true, otherwise  // it returns false. The false result can be used to determine  @@ -96,6 +116,79 @@ bool create_app_mutex()  	return result;  } +void ll_nvapi_init(NvDRSSessionHandle hSession) +{ +	// (2) load all the system settings into the session +	NvAPI_Status status = NvAPI_DRS_LoadSettings(hSession); +	if (status != NVAPI_OK)  +	{ +		nvapi_error(status); +		return; +	} + +	NvAPI_UnicodeString profile_name; +	std::string app_name = LLTrans::getString("APP_NAME"); +	llutf16string w_app_name = utf8str_to_utf16str(app_name); +	wsprintf(profile_name, L"%s", w_app_name.c_str()); +	status = NvAPI_DRS_SetCurrentGlobalProfile(hSession, profile_name); +	if (status != NVAPI_OK) +	{ +		nvapi_error(status); +		return; +	} + +	// (3) Obtain the current profile.  +	NvDRSProfileHandle hProfile = 0; +	status = NvAPI_DRS_GetCurrentGlobalProfile(hSession, &hProfile); +	if (status != NVAPI_OK)  +	{ +		nvapi_error(status); +		return; +	} + +	// load settings for querying  +	status = NvAPI_DRS_LoadSettings(hSession); +	if (status != NVAPI_OK) +	{ +		nvapi_error(status); +		return; +	} + +	//get the preferred power management mode for Second Life +	NVDRS_SETTING drsSetting = {0}; +	drsSetting.version = NVDRS_SETTING_VER; +	status = NvAPI_DRS_GetSetting(hSession, hProfile, PREFERRED_PSTATE_ID, &drsSetting); +	if (status == NVAPI_SETTING_NOT_FOUND) +	{ //only override if the user hasn't specifically set this setting +		// (4) Specify that we want the VSYNC disabled setting +		// first we fill the NVDRS_SETTING struct, then we call the function +		drsSetting.version = NVDRS_SETTING_VER; +		drsSetting.settingId = PREFERRED_PSTATE_ID; +		drsSetting.settingType = NVDRS_DWORD_TYPE; +		drsSetting.u32CurrentValue = PREFERRED_PSTATE_PREFER_MAX; +		status = NvAPI_DRS_SetSetting(hSession, hProfile, &drsSetting); +		if (status != NVAPI_OK)  +		{ +			nvapi_error(status); +			return; +		} +	} +	else if (status != NVAPI_OK) +	{ +		nvapi_error(status); +		return; +	} + +	 + +	// (5) Now we apply (or save) our changes to the system +	status = NvAPI_DRS_SaveSettings(hSession); +	if (status != NVAPI_OK)  +	{ +		nvapi_error(status); +	} +} +  //#define DEBUGGING_SEH_FILTER 1  #if DEBUGGING_SEH_FILTER  #	define WINMAIN DebuggingWinMain @@ -165,6 +258,27 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,  		return -1;  	} +	NvAPI_Status status; +     +	// Initialize NVAPI +	status = NvAPI_Initialize(); +	NvDRSSessionHandle hSession = 0; + +    if (status == NVAPI_OK)  +	{ +		// Create the session handle to access driver settings +		status = NvAPI_DRS_CreateSession(&hSession); +		if (status != NVAPI_OK)  +		{ +			nvapi_error(status); +		} +		else +		{ +			//override driver setting as needed +			ll_nvapi_init(hSession); +		} +	} +  	// Have to wait until after logging is initialized to display LFH info  	if (num_heaps > 0)  	{ @@ -232,6 +346,15 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,  		LLAppViewer::sUpdaterInfo = NULL ;  	} + + +	// (NVAPI) (6) We clean up. This is analogous to doing a free() +	if (hSession) +	{ +		NvAPI_DRS_DestroySession(hSession); +		hSession = 0; +	} +	  	return 0;  } diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 7cfb58e544..b7270e696e 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -547,6 +547,10 @@ F32 LLDrawable::updateXform(BOOL undamped)  			}  		}  	} +	else +	{ +		dist_squared = dist_vec_squared(old_pos, target_pos); +	}  	LLVector3 vec = mCurrentScale-target_scale; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 2b39b771e7..a4cadcd5dc 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -479,6 +479,7 @@ void LLFeatureManager::parseGPUTable(std::string filename)  			mGPUString = label;  			mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);  			mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10); +			sscanf(expected_gl_version.c_str(), "%f", &mExpectedGLVersion);  		}  	}  #if LL_EXPORT_GPU_TABLE diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index 6f9d2e49c6..ad72c16743 100644 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -103,7 +103,8 @@ public:  		mTableVersion(0),  		mSafe(FALSE),  		mGPUClass(GPU_CLASS_UNKNOWN), -		mGPUSupported(FALSE) +		mExpectedGLVersion(0.f), +		mGPUSupported(FALSE)		  	{  	}  	~LLFeatureManager() {cleanupFeatureTables();} @@ -118,6 +119,7 @@ public:  	EGPUClass getGPUClass() 			{ return mGPUClass; }  	std::string& getGPUString() 		{ return mGPUString; }  	BOOL isGPUSupported()				{ return mGPUSupported; } +	F32 getExpectedGLVersion()			{ return mExpectedGLVersion; }  	void cleanupFeatureTables(); @@ -157,6 +159,7 @@ protected:  	S32			mTableVersion;  	BOOL		mSafe;					// Reinitialize everything to the "safe" mask  	EGPUClass	mGPUClass; +	F32			mExpectedGLVersion;		//expected GL version according to gpu table  	std::string	mGPUString;  	BOOL		mGPUSupported;  }; diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index bca4b5e447..fffd724b22 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -80,6 +80,7 @@ BOOL LLFloaterBuyContents::postBuild()  LLFloaterBuyContents::~LLFloaterBuyContents()  { +	removeVOInventoryListener();  } @@ -147,23 +148,26 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		return;  	} -	if (!inv) +	LLScrollListCtrl* item_list = getChild<LLScrollListCtrl>("item_list"); +	if (!item_list)  	{ -		llwarns << "No inventory in LLFloaterBuyContents::inventoryChanged" -			<< llendl;  		removeVOInventoryListener();  		return;  	} -	LLCtrlListInterface *item_list = childGetListInterface("item_list"); -	if (!item_list) +	item_list->deleteAllItems(); +	 +	if (!inv)  	{ -		removeVOInventoryListener(); +		llwarns << "No inventory in LLFloaterBuyContents::inventoryChanged" +			<< llendl; +  		return;  	}  	// default to turning off the buy button. -	getChildView("buy_btn")->setEnabled(FALSE); +	LLView* buy_btn = getChildView("buy_btn"); +	buy_btn->setEnabled(FALSE);  	LLUUID owner_id;  	BOOL is_group_owned; @@ -204,7 +208,7 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		// There will be at least one item shown in the display, so go  		// ahead and enable the buy button. -		getChildView("buy_btn")->setEnabled(TRUE); +		buy_btn->setEnabled(TRUE);  		// Create the line in the list  		LLSD row; @@ -255,8 +259,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,  		getChildView("wear_check")->setEnabled(TRUE);  		getChild<LLUICtrl>("wear_check")->setValue(LLSD(false) );  	} -	 -	removeVOInventoryListener();  } diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 6b2492d927..2575f6f817 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -901,11 +901,13 @@ BOOL LLImagePreviewSculpted::render()  	{  		gObjectPreviewProgram.bind();  	} +	gPipeline.enableLightsPreview(); +  	gGL.pushMatrix();  	const F32 SCALE = 1.25f;  	gGL.scalef(SCALE, SCALE, SCALE);  	const F32 BRIGHTNESS = 0.9f; -	gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS); +	gGL.diffuseColor3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);  	mVertexBuffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0);  	mVertexBuffer->draw(LLRender::TRIANGLES, num_indices, 0); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 449173f9b4..ea839e6f5a 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -3884,15 +3884,30 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  	U32 triangle_count = 0; -	for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) +	U32 instanced_triangle_count = 0; + +	//get the triangle count for the whole scene +	for (LLModelLoader::scene::iterator iter = mBaseScene.begin(), endIter = mBaseScene.end(); iter != endIter; ++iter)  	{ -		LLModel* mdl = *iter; -		for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i) +		for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)  		{ -			triangle_count += mdl->getVolumeFace(i).mNumIndices/3; +			LLModel* mdl = instance->mModel; +			if (mdl) +			{ +				instanced_triangle_count += mdl->getNumTriangles(); +			}  		}  	} +	//get the triangle count for the non-instanced set of models +	for (U32 i = 0; i < mBaseModel.size(); ++i) +	{ +		triangle_count += mBaseModel[i]->getNumTriangles(); +	} +	 +	//get ratio of uninstanced triangles to instanced triangles +	F32 triangle_ratio = (F32) triangle_count / (F32) instanced_triangle_count; +  	U32 base_triangle_count = triangle_count;  	U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; @@ -3926,6 +3941,8 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  		if (which_lod > -1 && which_lod < NUM_LOD)  		{  			limit = mFMP->childGetValue("lod_triangle_limit_" + lod_name[which_lod]).asInteger(); +			//convert from "scene wide" to "non-instanced" triangle limit +			limit = (S32) ( (F32) limit*triangle_ratio );  		}  	}  	else @@ -4031,7 +4048,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim  		U32 actual_verts = 0;  		U32 submeshes = 0; -		mRequestedTriangleCount[lod] = triangle_count; +		mRequestedTriangleCount[lod] = (S32) ( (F32) triangle_count / triangle_ratio );  		mRequestedErrorThreshold[lod] = lod_error_threshold;  		glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode); @@ -4213,28 +4230,36 @@ void LLModelPreview::updateStatusMessages()  		//initialize total for this lod to 0  		total_tris[lod] = total_verts[lod] = total_submeshes[lod] = 0; -		for (U32 i = 0; i < mModel[lod].size(); ++i) -		{ //for each model in the lod -			S32 cur_tris = 0; -			S32 cur_verts = 0; -			S32 cur_submeshes = mModel[lod][i]->getNumVolumeFaces(); - -			for (S32 j = 0; j < cur_submeshes; ++j) -			{ //for each submesh (face), add triangles and vertices to current total -				const LLVolumeFace& face = mModel[lod][i]->getVolumeFace(j); -				cur_tris += face.mNumIndices/3; -				cur_verts += face.mNumVertices; -			} +		for (LLModelLoader::scene::iterator iter = mScene[lod].begin(), endIter = mScene[lod].end(); iter != endIter; ++iter) +		{ +			for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance) +			{ +				LLModel* model = instance->mModel; +				if (model) +				{ +					 //for each model in the lod +					S32 cur_tris = 0; +					S32 cur_verts = 0; +					S32 cur_submeshes = model->getNumVolumeFaces(); + +					for (S32 j = 0; j < cur_submeshes; ++j) +					{ //for each submesh (face), add triangles and vertices to current total +						const LLVolumeFace& face = model->getVolumeFace(j); +						cur_tris += face.mNumIndices/3; +						cur_verts += face.mNumVertices; +					} -			//add this model to the lod total -			total_tris[lod] += cur_tris; -			total_verts[lod] += cur_verts; -			total_submeshes[lod] += cur_submeshes; +					//add this model to the lod total +					total_tris[lod] += cur_tris; +					total_verts[lod] += cur_verts; +					total_submeshes[lod] += cur_submeshes; -			//store this model's counts to asset data -			tris[lod].push_back(cur_tris); -			verts[lod].push_back(cur_verts); -			submeshes[lod].push_back(cur_submeshes); +					//store this model's counts to asset data +					tris[lod].push_back(cur_tris); +					verts[lod].push_back(cur_verts); +					submeshes[lod].push_back(cur_submeshes); +				} +			}  		}  	} @@ -4411,34 +4436,38 @@ void LLModelPreview::updateStatusMessages()  	}  	//add up physics triangles etc -	S32 start = 0; -	S32 end = mModel[LLModel::LOD_PHYSICS].size(); -  	S32 phys_tris = 0;  	S32 phys_hulls = 0;  	S32 phys_points = 0; -	for (S32 i = start; i < end; ++i) -	{ //add up hulls and points and triangles for selected mesh(es) -		LLModel* model = mModel[LLModel::LOD_PHYSICS][i]; -		S32 cur_submeshes = model->getNumVolumeFaces(); - -		LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull; - -		if (!decomp.empty()) +	//get the triangle count for the whole scene +	for (LLModelLoader::scene::iterator iter = mScene[LLModel::LOD_PHYSICS].begin(), endIter = mScene[LLModel::LOD_PHYSICS].end(); iter != endIter; ++iter) +	{ +		for (LLModelLoader::model_instance_list::iterator instance = iter->second.begin(), end_instance = iter->second.end(); instance != end_instance; ++instance)  		{ -			phys_hulls += decomp.size(); -			for (U32 i = 0; i < decomp.size(); ++i) +			LLModel* model = instance->mModel; +			if (model)  			{ -				phys_points += decomp[i].size(); -			} -		} -		else -		{ //choose physics shape OR decomposition, can't use both -			for (S32 j = 0; j < cur_submeshes; ++j) -			{ //for each submesh (face), add triangles and vertices to current total -				const LLVolumeFace& face = model->getVolumeFace(j); -				phys_tris += face.mNumIndices/3; +				S32 cur_submeshes = model->getNumVolumeFaces(); + +				LLModel::convex_hull_decomposition& decomp = model->mPhysics.mHull; + +				if (!decomp.empty()) +				{ +					phys_hulls += decomp.size(); +					for (U32 i = 0; i < decomp.size(); ++i) +					{ +						phys_points += decomp[i].size(); +					} +				} +				else +				{ //choose physics shape OR decomposition, can't use both +					for (S32 j = 0; j < cur_submeshes; ++j) +					{ //for each submesh (face), add triangles and vertices to current total +						const LLVolumeFace& face = model->getVolumeFace(j); +						phys_tris += face.mNumIndices/3; +					} +				}  			}  		}  	} @@ -5087,6 +5116,11 @@ BOOL LLModelPreview::render()  		refresh();  	} +	if (use_shaders) +	{ +		gObjectPreviewProgram.bind(); +	} +  	gGL.loadIdentity();  	gPipeline.enableLightsPreview(); @@ -5112,11 +5146,6 @@ BOOL LLModelPreview::render()  	const U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; -	if (use_shaders) -	{ -		gObjectPreviewProgram.bind(); -	} -  	LLGLEnable normalize(GL_NORMALIZE);  	if (!mBaseModel.empty() && mVertexBuffer[5].empty()) @@ -5305,7 +5334,7 @@ BOOL LLModelPreview::render()  											hull_colors.push_back(LLColor4U(rand()%128+127, rand()%128+127, rand()%128+127, 128));  										} -										glColor4ubv(hull_colors[i].mV); +										gGL.diffuseColor4ubv(hull_colors[i].mV);  										LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions, physics.mMesh[i].mNormals);  										if (explode > 0.f) diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 48484786f6..1eb7f4469a 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1055,6 +1055,17 @@ void commit_grid_mode(LLUICtrl *ctrl)  	LLSelectMgr::getInstance()->setGridMode((EGridMode)combo->getCurrentIndex());  } +// static +void LLFloaterTools::setGridMode(S32 mode) +{ +	LLFloaterTools* tools_floater = LLFloaterReg::getTypedInstance<LLFloaterTools>("build"); +	if (!tools_floater || !tools_floater->mComboGridMode) +	{ +		return; +	} + +	tools_floater->mComboGridMode->setCurrentByIndex(mode); +}  void LLFloaterTools::onClickGridOptions()  { diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h index 7a19d093a4..ecb0092a6f 100644 --- a/indra/newview/llfloatertools.h +++ b/indra/newview/llfloatertools.h @@ -107,6 +107,8 @@ public:  	bool selectedMediaEditable();  	void updateLandImpacts(); +	static void setGridMode(S32 mode); +  private:  	void refresh();  	void refreshMedia(); diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 151cd2a1cd..e85d849c9a 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -219,7 +219,8 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )  	}  	// Discover the MIME type only for "http" scheme. -	if(scheme == "http" || scheme == "https") +	if(!media_url.empty() &&  +	   (scheme == "http" || scheme == "https"))  	{  		LLHTTPClient::getHeaderOnly( media_url,  			new LLMediaTypeResponder(self->getHandle())); diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index 6e0f360cbc..9ec5d7c20c 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -72,7 +72,6 @@ void LLManip::rebuild(LLViewerObject* vobj)  	LLDrawable* drawablep = vobj->mDrawable;  	if (drawablep && drawablep->getVOVolume())  	{ -		  		gPipeline.markRebuild(drawablep,LLDrawable::REBUILD_VOLUME, TRUE);  		drawablep->setState(LLDrawable::MOVE_UNDAMPED); // force to UNDAMPED  		drawablep->updateMove(); @@ -82,6 +81,14 @@ void LLManip::rebuild(LLViewerObject* vobj)  			group->dirtyGeom();  			gPipeline.markRebuild(group, TRUE);  		} + +		LLViewerObject::const_child_list_t& child_list = vobj->getChildren(); +		for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(), endIter = child_list.end(); +			 iter != endIter; ++iter) +		{ +			LLViewerObject* child = *iter; +			rebuild(child); +		}  	}  } diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 92ac435f08..09003e3e53 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -204,16 +204,28 @@ class LLMeshHeaderResponder : public LLCurl::Responder  {  public:  	LLVolumeParams mMeshParams; -	 +	bool mProcessed; +  	LLMeshHeaderResponder(const LLVolumeParams& mesh_params)  		: mMeshParams(mesh_params)  	{ -		LLMeshRepoThread::sActiveHeaderRequests++; +		LLMeshRepoThread::incActiveHeaderRequests(); +		mProcessed = false;  	}  	~LLMeshHeaderResponder()  	{ -		LLMeshRepoThread::sActiveHeaderRequests--; +		if (!mProcessed && !LLApp::isQuitting()) +		{ //something went wrong, retry +			llwarns << "Timeout or service unavailable, retrying." << llendl; +			LLMeshRepository::sHTTPRetryCount++; +			LLMeshRepoThread::HeaderRequest req(mMeshParams); +			LLMutexLock lock(gMeshRepo.mThread->mMutex); +			gMeshRepo.mThread->mHeaderReqQ.push(req); + +		} + +		LLMeshRepoThread::decActiveHeaderRequests();  	}  	virtual void completedRaw(U32 status, const std::string& reason, @@ -229,16 +241,24 @@ public:  	S32 mLOD;  	U32 mRequestedBytes;  	U32 mOffset; +	bool mProcessed;  	LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)  		: mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)  	{ -		LLMeshRepoThread::sActiveLODRequests++; +		LLMeshRepoThread::incActiveLODRequests(); +		mProcessed = false;  	}  	~LLMeshLODResponder()  	{ -		LLMeshRepoThread::sActiveLODRequests--; +		if (!mProcessed && !LLApp::isQuitting()) +		{ +			llwarns << "Killed without being processed, retrying." << llendl; +			LLMeshRepository::sHTTPRetryCount++; +			gMeshRepo.mThread->lockAndLoadMeshLOD(mMeshParams, mLOD); +		} +		LLMeshRepoThread::decActiveLODRequests();  	}  	virtual void completedRaw(U32 status, const std::string& reason, @@ -253,10 +273,17 @@ public:  	LLUUID mMeshID;  	U32 mRequestedBytes;  	U32 mOffset; +	bool mProcessed;  	LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)  		: mMeshID(id), mRequestedBytes(size), mOffset(offset)  	{ +		mProcessed = false; +	} + +	~LLMeshSkinInfoResponder() +	{ +		llassert(mProcessed);  	}  	virtual void completedRaw(U32 status, const std::string& reason, @@ -271,10 +298,17 @@ public:  	LLUUID mMeshID;  	U32 mRequestedBytes;  	U32 mOffset; +	bool mProcessed;  	LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)  		: mMeshID(id), mRequestedBytes(size), mOffset(offset)  	{ +		mProcessed = false; +	} + +	~LLMeshDecompositionResponder() +	{ +		llassert(mProcessed);  	}  	virtual void completedRaw(U32 status, const std::string& reason, @@ -289,10 +323,17 @@ public:  	LLUUID mMeshID;  	U32 mRequestedBytes;  	U32 mOffset; +	bool mProcessed;  	LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)  		: mMeshID(id), mRequestedBytes(size), mOffset(offset)  	{ +		mProcessed = false; +	} + +	~LLMeshPhysicsShapeResponder() +	{ +		llassert(mProcessed);  	}  	virtual void completedRaw(U32 status, const std::string& reason, @@ -638,16 +679,24 @@ void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)  	mPhysicsShapeRequests.insert(mesh_id);  } +void LLMeshRepoThread::lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod) +{ +	if (!LLAppViewer::isQuitting()) +	{ +		loadMeshLOD(mesh_params, lod); +	} +} -void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod) -{ //protected by mSignal, no locking needed here + +void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod) +{ //could be called from any thread +	LLMutexLock lock(mMutex);  	mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());  	if (iter != mMeshHeader.end())  	{ //if we have the header, request LOD byte range  		LODRequest req(mesh_params, lod);  		{ -			LLMutexLock lock(mMutex);  			mLODReqQ.push(req);  			LLMeshRepository::sLODProcessing++;  		} @@ -665,7 +714,6 @@ void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)  		}  		else  		{ //if no header request is pending, fetch header -			LLMutexLock lock(mMutex);  			mHeaderReqQ.push(req);  			mPendingLOD[mesh_params].push_back(lod);  		} @@ -945,6 +993,34 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)  	return ret;  } +//static +void LLMeshRepoThread::incActiveLODRequests() +{ +	LLMutexLock lock(gMeshRepo.mThread->mMutex); +	++LLMeshRepoThread::sActiveLODRequests; +} + +//static +void LLMeshRepoThread::decActiveLODRequests() +{ +	LLMutexLock lock(gMeshRepo.mThread->mMutex); +	--LLMeshRepoThread::sActiveLODRequests; +} + +//static +void LLMeshRepoThread::incActiveHeaderRequests() +{ +	LLMutexLock lock(gMeshRepo.mThread->mMutex); +	++LLMeshRepoThread::sActiveHeaderRequests; +} + +//static +void LLMeshRepoThread::decActiveHeaderRequests() +{ +	LLMutexLock lock(gMeshRepo.mThread->mMutex); +	--LLMeshRepoThread::sActiveHeaderRequests; +} +  //return false if failed to get header  bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count)  { @@ -1821,6 +1897,8 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,  							  const LLChannelDescriptors& channels,  							  const LLIOPipe::buffer_ptr_t& buffer)  { +	mProcessed = true; +	  	// thread could have already be destroyed during logout  	if( !gMeshRepo.mThread )  	{ @@ -1838,11 +1916,13 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,  	{  		if (status == 499 || status == 503)  		{ //timeout or service unavailable, try again +			llwarns << "Timeout or service unavailable, retrying." << llendl;  			LLMeshRepository::sHTTPRetryCount++;  			gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);  		}  		else  		{ +			llassert(status == 499 || status == 503); //intentionally trigger a breakpoint  			llwarns << "Unhandled status " << status << llendl;  		}  		return; @@ -1881,6 +1961,8 @@ void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason  							  const LLChannelDescriptors& channels,  							  const LLIOPipe::buffer_ptr_t& buffer)  { +	mProcessed = true; +  	// thread could have already be destroyed during logout  	if( !gMeshRepo.mThread )  	{ @@ -1898,11 +1980,13 @@ void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason  	{  		if (status == 499 || status == 503)  		{ //timeout or service unavailable, try again +			llwarns << "Timeout or service unavailable, retrying." << llendl;  			LLMeshRepository::sHTTPRetryCount++;  			gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);  		}  		else  		{ +			llassert(status == 499 || status == 503); //intentionally trigger a breakpoint  			llwarns << "Unhandled status " << status << llendl;  		}  		return; @@ -1941,6 +2025,8 @@ void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& r  							  const LLChannelDescriptors& channels,  							  const LLIOPipe::buffer_ptr_t& buffer)  { +	mProcessed = true; +	  	if( !gMeshRepo.mThread )  	{  		return; @@ -1957,11 +2043,13 @@ void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& r  	{  		if (status == 499 || status == 503)  		{ //timeout or service unavailable, try again +			llwarns << "Timeout or service unavailable, retrying." << llendl;  			LLMeshRepository::sHTTPRetryCount++;  			gMeshRepo.mThread->loadMeshDecomposition(mMeshID);  		}  		else  		{ +			llassert(status == 499 || status == 503); //intentionally trigger a breakpoint  			llwarns << "Unhandled status " << status << llendl;  		}  		return; @@ -2000,6 +2088,8 @@ void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& re  							  const LLChannelDescriptors& channels,  							  const LLIOPipe::buffer_ptr_t& buffer)  { +	mProcessed = true; +  	// thread could have already be destroyed during logout  	if( !gMeshRepo.mThread )  	{ @@ -2017,11 +2107,13 @@ void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& re  	{  		if (status == 499 || status == 503)  		{ //timeout or service unavailable, try again +			llwarns << "Timeout or service unavailable, retrying." << llendl;  			LLMeshRepository::sHTTPRetryCount++;  			gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);  		}  		else  		{ +			llassert(status == 499 || status == 503); //intentionally trigger a breakpoint  			llwarns << "Unhandled status " << status << llendl;  		}  		return; @@ -2060,6 +2152,8 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,  							  const LLChannelDescriptors& channels,  							  const LLIOPipe::buffer_ptr_t& buffer)  { +	mProcessed = true; +  	// thread could have already be destroyed during logout  	if( !gMeshRepo.mThread )  	{ @@ -2078,8 +2172,12 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,  		// TODO*: Add maximum retry logic, exponential backoff  		// and (somewhat more optional than the others) retries  		// again after some set period of time + +		llassert(status == 503 || status == 499); +  		if (status == 503 || status == 499)  		{ //retry +			llwarns << "Timeout or service unavailable, retrying." << llendl;  			LLMeshRepository::sHTTPRetryCount++;  			LLMeshRepoThread::HeaderRequest req(mMeshParams);  			LLMutexLock lock(gMeshRepo.mThread->mMutex); @@ -2087,6 +2185,10 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,  			return;  		} +		else +		{ +			llwarns << "Unhandled status." << llendl; +		}  	}  	S32 data_size = buffer->countAfter(channels.in(), NULL); @@ -2101,7 +2203,11 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,  	LLMeshRepository::sBytesReceived += llmin(data_size, 4096); -	if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size)) +	bool success = gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size); +	 +	llassert(success); + +	if (!success)  	{  		llwarns  			<< "Unable to parse mesh header: " diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 6e301c26a2..8602271f84 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -322,7 +322,9 @@ public:  	virtual void run(); +	void lockAndLoadMeshLOD(const LLVolumeParams& mesh_params, S32 lod);  	void loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod); +  	bool fetchMeshHeader(const LLVolumeParams& mesh_params, U32& count);  	bool fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod, U32& count);  	bool headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size); @@ -351,6 +353,10 @@ public:  	//  (should hold onto mesh_id and try again later if header info does not exist)  	bool fetchMeshPhysicsShape(const LLUUID& mesh_id); +	static void incActiveLODRequests(); +	static void decActiveLODRequests(); +	static void incActiveHeaderRequests(); +	static void decActiveHeaderRequests();  }; @@ -407,7 +413,7 @@ public:  	void startRequest() { ++mPendingUploads; }  	void stopRequest() { --mPendingUploads; } - +		  	bool finished() { return mFinished; }  	virtual void run();  	void preStart(); diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index 51ab7649a4..e641370d2e 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -425,7 +425,7 @@ void LLPanelPermissions::refresh()  		}  	} -	getChildView("button set group")->setEnabled(owners_identical && (mOwnerID == gAgent.getID()) && is_nonpermanent_enforced); +	getChildView("button set group")->setEnabled(root_selected && owners_identical && (mOwnerID == gAgent.getID()) && is_nonpermanent_enforced);  	getChildView("Name:")->setEnabled(TRUE);  	LLLineEditor* LineEditorObjectName = getChild<LLLineEditor>("Object Name"); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 13845c3b38..343316d30a 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -211,7 +211,6 @@ LLSelectMgr::LLSelectMgr()  	mGridMode = GRID_MODE_WORLD;  	gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD); -	mGridValid = FALSE;  	mSelectedObjects = new LLObjectSelection();  	mHoverObjects = new LLObjectSelection(); @@ -1170,7 +1169,6 @@ void LLSelectMgr::setGridMode(EGridMode mode)  	mGridMode = mode;  	gSavedSettings.setS32("GridMode", mode);  	updateSelectionCenter(); -	mGridValid = FALSE;  }  void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale) @@ -1271,7 +1269,6 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &  	origin = mGridOrigin;  	rotation = mGridRotation;  	scale = mGridScale; -	mGridValid = TRUE;  }  //----------------------------------------------------------------------------- @@ -2941,116 +2938,148 @@ BOOL LLSelectMgr::selectGetRootsCopy()  	return TRUE;  } -//----------------------------------------------------------------------------- -// selectGetCreator() -// Creator information only applies to root objects. -//----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name) +struct LLSelectGetFirstTest  { -	BOOL identical = TRUE; -	BOOL first = TRUE; -	LLUUID first_id; -	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); -		 iter != getSelection()->root_object_end(); iter++ ) +	LLSelectGetFirstTest() : mIdentical(true), mFirst(true)	{ } +	virtual ~LLSelectGetFirstTest() { } + +	// returns false to break out of the iteration. +	bool checkMatchingNode(LLSelectNode* node)  	{ -		LLSelectNode* node = *iter;	 -		if (!node->mValid) +		if (!node || !node->mValid)  		{ -			return FALSE; +			return false;  		} -		if (first) +		if (mFirst)  		{ -			first_id = node->mPermissions->getCreator(); -			first = FALSE; +			mFirstValue = getValueFromNode(node); +			mFirst = false;  		}  		else  		{ -			if ( !(first_id == node->mPermissions->getCreator() ) ) +			if ( mFirstValue != getValueFromNode(node) ) +			{ +				mIdentical = false; +				// stop testing once we know not all selected are identical. +				return false; +			} +		} +		// continue testing. +		return true; +	} + +	bool mIdentical; +	LLUUID mFirstValue; + +protected: +	virtual const LLUUID& getValueFromNode(LLSelectNode* node) = 0; + +private: +	bool mFirst; +}; + +void LLSelectMgr::getFirst(LLSelectGetFirstTest* test) +{ +	if (gSavedSettings.getBOOL("EditLinkedParts")) +	{ +		for (LLObjectSelection::valid_iterator iter = getSelection()->valid_begin(); +			iter != getSelection()->valid_end(); ++iter ) +		{ +			if (!test->checkMatchingNode(*iter))  			{ -				identical = FALSE;  				break;  			}  		}  	} -	if (first_id.isNull()) +	else +	{ +		for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); +			iter != getSelection()->root_object_end(); ++iter ) +		{ +			if (!test->checkMatchingNode(*iter)) +			{ +				break; +			} +		} +	} +} + +//----------------------------------------------------------------------------- +// selectGetCreator() +// Creator information only applies to roots unless editing linked parts. +//----------------------------------------------------------------------------- +struct LLSelectGetFirstCreator : public LLSelectGetFirstTest +{ +protected: +	virtual const LLUUID& getValueFromNode(LLSelectNode* node) +	{ +		return node->mPermissions->getCreator(); +	} +}; + +BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name) +{ +	LLSelectGetFirstCreator test; +	getFirst(&test); + +	if (test.mFirstValue.isNull())  	{  		name = LLTrans::getString("AvatarNameNobody");  		return FALSE;  	} -	result_id = first_id; +	result_id = test.mFirstValue; -	if (identical) +	if (test.mIdentical)  	{ -		name = LLSLURL("agent", first_id, "inspect").getSLURLString(); +		name = LLSLURL("agent", test.mFirstValue, "inspect").getSLURLString();  	}  	else  	{  		name = LLTrans::getString("AvatarNameMultiple");  	} -	return identical; +	return test.mIdentical;  } -  //-----------------------------------------------------------------------------  // selectGetOwner() -// Owner information only applies to roots. +// Owner information only applies to roots unless editing linked parts.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name) +struct LLSelectGetFirstOwner : public LLSelectGetFirstTest  { -	BOOL identical = TRUE; -	BOOL first = TRUE; -	BOOL first_group_owned = FALSE; -	LLUUID first_id; -	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); -		 iter != getSelection()->root_object_end(); iter++ ) +protected: +	virtual const LLUUID& getValueFromNode(LLSelectNode* node)  	{ -		LLSelectNode* node = *iter;	 -		if (!node->mValid) -		{ -			return FALSE; -		} -		 -		if (first) -		{ -			node->mPermissions->getOwnership(first_id, first_group_owned); -			first = FALSE; -		} -		else -		{ -			LLUUID owner_id; -			BOOL is_group_owned = FALSE; -			if (!(node->mPermissions->getOwnership(owner_id, is_group_owned)) -				|| owner_id != first_id || is_group_owned != first_group_owned) -			{ -				identical = FALSE; -				break; -			} -		} +		// Don't use 'getOwnership' since we return a reference, not a copy. +		// Will return LLUUID::null if unowned (which is not allowed and should never happen.) +		return node->mPermissions->isGroupOwned() ? node->mPermissions->getGroup() : node->mPermissions->getOwner();  	} -	if (first_id.isNull()) +}; + +BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name) +{ +	LLSelectGetFirstOwner test; +	getFirst(&test); + +	if (test.mFirstValue.isNull())  	{  		return FALSE;  	} -	result_id = first_id; +	result_id = test.mFirstValue; -	if (identical) +	if (test.mIdentical)  	{ -		BOOL public_owner = (first_id.isNull() && !first_group_owned); -		if (first_group_owned) +		bool group_owned = selectIsGroupOwned(); +		if (group_owned)  		{ -			name = LLSLURL("group", first_id, "inspect").getSLURLString(); -		} -		else if(!public_owner) -		{ -			name = LLSLURL("agent", first_id, "inspect").getSLURLString(); +			name = LLSLURL("group", test.mFirstValue, "inspect").getSLURLString();  		}  		else  		{ -			name = LLTrans::getString("AvatarNameNobody"); +			name = LLSLURL("agent", test.mFirstValue, "inspect").getSLURLString();  		}  	}  	else @@ -3058,131 +3087,92 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name)  		name = LLTrans::getString("AvatarNameMultiple");  	} -	return identical; +	return test.mIdentical;  } -  //-----------------------------------------------------------------------------  // selectGetLastOwner() -// Owner information only applies to roots. +// Owner information only applies to roots unless editing linked parts.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name) +struct LLSelectGetFirstLastOwner : public LLSelectGetFirstTest  { -	BOOL identical = TRUE; -	BOOL first = TRUE; -	LLUUID first_id; -	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); -		 iter != getSelection()->root_object_end(); iter++ ) +protected: +	virtual const LLUUID& getValueFromNode(LLSelectNode* node)  	{ -		LLSelectNode* node = *iter;	 -		if (!node->mValid) -		{ -			return FALSE; -		} - -		if (first) -		{ -			first_id = node->mPermissions->getLastOwner(); -			first = FALSE; -		} -		else -		{ -			if ( !(first_id == node->mPermissions->getLastOwner() ) ) -			{ -				identical = FALSE; -				break; -			} -		} +		return node->mPermissions->getLastOwner();  	} -	if (first_id.isNull()) +}; + +BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name) +{ +	LLSelectGetFirstLastOwner test; +	getFirst(&test); + +	if (test.mFirstValue.isNull())  	{  		return FALSE;  	} -	result_id = first_id; +	result_id = test.mFirstValue; -	if (identical) +	if (test.mIdentical)  	{ -		BOOL public_owner = (first_id.isNull()); -		if(!public_owner) -		{ -			name = LLSLURL("agent", first_id, "inspect").getSLURLString(); -		} -		else -		{ -			name.assign("Public or Group"); -		} +		name = LLSLURL("agent", test.mFirstValue, "inspect").getSLURLString();  	}  	else  	{  		name.assign( "" );  	} -	return identical; +	return test.mIdentical;  } -  //-----------------------------------------------------------------------------  // selectGetGroup() -// Group information only applies to roots. +// Group information only applies to roots unless editing linked parts.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id) +struct LLSelectGetFirstGroup : public LLSelectGetFirstTest  { -	BOOL identical = TRUE; -	BOOL first = TRUE; -	LLUUID first_id; -	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); -		 iter != getSelection()->root_object_end(); iter++ ) +protected: +	virtual const LLUUID& getValueFromNode(LLSelectNode* node)  	{ -		LLSelectNode* node = *iter;	 -		if (!node->mValid) -		{ -			return FALSE; -		} - -		if (first) -		{ -			first_id = node->mPermissions->getGroup(); -			first = FALSE; -		} -		else -		{ -			if ( !(first_id == node->mPermissions->getGroup() ) ) -			{ -				identical = FALSE; -				break; -			} -		} +		return node->mPermissions->getGroup();  	} +}; -	result_id = first_id; +BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id) +{ +	LLSelectGetFirstGroup test; +	getFirst(&test); -	return identical; +	result_id = test.mFirstValue; +	return test.mIdentical;  }  //-----------------------------------------------------------------------------  // selectIsGroupOwned() -// Only operates on root nodes.   -// Returns TRUE if all have valid data and they are all group owned. +// Only operates on root nodes unless editing linked parts.   +// Returns TRUE if the first selected is group owned.  //----------------------------------------------------------------------------- -BOOL LLSelectMgr::selectIsGroupOwned() +struct LLSelectGetFirstGroupOwner : public LLSelectGetFirstTest  { -	BOOL found_one = FALSE; -	for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin(); -		 iter != getSelection()->root_object_end(); iter++ ) +protected: +	virtual const LLUUID& getValueFromNode(LLSelectNode* node)  	{ -		LLSelectNode* node = *iter;	 -		if (!node->mValid) +		if (node->mPermissions->isGroupOwned())  		{ -			return FALSE; -		} -		found_one = TRUE; -		if (!node->mPermissions->isGroupOwned()) -		{ -			return FALSE; +			return node->mPermissions->getGroup();  		} -	}	 -	return found_one ? TRUE : FALSE; +		return LLUUID::null; +	} +}; + +BOOL LLSelectMgr::selectIsGroupOwned() +{ +	LLSelectGetFirstGroupOwner test; +	getFirst(&test); + +	return test.mFirstValue.notNull() ? TRUE : FALSE;  }  //----------------------------------------------------------------------------- @@ -4987,7 +4977,11 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data  		} func(id);  		LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func); -		if (node) +		if (!node) +		{ +			llwarns << "Couldn't find object " << id << " selected." << llendl; +		} +		else  		{  			if (node->mInventorySerial != inv_serial)  			{ diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index ecbb20df1b..cc78e35869 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -343,6 +343,9 @@ typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;  extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();  #endif +// For use with getFirstTest() +struct LLSelectGetFirstTest; +  class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>  {  public: @@ -745,6 +748,9 @@ private:  	static void packGodlikeHead(void* user_data);  	static bool confirmDelete(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle); +	// Get the first ID that matches test and whether or not all ids are identical in selected objects. +	void getFirst(LLSelectGetFirstTest* test); +  public:  	// Observer/callback support for when object selection changes or  	// properties are received/updated @@ -763,8 +769,6 @@ private:  	LLVector3				mGridOrigin;  	LLVector3				mGridScale;  	EGridMode				mGridMode; -	BOOL					mGridValid; -  	BOOL					mTEMode;			// render te  	LLVector3d				mSelectionCenterGlobal; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 47a2b5f4c8..41bfbae86e 100755 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -3212,6 +3212,7 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8  	worker->lockWorkMutex(); +  	//	Copy header data into image object  	worker->mImageCodec = codec;  	worker->mTotalPackets = packets; diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index 29528dabc9..1e58ba35d4 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -39,6 +39,7 @@  #include "llimageworker.h"  #include "llstat.h"  #include "llcurl.h" +#include "llstat.h"  #include "httprequest.h"  #include "httpoptions.h"  #include "httpheaders.h" diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 47059b0b8c..2df028de69 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -316,9 +316,13 @@ public:  	/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)  	{  		LL_WARNS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL; -		LL_WARNS("MediaAuth") << content << LL_ENDL; + +		LLSD stripped_content = content; +		stripped_content.erase("set-cookie"); +		LL_WARNS("MediaAuth") << stripped_content << LL_ENDL;  		std::string cookie = content["set-cookie"].asString(); +		LL_DEBUGS("MediaAuth") << "cookie = " << cookie << LL_ENDL;  		LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d613ac9651..93e4f4428a 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1639,6 +1639,54 @@ class LLAdvancedForceParamsToDefault : public view_listener_t  }; +////////////////////////// +//   ANIMATION SPEED    // +////////////////////////// + +// Utility function to set all AV time factors to the same global value +static void set_all_animation_time_factors(F32	time_factor) +{ +	LLMotionController::setCurrentTimeFactor(time_factor); +	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); +		iter != LLCharacter::sInstances.end(); ++iter) +	{ +		(*iter)->setAnimTimeFactor(time_factor); +	} +} + +class LLAdvancedAnimTenFaster : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		//llinfos << "LLAdvancedAnimTenFaster" << llendl; +		F32 time_factor = LLMotionController::getCurrentTimeFactor(); +		time_factor = llmin(time_factor + 0.1f, 2.f);	// Upper limit is 200% speed +		set_all_animation_time_factors(time_factor); +		return true; +	} +}; + +class LLAdvancedAnimTenSlower : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		//llinfos << "LLAdvancedAnimTenSlower" << llendl; +		F32 time_factor = LLMotionController::getCurrentTimeFactor(); +		time_factor = llmax(time_factor - 0.1f, 0.1f);	// Lower limit is at 10% of normal speed +		set_all_animation_time_factors(time_factor); +		return true; +	} +}; + +class LLAdvancedAnimResetAll : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		set_all_animation_time_factors(1.f); +		return true; +	} +}; +  //////////////////////////  // RELOAD VERTEX SHADER // @@ -3909,25 +3957,27 @@ class LLViewToggleUI : public view_listener_t  {  	bool handleEvent(const LLSD& userdata)  	{ -		LLNotification::Params params("ConfirmHideUI"); -		params.functor.function(boost::bind(&LLViewToggleUI::confirm, this, _1, _2)); -		LLSD substitutions; +		if(gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK) +		{ +			LLNotification::Params params("ConfirmHideUI"); +			params.functor.function(boost::bind(&LLViewToggleUI::confirm, this, _1, _2)); +			LLSD substitutions;  #if LL_DARWIN -		substitutions["SHORTCUT"] = "Cmd+Shift+U"; +			substitutions["SHORTCUT"] = "Cmd+Shift+U";  #else -		substitutions["SHORTCUT"] = "Ctrl+Shift+U"; +			substitutions["SHORTCUT"] = "Ctrl+Shift+U";  #endif -		params.substitutions = substitutions; -		if (gViewerWindow->getUIVisibility()) -		{ -			// hiding, so show notification -			LLNotifications::instance().add(params); -		} -		else -		{ -			LLNotifications::instance().forceResponse(params, 0); +			params.substitutions = substitutions; +			if (!gSavedSettings.getBOOL("HideUIControls")) +			{ +				// hiding, so show notification +				LLNotifications::instance().add(params); +			} +			else +			{ +				LLNotifications::instance().forceResponse(params, 0); +			}  		} -  		return true;  	} @@ -3937,8 +3987,9 @@ class LLViewToggleUI : public view_listener_t  		if (option == 0) // OK  		{ -			gViewerWindow->setUIVisibility(!gViewerWindow->getUIVisibility()); -			LLPanelStandStopFlying::getInstance()->setVisible(gViewerWindow->getUIVisibility()); +			gViewerWindow->setUIVisibility(gSavedSettings.getBOOL("HideUIControls")); +			LLPanelStandStopFlying::getInstance()->setVisible(gSavedSettings.getBOOL("HideUIControls")); +			gSavedSettings.setBOOL("HideUIControls",!gSavedSettings.getBOOL("HideUIControls"));  		}  	}  }; @@ -7506,6 +7557,7 @@ class LLToolsUseSelectionForGrid : public view_listener_t  		} func;  		LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func);  		LLSelectMgr::getInstance()->setGridMode(GRID_MODE_REF_OBJECT); +		LLFloaterTools::setGridMode((S32)GRID_MODE_REF_OBJECT);  		return true;  	}  }; @@ -8437,6 +8489,11 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedTestMale(), "Advanced.TestMale");  	view_listener_t::addMenu(new LLAdvancedTestFemale(), "Advanced.TestFemale"); +	// Advanced > Character > Animation Speed +	view_listener_t::addMenu(new LLAdvancedAnimTenFaster(), "Advanced.AnimTenFaster"); +	view_listener_t::addMenu(new LLAdvancedAnimTenSlower(), "Advanced.AnimTenSlower"); +	view_listener_t::addMenu(new LLAdvancedAnimResetAll(), "Advanced.AnimResetAll"); +  	// Advanced > Character (toplevel)  	view_listener_t::addMenu(new LLAdvancedForceParamsToDefault(), "Advanced.ForceParamsToDefault");  	view_listener_t::addMenu(new LLAdvancedReloadVertexShader(), "Advanced.ReloadVertexShader"); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 4b0e0598f6..142cb2090d 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -2026,15 +2026,15 @@ BOOL LLViewerShaderMgr::loadShadersObject()  	{  		gObjectPreviewProgram.mName = "Simple Shader";  		gObjectPreviewProgram.mFeatures.calculatesLighting = true; -		gObjectPreviewProgram.mFeatures.calculatesAtmospherics = true; +		gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false;  		gObjectPreviewProgram.mFeatures.hasGamma = true; -		gObjectPreviewProgram.mFeatures.hasAtmospherics = true; +		gObjectPreviewProgram.mFeatures.hasAtmospherics = false;  		gObjectPreviewProgram.mFeatures.hasLighting = true;  		gObjectPreviewProgram.mFeatures.mIndexedTextureChannels = 0;  		gObjectPreviewProgram.mFeatures.disableTextureIndex = true;  		gObjectPreviewProgram.mShaderFiles.clear();  		gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER_ARB)); -		gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewF.glsl", GL_FRAGMENT_SHADER_ARB));  		gObjectPreviewProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];  		success = gObjectPreviewProgram.createShader(NULL, NULL);  	} diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 765f2b3a5a..2051772d63 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -761,7 +761,16 @@ void LLPipeline::resizeScreenTexture()  		GLuint resX = gViewerWindow->getWorldViewWidthRaw();  		GLuint resY = gViewerWindow->getWorldViewHeightRaw(); -		allocateScreenBuffer(resX,resY); +		if (!allocateScreenBuffer(resX,resY)) +		{ //FAILSAFE: screen buffer allocation failed, disable deferred rendering if it's enabled +			//NOTE: if the session closes successfully after this call, deferred rendering will be  +			// disabled on future sessions +			if (LLPipeline::sRenderDeferred) +			{ +				gSavedSettings.setBOOL("RenderDeferred", FALSE); +				LLPipeline::refreshCachedSettings(); +			} +		}  	}  } @@ -6113,7 +6122,7 @@ void LLPipeline::enableLightsPreview()  	LLVector4 light_pos(dir0, 0.0f); -	LLLightState* light = gGL.getLight(0); +	LLLightState* light = gGL.getLight(1);  	light->enable();  	light->setPosition(light_pos); @@ -6125,7 +6134,7 @@ void LLPipeline::enableLightsPreview()  	light_pos = LLVector4(dir1, 0.f); -	light = gGL.getLight(1); +	light = gGL.getLight(2);  	light->enable();  	light->setPosition(light_pos);  	light->setDiffuse(diffuse1); @@ -6135,7 +6144,7 @@ void LLPipeline::enableLightsPreview()  	light->setSpotCutoff(180.f);  	light_pos = LLVector4(dir2, 0.f); -	light = gGL.getLight(2); +	light = gGL.getLight(3);  	light->enable();  	light->setPosition(light_pos);  	light->setDiffuse(diffuse2); diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml index e91f5af3d5..29720a680b 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml @@ -3,7 +3,7 @@   layout="topleft"   left="0"   mouse_opaque="false" - can_tear_off="true" + can_tear_off="false"   name="menu_inventory_add"   visible="false">              <menu diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 3fe56e3457..caa36e7302 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3186,6 +3186,40 @@                       parameter="AllowSelectAvatar" />                  </menu_item_check>              </menu> +            <menu +             create_jump_keys="true" +             label="Animation Speed" +             name="Animation Speed" +             tear_off="true"> +                <menu_item_call +                 label="All Animations 10% Faster" +                 name="All Animations 10 Faster"> +                    <menu_item_call.on_click +                     function="Advanced.AnimTenFaster" /> +                </menu_item_call> +                <menu_item_call +                 label="All Animations 10% Slower" +                 name="All Animations 10 Slower"> +                    <menu_item_call.on_click +                     function="Advanced.AnimTenSlower" /> +                </menu_item_call> +                <menu_item_call +                 label="Reset All Animation Speed" +                 name="Reset All Animation Speed"> +                    <menu_item_call.on_click +                     function="Advanced.AnimResetAll" /> +                </menu_item_call> +				<menu_item_check +				 label="Slow Motion Animations" +				 name="Slow Motion Animations"> +					<menu_item_check.on_check +					 function="CheckControl" +					 parameter="SlowMotionAnimation" /> +					<menu_item_check.on_click +					 function="ToggleControl" +					 parameter="SlowMotionAnimation" /> +				</menu_item_check> +            </menu>              <menu_item_call               label="Force Params to Default"               name="Force Params to Default"> @@ -3203,16 +3237,6 @@                   parameter="" />              </menu_item_check>              <menu_item_check -             label="Slow Motion Animations" -             name="Slow Motion Animations"> -                <menu_item_check.on_check -                 function="CheckControl" -                 parameter="SlowMotionAnimation" /> -                <menu_item_check.on_click -                 function="ToggleControl" -                 parameter="SlowMotionAnimation" /> -            </menu_item_check> -            <menu_item_check               label="Show Look At"               name="Show Look At">                  <menu_item_check.on_check diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index da906ca669..44c18c2cce 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1293,6 +1293,45 @@ Visit [_URL] for more information?    <notification     icon="alertmodal.tga" +   name="AMDOldDriver" +   type="alertmodal"> +    There is likely a newer driver for your graphics chip.  Updating graphics drivers can substantially improve performance. + +    Visit [_URL] to check for driver updates? +    <tag>confirm</tag> +    <url option="0" name="url"> +      http://support.amd.com/us/Pages/AMDSupportHub.aspx +    </url> +    <usetemplate +     ignoretext="My graphics driver is out of date" +     name="okcancelignore" +     notext="No" +     yestext="Yes"/> +    <tag>fail</tag> +  </notification> + +  <notification + icon="alertmodal.tga" + name="NVIDIAOldDriver" + type="alertmodal"> +    There is likely a newer driver for your graphics chip.  Updating graphics drivers can substantially improve performance. + +    Visit [_URL] to check for driver updates? +    <tag>confirm</tag> +    <url option="0" name="url"> +      http://www.nvidia.com/Download/index.aspx?lang=en-us +    </url> +    <usetemplate +     ignoretext="My graphics driver is out of date" +     name="okcancelignore" +     notext="No" +     yestext="Yes"/> +    <tag>fail</tag> +  </notification> + + +  <notification +   icon="alertmodal.tga"     name="UnknownGPU"     type="alertmodal">  Your system contains a graphics card that [APP_NAME] doesn't recognize. @@ -9940,5 +9979,1701 @@ Inventory creation on in-world object failed.  An internal error prevented us from properly updating your viewer.  The L$ balance or parcel holdings displayed in your viewer may not reflect your actual balance on the servers.    </notification> +  <notification +   icon="alertmodal.tga" +   name="LargePrimAgentIntersect" +   type="notify"> +   <tag>fail</tag> +Cannot create large prims that intersect other players.  Please re-try when other players have moved. +  </notification> + + +  <notification +   icon="alertmodal.tga" +   name="AvatarFrozen" +   type="notify"> +   <tag>fail</tag> +[AV_FREEZER] has frozen you. You cannot move or interact with the world. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarFrozenDuration" +   type="notify"> +   <tag>fail</tag> +[AV_FREEZER] has frozen you for [AV_FREEZE_TIME] seconds. You cannot move or interact with the world. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="YouFrozeAvatar" +   type="notify"> +   <tag>fail</tag> +Avatar frozen. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarHasUnFrozenYou" +   type="notify"> +   <tag>fail</tag> +[AV_FREEZER] has unfrozen you. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarUnFrozen" +   type="notify"> +   <tag>fail</tag> +Avatar unfrozen. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarFreezeFailure" +   type="notify"> +   <tag>fail</tag> +Freeze failed because you don't have admin permission for that parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarFreezeThaw" +   type="notify"> +   <tag>fail</tag> +Your freeze expired, go about your business. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarCantFreeze" +   type="notify"> +   <tag>fail</tag> +Sorry, can't freeze that user. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NowOwnObject" +   type="notify"> +   <tag>fail</tag> +You are now the owner of object [OBJECT_NAME] +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantRezOnLand" +   type="notify"> +   <tag>fail</tag> +Can't rez object at [OBJECT_POS] because the owner of this land does not allow it.  Use the land tool to see land ownership. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RezFailTooManyRequests" +   type="notify"> +   <tag>fail</tag> +Object can not be rezzed because there are too many requests. +  </notification> +  +  <notification +   icon="alertmodal.tga" +   name="SitFailCantMove" +   type="notify"> +   <tag>fail</tag> +You cannot sit because you cannot move at this time. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SitFailNotAllowedOnLand" +   type="notify"> +   <tag>fail</tag> +You cannot sit because you are not allowed on that land. +  </notification> +  +  <notification +   icon="alertmodal.tga" +   name="SitFailNotSameRegion" +   type="notify"> +   <tag>fail</tag> +Try moving closer.  Can't sit on object because +it is not in the same region as you. +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="NoNewObjectRegionFull" +   type="notify"> +   <tag>fail</tag> +Unable to create new object. The region is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="FailedToPlaceObject" +   type="notify"> +   <tag>fail</tag> +Failed to place object at specified location.  Please try again. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoOwnNoGardening" +   type="notify"> +   <tag>fail</tag> +You Can't create trees and grass on land you don't own. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoCopyPermsNoObject" +   type="notify"> +   <tag>fail</tag> +Copy failed because you lack permission to copy the object '[OBJ_NAME]'. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoTransPermsNoObject" +   type="notify"> +   <tag>fail</tag> +Copy failed because the object '[OBJ_NAME]' cannot be transferred to you. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AddToNavMeshNoCopy" +   type="notify"> +   <tag>fail</tag> +Copy failed because the object '[OBJ_NAME]' contributes to navmesh. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="DupeWithNoRootsSelected" +   type="notify"> +   <tag>fail</tag> +Duplicate with no root objects selected. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDupeCuzRegionIsFull" +   type="notify"> +   <tag>fail</tag> +Can't duplicate objects because the region is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDupeCuzParcelNotFound" +   type="notify"> +   <tag>fail</tag> +Can't duplicate objects - Can't find the parcel they are on. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateCuzParcelFull" +   type="notify"> +   <tag>fail</tag> +Can't create object because  +the parcel is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RezAttemptFailed" +   type="notify"> +   <tag>fail</tag> +Attempt to rez an object failed. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ToxicInvRezAttemptFailed" +   type="notify"> +   <tag>fail</tag> +Unable to create item that has caused problems on this region. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="InvItemIsBlacklisted" +   type="notify"> +   <tag>fail</tag> +That inventory item has been blacklisted. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoCanRezObjects" +   type="notify"> +   <tag>fail</tag> +You are not currently allowed to create objects. +  </notification> +  +  <notification +   icon="alertmodal.tga" +   name="LandSearchBlocked" +   type="notify"> +   <tag>fail</tag> +Land Search Blocked. +You have performed too many land searches too quickly. +Please try again in a minute. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NotEnoughResourcesToAttach" +   type="notify"> +   <tag>fail</tag> +Not enough script resources available to attach object! +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="YouDiedAndGotTPHome" +   type="notify"> +   <tag>fail</tag> +You died and have been teleported to your home location +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="EjectComingSoon" +   type="notify"> +   <tag>fail</tag> +You are no longer allowed here and have [EJECT_TIME] seconds to leave. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoEnterServerFull" +   type="notify"> +   <tag>fail</tag> +You can't enter this region because  +the server is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SaveBackToInvDisabled" +   type="notify"> +   <tag>fail</tag> +Save Back To Inventory has been disabled. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoExistNoSaveToContents" +   type="notify"> +   <tag>fail</tag> +Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed from no longer exists. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoModNoSaveToContents" +   type="notify"> +   <tag>fail</tag> +Cannot save '[OBJ_NAME]' to object contents because you do not have permission to modify the object '[DEST_NAME]'. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoSaveBackToInvDisabled" +   type="notify"> +   <tag>fail</tag> +Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoCopyNoSelCopy" +   type="notify"> +   <tag>fail</tag> +You cannot copy your selection because you do not have permission to copy the object '[OBJ_NAME]'. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoTransNoSelCopy" +   type="notify"> +   <tag>fail</tag> +You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoTransNoCopy" +   type="notify"> +   <tag>fail</tag> +You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermsNoRemoval" +   type="notify"> +   <tag>fail</tag> +Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoModNoSaveSelection" +   type="notify"> +   <tag>fail</tag> +Cannot save your selection because you do not have permission to modify the object '[OBJ_NAME]'. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoCopyNoSaveSelection" +   type="notify"> +   <tag>fail</tag> +Cannot save your selection because the object '[OBJ_NAME]' is not copyable. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoModNoTaking" +   type="notify"> +   <tag>fail</tag> +You cannot take your selection because you do not have permission to modify the object '[OBJ_NAME]'. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RezDestInternalError" +   type="notify"> +   <tag>fail</tag> +Internal Error: Unknown destination type. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="DeleteFailObjNotFound" +   type="notify"> +   <tag>fail</tag> +Delete failed because object not found +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SorryCantEjectUser" +   type="notify"> +   <tag>fail</tag> +Sorry, can't eject that user. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RegionSezNotAHome" +   type="notify"> +   <tag>fail</tag> +This region does not allow you to set your home location here. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="HomeLocationLimits" +   type="notify"> +   <tag>fail</tag> +You can only set your 'Home Location' on your land or at a mainland Infohub. +   </notification> + +  <notification +   icon="alertmodal.tga" +   name="HomePositionSet" +   type="notify"> +   <tag>fail</tag> +Home position set. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarEjected" +   type="notify"> +   <tag>fail</tag> +Avatar ejected. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AvatarEjectFailed" +   type="notify"> +   <tag>fail</tag> +Eject failed because you don't have admin permission for that parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantMoveObjectParcelFull" +   type="notify"> +   <tag>fail</tag> +Can't move object '[OBJECT_NAME]' to +[OBJ_POSITION] in region [REGION_NAME] because the parcel is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantMoveObjectParcelPerms" +   type="notify"> +   <tag>fail</tag> +Can't move object '[OBJECT_NAME]' to +[OBJ_POSITION] in region [REGION_NAME] because your objects are not allowed on this parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantMoveObjectParcelResources" +   type="notify"> +   <tag>fail</tag> +Can't move object '[OBJECT_NAME]' to +[OBJ_POSITION] in region [REGION_NAME] because there are not enough resources for this object on this parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantMoveObjectRegionVersion" +   type="notify"> +   <tag>fail</tag> +Can't move object '[OBJECT_NAME]' to +[OBJ_POSITION] in region [REGION_NAME] because the other region is running an older version which does not support receiving this object via region crossing. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantMoveObjectNavMesh" +   type="notify"> +   <tag>fail</tag> +Can't move object '[OBJECT_NAME]' to +[OBJ_POSITION] in region [REGION_NAME] because you cannot modify the navmesh across region boundaries. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantMoveObjectWTF" +   type="notify"> +   <tag>fail</tag> +Can't move object '[OBJECT_NAME]' to +[OBJ_POSITION] in region [REGION_NAME] because of an unknown reason. ([FAILURE_TYPE]) +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermModifyObject" +   type="notify"> +   <tag>fail</tag> +You don't have permission to modify that object +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysObjContributesToNav" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for an object that contributes to the navmesh. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysKeyframedObj" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for keyframed objects. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysNotEnoughLandResources" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for object -- insufficient land resources. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysCostTooGreat" +   persist="true" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS] +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="PhantomWithConcavePiece" +   type="notify"> +   <tag>fail</tag> +This object cannot have a concave piece because it is phantom and contributes to the navmesh. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UnableAddItem" +   type="notify"> +   <tag>fail</tag> +Unable to add item! +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UnableEditItem" +   type="notify"> +   <tag>fail</tag> +Unable to edit this! +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermToEdit" +   type="notify"> +   <tag>fail</tag> +Not permitted to edit this. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermToCopyInventory" +   type="notify"> +   <tag>fail</tag> +Not permitted to copy that inventory. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSaveItemDoesntExist" +   type="notify"> +   <tag>fail</tag> +Cannot save to object contents: Item no longer exists. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSaveItemAlreadyExists" +   type="notify"> +   <tag>fail</tag> +Cannot save to object contents: Item with that name already exists in inventory +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSaveModifyAttachment" +   type="notify"> +   <tag>fail</tag> +Cannot save to object contents: This would modify the attachment permissions. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermToEdit" +   type="notify"> +   <tag>fail</tag> +Not permitted to edit this! +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TooManyScripts" +   type="notify"> +   <tag>fail</tag> +Too many scripts. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UnableAddScript" +   type="notify"> +   <tag>fail</tag> +Unable to add script! +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AssetServerTimeoutObjReturn" +   type="notify"> +   <tag>fail</tag> +Asset server didn't respond in a timely fashion.  Object returned to sim. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RegionDisablePhysicsShapes" +   type="notify"> +   <tag>fail</tag> +This region does not have physics shapes enabled. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoModNavmeshAcrossRegions" +   type="notify"> +   <tag>fail</tag> +You cannot modify the navmesh across region boundaries. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermModifyObject" +   type="notify"> +   <tag>fail</tag> +You don't have permission to modify that object. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysObjContributesToNav" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for an object that contributes to the navmesh. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysKeyframedObj" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for keyframed objects. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysNotEnoughLandResources" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for object -- insufficient land resources. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantEnablePhysCostTooGreat" +   persist="true" +   type="notify"> +   <tag>fail</tag> +Can't enable physics for object with physics resource cost greater than [MAX_OBJECTS] +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoSetPhysicsPropertiesOnObjectType" +   type="notify"> +   <tag>fail</tag> +Cannot set physics properties on that object type. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoSetRootPrimWithNoShape" +   type="notify"> +   <tag>fail</tag> +Cannot set root prim to have no shape. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoRegionSupportPhysMats" +   type="notify"> +   <tag>fail</tag> +This region does not have physics materials enabled. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="OnlyRootPrimPhysMats" +   type="notify"> +   <tag>fail</tag> +Only root prims may have their physics materials adjusted. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoSupportCharacterPhysMats" +   type="notify"> +   <tag>fail</tag> +Setting physics materials on characters is not yet supported. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="InvalidPhysMatProperty" +   type="notify"> +   <tag>fail</tag> +One or more of the specified physics material properties was invalid. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermsAlterStitchingMeshObj" +   type="notify"> +   <tag>fail</tag> +You may not alter the stitching type of a mesh object. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPermsAlterShapeMeshObj" +   type="notify"> +   <tag>fail</tag> +You may not alter the shape of a mesh object +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="FullRegionCantEnter" +   type="notify"> +   <tag>fail</tag> +You can't enter this region because \nthe region is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedOwnersDiffer" +   type="notify"> +   <tag>fail</tag> +Link failed -- owners differ +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedNoModNavmeshAcrossRegions" +   type="notify"> +   <tag>fail</tag> +Link failed -- cannot modify the navmesh across region boundaries. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedNoPermToEdit" +   type="notify"> +   <tag>fail</tag> +Link failed because you do not have edit permission. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedTooManyPrims" +   type="notify"> +   <tag>fail</tag> +Link failed -- too many primitives +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedCantLinkNoCopyNoTrans" +   type="notify"> +   <tag>fail</tag> +Link failed -- cannot link no-copy with no-transfer +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedNothingLinkable" +   type="notify"> +   <tag>fail</tag> +Link failed -- nothing linkable. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedTooManyPathfindingChars" +   type="notify"> +   <tag>fail</tag> +Link failed -- too many pathfinding characters +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedInsufficientLand" +   type="notify"> +   <tag>fail</tag> +Link failed -- insufficient land resources +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LinkFailedTooMuchPhysics" +   type="notify"> +   <tag>fail</tag> +Object uses too many physics resources -- its dynamics have been disabled. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TeleportedHomeByObjectOnParcel" +   persist="true" +   type="notify"> +   <tag>fail</tag> +You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]' +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TeleportedHomeByObject" +   persist="true" +   type="notify"> +   <tag>fail</tag> +You have been teleported home by the object '[OBJECT_NAME]' +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TeleportedByAttachment" +   type="notify"> +   <tag>fail</tag> +You have been teleported by an attachment on [ITEM_ID] +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TeleportedByObjectOnParcel" +   type="notify"> +   <tag>fail</tag> +You have been teleported by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]' +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TeleportedByObjectOwnedBy" +   type="notify"> +   <tag>fail</tag> +You have been teleported by the object '[OBJECT_NAME]' owned by [OWNER_ID] +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TeleportedByObjectUnknownUser" +   type="notify"> +   <tag>fail</tag> +You have been teleported by the object '[OBJECT_NAME]' owned by an unknown user. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateObjectRegionFull" +   type="notify"> +   <tag>fail</tag> +Unable to create requested object. The region is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantAttackMultipleObjOneSpot" +   type="notify"> +   <tag>fail</tag> +You can't attach multiple objects to one spot. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateMultipleObjAtLoc" +   type="notify"> +   <tag>fail</tag> +You can't create multiple objects here. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UnableToCreateObjTimeOut" +   type="notify"> +   <tag>fail</tag> +Unable to create requested object. Object is missing from database. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UnableToCreateObjUnknown" +   type="notify"> +   <tag>fail</tag> +Unable to create requested object. The request timed out. Please try again. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UnableToCreateObjMissingFromDB" +   type="notify"> +   <tag>fail</tag> +Unable to create requested object. Please try again. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RezFailureTookTooLong" +   type="notify"> +   <tag>fail</tag> +Rez failed, requested object took too long to load. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="FailedToPlaceObjAtLoc" +   type="notify"> +   <tag>fail</tag> +Failed to place object at specified location.  Please try again. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreatePlantsOnLand" +   type="notify"> +   <tag>fail</tag> +You cannot create plants on this land. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantRestoreObjectNoWorldPos" +   type="notify"> +   <tag>fail</tag> +Cannot restore object. No world position found. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantRezObjectInvalidMeshData" +   type="notify"> +   <tag>fail</tag> +Unable to rez object because its mesh data is invalid. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantRezObjectTooManyScripts" +   type="notify"> +   <tag>fail</tag> +Unable to rez object because there are already too many scripts in this region. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateObjectNoAccess" +   type="notify"> +   <tag>fail</tag> +Your access privileges don't allow you to create objects there. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateObject" +   type="notify"> +   <tag>fail</tag> +You are not currently allowed to create objects. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="InvalidObjectParams" +   type="notify"> +   <tag>fail</tag> +Invalid object parameters +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDuplicateObjectNoAcess" +   type="notify"> +   <tag>fail</tag> +Your access privileges don't allow you to duplicate objects here. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantChangeShape" +   type="notify"> +   <tag>fail</tag> +You are not allowed to change this shape. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoAccessToClaimObjects" +   type="notify"> +   <tag>fail</tag> +Your access privileges don't allow you to claim objects here. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="DeedFailedNoPermToDeedForGroup" +   type="notify"> +   <tag>fail</tag> +Deed failed because you do not have permission to deed objects for your group. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="NoPrivsToBuyObject" +   type="notify"> +   <tag>fail</tag> +Your access privileges don't allow you to buy objects here. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantAttachObjectAvatarSittingOnIt" +   type="notify"> +   <tag>fail</tag> +Cannot attach object because an avatar is sitting on it. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="WhyAreYouTryingToWearShrubbery" +   type="notify"> +   <tag>fail</tag> +Trees and grasses cannot be worn as attachments. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantAttachGroupOwnedObjs" +   type="notify"> +   <tag>fail</tag> +Cannot attach group-owned objects. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantAttachObjectsNotOwned" +   type="notify"> +   <tag>fail</tag> +Cannot attach objects that you don't own. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantAttachNavmeshObjects" +   type="notify"> +   <tag>fail</tag> +Cannot attach objects that contribute to navmesh. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantAttachObjectNoMovePermissions" +   type="notify"> +   <tag>fail</tag> +Cannot attach object because you do not have permission to move it. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantAttachNotEnoughScriptResources" +   type="notify"> +   <tag>fail</tag> +Not enough script resources available to attach object! +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDropItemTrialUser" +   type="notify"> +   <tag>fail</tag> +You can't drop objects here; try the Free Trial area. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDropMeshAttachment" +   type="notify"> +   <tag>fail</tag> +You can't drop mesh attachments. Detach to inventory and then rez in world. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDropAttachmentNoPermission" +   type="notify"> +   <tag>fail</tag> +Failed to drop attachment: you don't have permission to drop there. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDropAttachmentInsufficientLandResources" +   type="notify"> +   <tag>fail</tag> +Failed to drop attachment: insufficient available land resource. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDropAttachmentInsufficientResources" +   type="notify"> +   <tag>fail</tag> +Failed to drop attachments: insufficient available resources. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDropObjectFullParcel" +   type="notify"> +   <tag>fail</tag> +Cannot drop object here.  Parcel is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantTouchObjectBannedFromParcel" +   type="notify"> +   <tag>fail</tag> +Can't touch/grab this object because you are banned from the land parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="PlzNarrowDeleteParams" +   type="notify"> +   <tag>fail</tag> +Please narrow your delete parameters. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UnableToUploadAsset" +   type="notify"> +   <tag>fail</tag> +Unable to upload asset. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantTeleportCouldNotFindUser" +   type="notify"> +   <tag>fail</tag> +Could not find user to teleport home +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="GodlikeRequestFailed" +   type="notify"> +   <tag>fail</tag> +godlike request failed +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="GenericRequestFailed" +   type="notify"> +   <tag>fail</tag> +generic request failed +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantUploadPostcard" +   type="notify"> +   <tag>fail</tag> +Unable to upload postcard.  Try again later. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantFetchInventoryForGroupNotice" +   type="notify"> +   <tag>fail</tag> +Unable to fetch inventory details for the group notice. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSendGroupNoticeNotPermitted" +   type="notify"> +   <tag>fail</tag> +Unable to send group notice -- not permitted. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSendGroupNoticeCantConstructInventory" +   type="notify"> +   <tag>fail</tag> +Unable to send group notice -- could not construct inventory. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantParceInventoryInNotice" +   type="notify"> +   <tag>fail</tag> +Unable to parse inventory in notice. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TerrainUploadFailed" +   type="notify"> +   <tag>fail</tag> +Terrain upload failed. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TerrainFileWritten" +   type="notify"> +   <tag>fail</tag> +Terrain file written. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TerrainFileWrittenStartingDownload" +   type="notify"> +   <tag>fail</tag> +Terrain file written, starting download... +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TerrainBaked" +   type="notify"> +   <tag>fail</tag> +Terrain baked. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="TenObjectsDisabledPlzRefresh" +   type="notify"> +   <tag>fail</tag> +Only the first 10 selected objects have been disabled. Refresh and make additional selections if required. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UpdateViewerBuyParcel" +   type="notify"> +   <tag>fail</tag> +You need to update your viewer to buy this parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LandBuyAccessBlocked" +   type="notify"> +   <tag>fail</tag> +You can't buy this land due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantBuyParcelNotForSale" +   type="notify"> +   <tag>fail</tag> +Unable to buy, this parcel is not for sale. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantBuySalePriceOrLandAreaChanged" +   type="notify"> +   <tag>fail</tag> +Unable to buy, the sale price or land area has changed. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantBuyParcelNotAuthorized" +   type="notify"> +   <tag>fail</tag> +You are not the authorized buyer for this parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantBuyParcelAwaitingPurchaseAuth" +   type="notify"> +   <tag>fail</tag> +You cannot purchase this parcel because it is already awaiting purchase aut +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantBuildOverflowParcel" +   type="notify"> +   <tag>fail</tag> +You cannot build objects here because doing so would overflow the parcel. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SelectedMultipleOwnedLand" +   type="notify"> +   <tag>fail</tag> +You selected land with different owners. Please select a smaller area and try again. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantJoinTooFewLeasedParcels" +   type="notify"> +   <tag>fail</tag> +Not enough leased parcels in selection to join. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDivideLandMultipleParcelsSelected" +   type="notify"> +   <tag>fail</tag> +Can't divide land.\nThere is more than one parcel selected.\nTry selecting a smaller piece of land. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDivideLandCantFindParcel" +   type="notify"> +   <tag>fail</tag> +Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug... +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDivideLandWholeParcelSelected" +   type="notify"> +   <tag>fail</tag> +Can't divide land. Whole parcel is selected.\nTry selecting a smaller piece of land. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LandHasBeenDivided" +   type="notify"> +   <tag>fail</tag> +Land has been divided. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="PassPurchased" +   type="notify"> +   <tag>fail</tag> +You purchased a pass. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RegionDisallowsClassifieds" +   type="notify"> +   <tag>fail</tag> +Region does not allow classified advertisements. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="LandPassExpireSoon" +   type="notify"> +   <tag>fail</tag> +Your pass to this land is about to expire. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSitNoSuitableSurface" +   type="notify"> +   <tag>fail</tag> +There is no suitable surface to sit on, try another spot. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSitNoRoom" +   type="notify"> +   <tag>fail</tag> +No room to sit here, try another spot. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AutopilotCanceled" +   type="notify"> +   <tag>fail</tag> +Autopilot canceled +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ClaimObjectFailedNoPermission" +   type="notify"> +   <tag>fail</tag> +Claim object failed because you don't have permission +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ClaimObjectFailedNoMoney" +   type="notify"> +   <tag>fail</tag> +Claim object failed because you don't have enough L$. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDeedGroupLand" +   type="notify"> +   <tag>fail</tag> +Cannot deed group-owned land. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="BuyObjectFailedNoMoney" +   type="notify"> +   <tag>fail</tag> +Buy object failed because you don't have enough L$. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="BuyInventoryFailedNoMoney" +   type="notify"> +   <tag>fail</tag> +Buy inventory failed because you do not have enough L$ +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="BuyPassFailedNoMoney" +   type="notify"> +   <tag>fail</tag> +You don't have enough L$ to buy a pass to this land. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantBuyPassTryAgain" +   type="notify"> +   <tag>fail</tag> +Unable to buy pass right now.  Try again later. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateObjectParcelFull" +   type="notify"> +   <tag>fail</tag> +Can't create object because \nthe parcel is full. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="FailedPlacingObject" +   type="notify"> +   <tag>fail</tag> +Failed to place object at specified location.  Please try again. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateLandmarkForEvent" +   type="notify"> +   <tag>fail</tag> +Unable to create landmark for event. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="GodBeatsFreeze" +   type="notify"> +   <tag>fail</tag> +Your godlike powers break the freeze! +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SpecialPowersRequestFailedLogged" +   type="notify"> +   <tag>fail</tag> +Request for special powers failed. This request has been logged. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ExpireExplanation" +   type="notify"> +   <tag>fail</tag> +The system is currently unable to process your request. The request timed out. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="DieExplanation" +   type="notify"> +   <tag>fail</tag> +The system is unable to process your request. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="AddPrimitiveFailure" +   type="notify"> +   <tag>fail</tag> +Insufficient funds to create primitve. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="RezObjectFailure" +   type="notify"> +   <tag>fail</tag> +Insufficient funds to create object. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ResetHomePositionNotLegal" +   type="notify"> +   <tag>fail</tag> +Reset Home position since Home wasn't legal. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantInviteRegionFull" +   type="notify"> +   <tag>fail</tag> +You cannot currently invite anyone to your location because the region is full. Try again later. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantSetHomeAtRegion" +   type="notify"> +   <tag>fail</tag> +This region does not allow you to set your home location here. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="ListValidHomeLocations" +   type="notify"> +   <tag>fail</tag> +You can only set your 'Home Location' on your land or at a mainland Infohub. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="SetHomePosition" +   type="notify"> +   <tag>fail</tag> +Home position set. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDerezInventoryError" +   type="notify"> +   <tag>fail</tag> +Cannot derez object due to inventory fault. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateRequestedInv" +   type="notify"> +   <tag>fail</tag> +Cannot create requested inventory. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateRequestedInvFolder" +   type="notify"> +   <tag>fail</tag> +Cannot create requested inventory folder. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateInventory" +   type="notify"> +   <tag>fail</tag> +Cannot create that inventory. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateLandmark" +   type="notify"> +   <tag>fail</tag> +Cannot create landmark. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantCreateOutfit" +   type="notify"> +   <tag>fail</tag> +Cannot create outfit right now. Try again in a minute. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="InventoryNotForSale" +   type="notify"> +   <tag>fail</tag> +Inventory is not for sale. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantFindInvItem" +   type="notify"> +   <tag>fail</tag> +Unable to find inventory item. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantFindObject" +   type="notify"> +   <tag>fail</tag> +Unable to find object. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantTransfterMoneyRegionDisabled" +   type="notify"> +   <tag>fail</tag> +Money transfers to objects are currently disabled in this region. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantPayNoAgent" +   type="notify"> +   <tag>fail</tag> +Could not figure out who to pay. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="CantDonateToPublicObjects" +   type="notify"> +   <tag>fail</tag> +You cannot give L$ to public objects. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="InventoryCreationInWorldObjectFailed" +   type="notify"> +   <tag>fail</tag> +Inventory creation on in-world object failed. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="UserBalanceOrLandUsageError" +   type="notify"> +   <tag>fail</tag> +An internal error prevented us from properly updating your viewer.  The L$ balance or parcel holdings displayed in your viewer may not reflect your actual balance on the servers. +  </notification> +  </notifications> | 
