diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2013-01-24 14:28:09 -0500 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2013-01-24 14:28:09 -0500 |
commit | 3b369770f7a81ca76b81087d2716c5f29211f7c2 (patch) | |
tree | 70ad9096da75c663590a546fa9f12dcfe7b11373 /indra | |
parent | 22db60ed0dfd606ab8f8d49141446442a4a72a48 (diff) | |
parent | cebde0a32b4a8163010d9cbf5e6b3036865ed943 (diff) |
Automated merge with ssh://bitbucket.org/lindenlab/viewer-development
Diffstat (limited to 'indra')
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> |