summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2013-01-24 14:28:09 -0500
committerNat Goodspeed <nat@lindenlab.com>2013-01-24 14:28:09 -0500
commit3b369770f7a81ca76b81087d2716c5f29211f7c2 (patch)
tree70ad9096da75c663590a546fa9f12dcfe7b11373 /indra
parent22db60ed0dfd606ab8f8d49141446442a4a72a48 (diff)
parentcebde0a32b4a8163010d9cbf5e6b3036865ed943 (diff)
Automated merge with ssh://bitbucket.org/lindenlab/viewer-development
Diffstat (limited to 'indra')
-rw-r--r--indra/cmake/NVAPI.cmake16
-rw-r--r--indra/llcharacter/llbvhconsts.h2
-rw-r--r--indra/llcharacter/llmotioncontroller.cpp3
-rw-r--r--indra/llcharacter/llmotioncontroller.h6
-rw-r--r--indra/llmessage/llurlrequest.cpp7
-rw-r--r--indra/llmessage/llxfermanager.cpp13
-rw-r--r--indra/llwindow/llwindow.cpp7
-rw-r--r--indra/llwindow/llwindow.h2
-rw-r--r--indra/llwindow/llwindowsdl.cpp17
-rw-r--r--indra/media_plugins/webkit/windows_volume_catcher.cpp52
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/app_settings/settings.xml12
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/previewF.glsl41
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/previewV.glsl57
-rw-r--r--indra/newview/llagentcamera.cpp6
-rw-r--r--indra/newview/llappviewer.cpp17
-rw-r--r--indra/newview/llappviewerwin32.cpp123
-rw-r--r--indra/newview/lldrawable.cpp6
-rw-r--r--indra/newview/llfeaturemanager.cpp1
-rw-r--r--indra/newview/llfeaturemanager.h5
-rw-r--r--indra/newview/llfloaterbuycontents.cpp22
-rw-r--r--indra/newview/llfloaterimagepreview.cpp4
-rwxr-xr-xindra/newview/llfloatermodelpreview.cpp135
-rw-r--r--indra/newview/llfloatertools.cpp11
-rw-r--r--indra/newview/llfloatertools.h2
-rw-r--r--indra/newview/llfloaterurlentry.cpp3
-rw-r--r--indra/newview/llmanip.cpp9
-rwxr-xr-xindra/newview/llmeshrepository.cpp126
-rw-r--r--indra/newview/llmeshrepository.h8
-rw-r--r--indra/newview/llpanelpermissions.cpp2
-rw-r--r--indra/newview/llselectmgr.cpp304
-rw-r--r--indra/newview/llselectmgr.h8
-rwxr-xr-xindra/newview/lltexturefetch.cpp1
-rw-r--r--indra/newview/lltexturefetch.h1
-rw-r--r--indra/newview/llviewerkeyboard.cpp5
-rw-r--r--indra/newview/llviewermedia.cpp6
-rw-r--r--indra/newview/llviewermenu.cpp91
-rw-r--r--indra/newview/llviewerparcelmgr.cpp3
-rw-r--r--indra/newview/llviewershadermgr.cpp13
-rw-r--r--indra/newview/pipeline.cpp17
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml44
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml1735
43 files changed, 2632 insertions, 315 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/llmessage/llxfermanager.cpp b/indra/llmessage/llxfermanager.cpp
index b9cddc8e45..00b9d81611 100644
--- a/indra/llmessage/llxfermanager.cpp
+++ b/indra/llmessage/llxfermanager.cpp
@@ -886,8 +886,17 @@ void LLXferManager::processFileRequest (LLMessageSystem *mesgsys, void ** /*user
return;
}
-
- std::string expanded_filename = gDirUtilp->getExpandedFilename( local_path, local_filename );
+ // If we want to use a special path (e.g. LL_PATH_CACHE), we want to make sure we create the
+ // proper expanded filename.
+ std::string expanded_filename;
+ if (local_path != LL_PATH_NONE)
+ {
+ expanded_filename = gDirUtilp->getExpandedFilename( local_path, local_filename );
+ }
+ else
+ {
+ expanded_filename = local_filename;
+ }
llinfos << "starting file transfer: " << expanded_filename << " to " << mesgsys->getSender() << llendl;
BOOL delete_local_on_completion = FALSE;
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/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/webkit/windows_volume_catcher.cpp
index 5fb84756ee..957704da47 100644
--- a/indra/media_plugins/webkit/windows_volume_catcher.cpp
+++ b/indra/media_plugins/webkit/windows_volume_catcher.cpp
@@ -48,18 +48,37 @@ private:
set_volume_func_t mSetVolumeFunc;
set_mute_func_t mSetMuteFunc;
+ // tests if running on Vista, 7, 8 + once in CTOR
+ bool isWindowsVistaOrHigher();
+
F32 mVolume;
F32 mPan;
+ bool mSystemIsVistaOrHigher;
};
+
+bool VolumeCatcherImpl::isWindowsVistaOrHigher()
+{
+ OSVERSIONINFO osvi;
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&osvi);
+ return osvi.dwMajorVersion >= 6;
+}
+
VolumeCatcherImpl::VolumeCatcherImpl()
-: mVolume(1.0f), // default volume is max
- mPan(0.f) // default pan is centered
+: mVolume(1.0f), // default volume is max
+ mPan(0.f) // default pan is centered
{
- HMODULE handle = ::LoadLibrary(L"winmm.dll");
- if(handle)
+ mSystemIsVistaOrHigher = isWindowsVistaOrHigher();
+
+ if ( mSystemIsVistaOrHigher )
{
- mSetVolumeFunc = (set_volume_func_t)::GetProcAddress(handle, "setPluginVolume");
- mSetMuteFunc = (set_mute_func_t)::GetProcAddress(handle, "setPluginMute");
+ HMODULE handle = ::LoadLibrary(L"winmm.dll");
+ if(handle)
+ {
+ mSetVolumeFunc = (set_volume_func_t)::GetProcAddress(handle, "setPluginVolume");
+ mSetMuteFunc = (set_mute_func_t)::GetProcAddress(handle, "setPluginMute");
+ }
}
}
@@ -67,18 +86,29 @@ VolumeCatcherImpl::~VolumeCatcherImpl()
{
}
-
void VolumeCatcherImpl::setVolume(F32 volume)
{
mVolume = volume;
- if (mSetMuteFunc)
+ if ( mSystemIsVistaOrHigher )
{
- mSetMuteFunc(volume == 0.f);
+ // set both left/right to same volume
+ // TODO: use pan value to set independently
+ DWORD left_channel = (DWORD)(mVolume * 65535.0f);
+ DWORD right_channel = (DWORD)(mVolume * 65535.0f);
+ DWORD hw_volume = left_channel << 16 | right_channel;
+ ::waveOutSetVolume(NULL, hw_volume);
}
- if (mSetVolumeFunc)
+ else
{
- mSetVolumeFunc(mVolume);
+ if (mSetMuteFunc)
+ {
+ mSetMuteFunc(volume == 0.f);
+ }
+ if (mSetVolumeFunc)
+ {
+ mSetVolumeFunc(mVolume);
+ }
}
}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 22960a2d0d..e93d73ad0e 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..7f3f84398b 100644
--- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl
@@ -32,12 +32,51 @@ ATTRIBUTE vec3 position;
ATTRIBUTE vec3 normal;
ATTRIBUTE vec2 texcoord0;
+uniform vec4 color;
+
VARYING vec4 vertex_color;
VARYING vec2 vary_texcoord0;
+uniform vec4 light_position[8];
+uniform vec3 light_direction[8];
+uniform vec3 light_attenuation[8];
+uniform vec3 light_diffuse[8];
+
+//===================================================================================================
+//declare these here explicitly to separate them from atmospheric lighting elsewhere to work around
+//drivers that are picky about functions being declared but not defined even if they aren't called
+float calcDirectionalLight(vec3 n, vec3 l)
+{
+ float a = max(dot(n,l),0.0);
+ return a;
+}
+
+
+float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight)
+{
+ //get light vector
+ vec3 lv = lp.xyz-v;
+
+ //get distance
+ float d = length(lv);
+
+ //normalize light vector
+ lv *= 1.0/d;
+
+ //distance attenuation
+ float da = clamp(1.0/(la * d), 0.0, 1.0);
+
+ // spotlight coefficient.
+ float spot = max(dot(-ln, lv), is_pointlight);
+ da *= spot*spot; // GL_SPOT_EXPONENT=2
+
+ //angular attenuation
+ da *= calcDirectionalLight(n, lv);
+
+ return da;
+}
+//====================================================================================================
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
-void calcAtmospherics(vec3 inPositionEye);
void main()
{
@@ -45,13 +84,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..647c3355ca 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -547,6 +547,12 @@ F32 LLDrawable::updateXform(BOOL undamped)
}
}
}
+ else
+ {
+ dist_squared = dist_vec_squared(old_pos, target_pos);
+ dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f;
+ dist_squared += dist_vec_squared(old_scale, target_scale);
+ }
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/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index f5d3341c66..1aa9fd8a45 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -160,11 +160,6 @@ void agent_push_backward( EKeystate s )
camera_move_backward(s);
return;
}
- else if (gAgentAvatarp->isSitting())
- {
- gAgentCamera.changeCameraToThirdPerson();
- return;
- }
agent_push_forwardbackward(s, -1, LLAgent::DOUBLETAP_BACKWARD);
}
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/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 7e524df3f6..33f632b25d 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1540,7 +1540,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
// Actually extract the data.
if (parcel)
{
- if (parcel->getLocalID() != INVALID_PARCEL_ID
+ if (sequence_id == SELECTED_PARCEL_SEQ_ID
+ && parcel->getLocalID() != INVALID_PARCEL_ID
&& parcel->getLocalID() != local_id)
{
// The parcel has a valid parcel ID but it doesn't match the parcel
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 4b0e0598f6..ba9818946c 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -2025,18 +2025,19 @@ BOOL LLViewerShaderMgr::loadShadersObject()
if (success)
{
gObjectPreviewProgram.mName = "Simple Shader";
- gObjectPreviewProgram.mFeatures.calculatesLighting = true;
- gObjectPreviewProgram.mFeatures.calculatesAtmospherics = true;
- gObjectPreviewProgram.mFeatures.hasGamma = true;
- gObjectPreviewProgram.mFeatures.hasAtmospherics = true;
- gObjectPreviewProgram.mFeatures.hasLighting = true;
+ gObjectPreviewProgram.mFeatures.calculatesLighting = false;
+ gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false;
+ gObjectPreviewProgram.mFeatures.hasGamma = false;
+ gObjectPreviewProgram.mFeatures.hasAtmospherics = false;
+ gObjectPreviewProgram.mFeatures.hasLighting = false;
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);
+ gObjectPreviewProgram.mFeatures.hasLighting = true;
}
if (success)
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>